class PagePartsController < ApplicationController
  before_action :get_key
	def new
		@part = part_model.new
    @part.sub_parts.build
    @part_number = params[:part]
    @page_id = params[:page_id]
    page = Page.find(@page_id)
    @child_page_count = (page.root? ? 0 : page.child_page.count) rescue 0
		@modules = ModuleApp.widget_enabled
    @modules = @modules.concat(OrbitWidget.all)
    @no_orbit_bar = @no_side_bar = true
    @select_number = 0
    @html_class = "page-parts"
    render :layout => "structure"
	end

  def edit
    page = Page.find(params[:page_id])
    parts = $mobile.blank? ? page.page_parts : page.mobile_page_parts
    @part = parts.where(:part_id => params[:id]).first
    @part.sub_parts.build
    @page_id = params[:page_id]
    page = Page.find(@page_id)
    @child_page_count = (page.root? ? 0 : page.child_page.count) rescue 0
    @part_number = params[:id]
    @select_number = @part.sub_parts.count
    @modules = ModuleApp.widget_enabled
    @modules = @modules.concat(OrbitWidget.all)
    @no_orbit_bar = @no_side_bar = true
    @html_class = "page-parts"
    render :layout => "structure"
  end

  def edit_sub_part
    @part = part_model.find(params[:part_id])
    @subpart = SubPart.find(params[:sub_part_id])
    @select_number = @part.sub_parts.index{|sp| sp.id.to_s == @subpart.id.to_s}
    @child_page_count = 0
    @kind = @subpart.kind
    @modules = ModuleApp.widget_enabled
    @modules = @modules.concat(OrbitWidget.all)
    if @kind == "module_widget"
      module_name = @subpart.module
      @widget_types = get_widget_files(module_name)
     
      app = ModuleApp.find_by_key(module_name) rescue nil
      app = OrbitWidget.find_by_key(module_name) if app.nil?
      @categories = app.categories.enabled rescue []
      @tags = app.tags rescue []
      @widget_methods = app.widget_methods
      @widget_settings = app.widget_settings
      @data_count = nil
      if !@widget_settings.blank?
        @data_count = @widget_settings["data_count"] rescue nil
        if !@widget_settings['override_category_with'].nil?
          @custom = @widget_settings['override_category_with'].classify.constantize.all
          @multiselect = @widget_settings['multiselect'] rescue true
          @display_field = @widget_settings['display_field']
        end
      elsif @widget_settings.nil?
        @widget_settings = {}
        @widget_settings['override_category_with'] = nil
      end
    end
    @no_orbit_bar = @no_side_bar = true
    @html_class = "page-parts"
    render :layout => "structure"
  end

  def update_sub_part
    subpart = SubPart.find(params[:id])
    p = part_params["sub_parts_attributes"]
    keys = p.keys
    final_params = {}
    keys.each do |key|
      p["#{key}"].each do |k,value|
        final_params["#{k}"] = value
      end
    end
    if final_params["kind"] == "none"
      page_part = subpart.page_part
      subpart.destroy
      if page_part.sub_parts.count == 0
        page_part.destroy
      end
    else
      if final_params['categories'].nil?
        final_params['categories'] = []
      end
      if final_params['tags'].nil?
        final_params['tags'] = []
      end
      subpart.update_attributes(final_params)
    end
    render :json => {"success"=>true}.to_json
  end

  def getwidgets
    module_name = params[:module]
    part = part_model.where(:part_id => params[:part_id], :page_id => params[:page_id]).first
    @select_number = part.sub_parts.count rescue 0
    @widget_types = get_widget_files(module_name)

    module_name = module_name.downcase.singularize
    app = ModuleApp.find_by_key(module_name) rescue nil
    app = OrbitWidget.find_by_key(module_name) if app.nil?
    @categories = app.categories.enabled rescue []
    @tags = app.tags rescue []
    @widget_methods = app.widget_methods
    @widget_settings = app.widget_settings
    @data_count = nil
    if !@widget_settings.blank?
      @data_count = @widget_settings["data_count"] rescue nil
      if !@widget_settings['override_category_with'].nil?
        @custom = @widget_settings['override_category_with'].classify.constantize.all
        @multiselect = @widget_settings['multiselect'] rescue true
        @display_field = @widget_settings['display_field']
      end
    elsif @widget_settings.nil?
      @widget_settings = {}
      @widget_settings['override_category_with'] = nil
    end
    render :layout => false
  end

  def info 
    page = Page.find(params[:page_id])
    parts = OrbitHelper.is_mobile_view ? page.mobile_page_parts : page.page_parts
    data = []
    parts.each do |part|
      partid = "data-pp=" + part.part_id.to_s
      subparts = part.sub_parts.desc(:created_at)
      subpart = []
      subparts.each do |p|
        subpart << {"module" => p.module, "widget" => p.widget_type, "id" => p.id.to_s, "kind" => p.kind}
      end
      data << {"name" => partid, "subparts" => subpart, "id" => part.id.to_s}
    end
    render :json => {"parts" => data}.to_json
  end

  def create
    @part = part_model.new(part_params)
    @part.save!
    apply_to_sub_pages(part_params,nil,nil) if !params[:apply_to_subpage].nil? && !@part.page_id.nil?
    render :json => {"success"=>true}.to_json

  end

  def update
    @part = part_model.find(params[:part_id])
    @part.update_attributes(part_params)
    apply_to_sub_pages(part_params,params[:part_id],params[:page_id]) if !params[:apply_to_subpage].nil? && !@part.page_id.nil?
    render :json => {"success"=>true}.to_json
  end

  private

  def apply_to_sub_pages(part_params,part_id=nil,page_id=nil)
    page_id = part_params[:page_id] if page_id.nil?
    page = Page.find(page_id) rescue nil
    if !page.nil?
      child_pages = page.child_page
      child_pages.each do |cp|
        temp = part_params
        if part_id.nil?
          partid = part_params[:part_id]
        else
          partid = part_model.find(part_id).part_id 
        end
         page_part = cp.page_parts.where(:part_id => partid).first rescue nil
        if page_part.nil?
          temp[:page_id] = cp.id.to_s
          part = part_model.new(temp)
          part.save!
        else
          page_part.update_attributes(temp)
        end
      end
    end
  end

  def get_widget_files(module_name)
    temp = []
    f = File.join("#{Rails.root}/app/templates/#{@key}/modules/#{module_name.downcase}/info.json")
    if File.exists?f
      info = File.read(f)
      hash = JSON.parse(info) rescue {}
      widgets = hash["widgets"] || []
      widgets.each do |w|
        w["thumbnail"] = "/assets/#{module_name.downcase}/thumbs/#{w["thumbnail"]}"
        temp << w
      end
    end
    if temp.empty?
      Dir.glob("#{Rails.root}/app/templates/#{@key}/modules/#{module_name.downcase}/*").each do |w|
        next if File.ftype(w).eql?("directory")
        w = File.basename(w, ".*") 
        w = File.basename(w, ".*")
        temp << w.gsub("_","") if w[0,1] == "_"
      end
    end
    if temp.empty?
      f = File.join("#{Rails.root}/app/templates/#{@key}/widgets/#{module_name.downcase}/info.json")
      if File.exists?f
        info = File.read(f)
        hash = JSON.parse(info) rescue {}
        widgets = hash["widgets"] || []
        widgets.each do |w|
          w["thumbnail"] = "/assets/#{module_name.downcase}/thumbs/#{w["thumbnail"]}"
          temp << w
        end
      end
    end
    if temp.empty?
       Dir.glob("#{Rails.root}/app/templates/#{@key}/widgets/#{module_name.downcase}/*").each do |w|
        next if File.ftype(w).eql?("directory")
        w = File.basename(w, ".*") 
        w = File.basename(w, ".*")
        temp << w.gsub("_","") if w[0,1] == "_"
      end
    end
    temp
  end

  def part_params
    params.require(:page_part).permit!
  end

  def part_model
    $mobile.blank? ? "page_part".classify.constantize : "mobile_page_part".classify.constantize
  end

end