# encoding: utf-8

module Gluttonberg
  module Admin
    module Membership
      class MembersController < Gluttonberg::Admin::Membership::BaseController
        before_filter :find_member, :only => [:delete, :edit, :update, :destroy]
        before_filter :authorize_user , :except => [:edit , :update]
        record_history :@member
        include Gluttonberg::Public

        def index
          @members = Member.order(get_order).includes(:groups)
          unless params[:query].blank?
            query = clean_public_query(params[:query])
            command = Gluttonberg.like_or_ilike
            @members = @members.where(["first_name #{command} :query OR last_name #{command} :query OR email #{command} :query OR bio #{command} :query " , :query => "%#{query}%" ])
          end
          @members = @members.paginate(:page => params[:page] , :per_page => Gluttonberg::Setting.get_setting("number_of_per_page_items") )
        end

        def group
          @group = Group.where(:id => params[:id]).first
          @members = @group.members.order(get_order).includes(:groups)
          unless params[:query].blank?
            query = clean_public_query(params[:query])
            command = Gluttonberg.like_or_ilike
            @members = @members.where(["first_name #{command} :query OR last_name #{command} :query OR email #{command} :query OR bio #{command} :query " , :query => "%#{query}%" ])
          end
          @members = @members.paginate(:page => params[:page] , :per_page => Gluttonberg::Setting.get_setting("number_of_per_page_items") )
          render :template => "/gluttonberg/admin/membership/members/index"
        end

        def new
          @member = Member.new
          @member.group_ids = [Group.default_group.id] unless Group.default_group.blank?
          @groups = Gluttonberg::Group.all
        end

        def create
          password_hash = Gluttonberg::Member.generate_password_hash

          @member = Member.new(params[:gluttonberg_member].merge(password_hash))
          @member.assign_groups(params[:gluttonberg_member][:group_ids])
          @member.profile_confirmed = true

          if @member.save
            flash[:notice] = "Member has been registered, A welcome email has been sent."
            MemberNotifier.welcome(@member.id).deliver
            redirect_to admin_membership_members_path
          else
            render :action => :new
          end
        end

        def edit
          @groups = Gluttonberg::Group.all
        end

        def update
          mark_image_delete
          @member.assign_groups(params[:gluttonberg_member][:group_ids])
          @member.assign_attributes(params[:gluttonberg_member])
          if @member.save
            flash[:notice] = "Member account updated!"
            redirect_to  admin_membership_members_path
          else
            flash[:notice] = "Failed to save account changes!"
            render :action => :edit
          end
        end

        def delete
          display_delete_confirmation(
            :title      => "Delete “#{@member.email}” member?",
            :url        => admin_membership_member_path(@member),
            :return_url => admin_membership_members_path
          )
        end

        def destroy
          generic_destroy(@member, {
            :name => "member",
            :success_path => admin_membership_members_path,
            :failure_path => admin_membership_members_path
          })
        end

        def export
          csv_data = Member.exportCSV
          send_data csv_data, :type => 'text/csv' , :disposition => 'attachment' , :filename => "All members at #{Time.now.strftime('%Y-%m-%d')}.csv"
        end

        # form for uploading csv for members
        def new_bulk
        end

        # import csv and show report for successfully, failed, updated members
        def create_bulk
          if params[:csv].blank?
            flash[:error] = "Please provide a valid csv file."
            redirect_to :action => new_bulk
          else
            @successfull , @failed , @updated  = Member.importCSV(params[:csv][:file].tempfile.path , params[:invite] , params[:csv][:group_ids])
            if @successfull.kind_of? String
              flash[:error] = @successfull
              redirect_to :action => new_bulk
            end
          end
        end

        def welcome
           MemberNotifier.welcome( params[:id] ).deliver
           flash[:notice] = "Welcome email is successfully sent to the member."
           redirect_to admin_membership_members_path
        end

       private
          def find_member
            @member = Member.where(:id => params[:id]).first
            raise ActiveRecord::RecordNotFound  if @member.blank?
          end

          def authorize_user
            authorize! :manage, Member
          end

          def mark_image_delete
            if params[:gluttonberg_member] && params[:gluttonberg_member]["image_delete"] == "1"
              params[:gluttonberg_member][:image] = nil
            end
          end

      end
    end
  end
end