app/controllers/wco/galleries_controller.rb



class Wco::GalleriesController < Wco::ApplicationController

  before_action :set_gallery, only: %w| destroy edit j_show show update update_ordering |

  # Alphabetized! : )

  def create
    params[:gallery][:tag_ids]&.delete ''

    # params[:gallery][:shared_profiles] ||= []
    # params[:gallery][:shared_profiles].delete('')
    # params[:gallery][:shared_profiles] = Wco::Profile.find params[:gallery][:shared_profiles]

    @gallery = Wco::Gallery.new params[:gallery].permit!
    # @gallery.user_profile = @current_profile
    authorize! :create, @gallery

    if @gallery.save
      # Wco::GalleriesMailer.shared_galleries( params[:gallery][:shared_profiles], @gallery ).deliver
      flash[:notice] = 'Success'
      redirect_to edit_gallery_path(@gallery)
    else
      puts! @gallery.errors.messages
      flash[:alert] = "Cannot create the gallery: #{@gallery.errors.full_messages.join(', ')}"
      render :action => 'new'
    end
  end

  def destroy
    authorize! :destroy, @gallery
    @gallery.delete
    flash[:notice] = 'Marked the gallery deleted.'
    redirect_to( request.referrer || galleries_path )
  end

  def edit
    authorize! :edit, @gallery
  end

  def index
    authorize! :index, Wco::Gallery
    @page_title = 'Galleries'
    @galleries = Wco::Gallery.all.order_by( :created_at => :desc )

    @tags = Wco::Tag.all.order_by( slug: :asc )

    if params[:q]
      q = URI.decode(params[:q])
      @galleries = @galleries.where({ :name => /#{q}/i })
    end

    @galleries = @galleries.page( params[:galleries_page] ).per( current_profile.per_page )
    render '_index'
  end

  def j_show
    authorize! :show, @gallery
    respond_to do |format|
      format.json do
        jjj = {}
        jjj[:photos] = @gallery.photos.map do |ph|
          { :thumbnail_url => ph.photo.url( :thumb ),
          :delete_type => 'DELETE',
          :delete_url => photo_path(ph) }
        end
        render :json => jjj
      end
    end
  end

  def new
    @gallery = Wco::Gallery.new
    @page_title = 'New Gallery'
    authorize! :new, @gallery
  end

  def shared_with_me
    authorize! :index, Wco::Gallery
    @page_title = 'Galleries Shared With Me'
    @galleries = @current_profile.shared_galleries(
      ).order_by( :created_at => :desc
      ).page( params[:shared_galleries_page] ).per( 10 )
    render params[:render_type]
  end

  def show
    authorize! :show, @gallery
    @photos = @gallery.photos.order_by( ordering: :asc )
    @deleted_photos = @gallery.photos.deleted.order_by( ordering: :asc )
  end

  def update_ordering
    authorize! :update, @gallery
    flags = []
    params[:ids].each_with_index do |id, idx|
      flags.push Wco::Photo.find( id ).update( weight: idx )
    end
    flash_notice "Ordering photos: #{flags}"
    redirect_to request.referrer
  end

  def update
    params[:gallery][:tag_ids]&.delete ''
    authorize! :update, @gallery

    old_shared_profile_ids = @gallery.shared_profiles.map(&:id)
    if params[:gallery][:shared_profiles].present?
      params[:gallery][:shared_profiles].delete('')
    end
    params[:gallery][:shared_profile_ids] = params[:gallery][:shared_profiles]
    params[:gallery].delete :shared_profiles

    flag = @gallery.update_attributes( params[:gallery].permit! )
    if flag
      if params[:gallery][:shared_profile_ids].present?
        new_shared_profiles = Wco::Profile.find( params[:gallery][:shared_profile_ids]
          ).select { |p| !old_shared_profile_ids.include?( p.id ) }
        Wco::GalleriesMailer.shared_galleries( new_shared_profiles, @gallery ).deliver
      end
      flash[:notice] = 'Success.'
      redirect_to edit_gallery_path(@gallery)
    else
      puts! @gallery.errors.messages, 'cannot save gallery'
      flash[:alert] = 'No Luck. ' + @gallery.errors.messages.to_s
      render :action => :edit
    end
  end

  def update_many
    authorize! :update, Wco::Gallery
    galleries = Wco::Gallery.where( :id.in => params[:gallery_ids] )

    tags = Wco::Tag.where( :id.in => params[:tag_ids] )

    if params[:remove]
      galleries.each do |gallery|
        tags.each do |tag|
          gallery.tags.delete tag
        end
        gallery.save
      end
    else
      galleries.each do |gallery|
        gallery.tags.push tags
        gallery.save
      end
    end

    flash_notice 'Unknown outcome, no exception raised.'
    redirect_to request.referrer
  end


  ##
  ## private
  ##
  private

  def set_gallery
    begin
      @gallery = Wco::Gallery.unscoped.find_by :slug => params[:id]
    rescue
      @gallery = Wco::Gallery.unscoped.find params[:id]
    end
    @page_title = "#{@gallery.name} Gallery"
    @page_description = @gallery.subhead
  end

  def set_lists
    @galleries_list = Wco::Gallery.list
    @tags_list = Wco::Tag.list
  end

end