class Admin::TagsController < OrbitBackendController
  include OrbitTag::Merging

  open_for_user only: [:index]
  open_for_manager
   
  def index
    @tags = @module_app.module_tags
    @module_apps = ModuleApp.where(has_tag: true)
  end

  def new
    @tag = ModuleTag.new
    render layout: false
  end
  
  def edit
    @tag = ModuleTag.find(params[:id])
    render layout: false
  end

  def create
    @tag = @module_app.module_tags.build(params[:module_tag].merge(is_default: true))
    if @tag.save
      redirect_to admin_tags_url
    else
      @tag = Tag.new(params[:module_tag])
      flash.now[:error] = t('create.error.tag')
      render :action => "new"
    end
  end

  def update
    @tag = ModuleTag.find(params[:id])
    if @tag.update_attributes(params[:module_tag])
      redirect_to action: :index, :status => 303
    else
      flash.now[:error] = t('update.error.tag')
      render :action => "edit"
    end
  end

  def add_to_default
    module_tags = ModuleTag.find(params[:ids].split(',')) rescue nil
    if module_tags
      module_tags.each do |module_tag|
        module_tag.update_attribute(:is_default, true)
        clone_tag_to_default(module_tag)
      end
    end
    redirect_to admin_tags_url
  end

  def delete_tags
    tags = ModuleTag.find(params[:ids].split(',')) rescue nil
    if tags
      tags.each(&:destroy)
    end
    redirect_to admin_tags_url
  end

  def merge
    module_tags = ModuleTag.find(params[:ids])
    tags = module_tags.map{|t| t.tag}
    taggings, is_default = tags.inject([[], []]) do |values, tag|
      values[0] << tag.taggings
      values[1] << tag.is_default
      values
    end
    taggings.flatten!
    is_default.uniq!
    name = params[:name]
    module_app_ids = module_tags.map{|t| t.module_app_id}.flatten.uniq
    if is_default.size == 1 && is_default[0] == true
      merge_default_tags(name, module_tags)
    elsif is_default.include?(true) || module_app_ids.count > 1
      merge_with_default_tags(name, module_tags)
    else
      merge_tags(name, taggings, module_app_ids[0])
      module_tags.each(&:destroy)
    end
    redirect_to admin_tags_url
  end
  
  protected

  def setup_vars
    @app_title ||= controller_path.split('/')[1].singularize
    @module_app ||= ModuleApp.first(conditions: {:key => @app_title} )
    raise ModuleAppError, 'Can not find ModuleApp' if @module_app.nil?
  end
end
