class MembersController < ApplicationController
  def index
    page_roles = OrbitHelper.page_categories
    page_role_status = OrbitHelper.page_role_status
    fields_to_show = [
                        {"key"=>"name", "type"=>"profile","sort_order"=>2,"link_to_show"=>true},
                        {"key"=>"discipline", "type"=>"role", "max_length"=>12},
                        {"key"=>"email", "type"=>"profile"},
                        {"key"=>"office_tel", "type"=>"profile"}
                     ]

    if OrbitHelper.member_sort_position
      sort = "data['list_order']"
    else
      sort = fields_to_show
                .collect.with_index{|field,idx| {'sort_order'=>field['sort_order'], 'index'=>idx}}
                .select{|field|!field['sort_order'].blank?}
                .sort_by{|field|field['sort_order']}
                .collect.with_index{|field| "data['profile_data'][#{field['index']}]['sort_value'] rescue 0"}

      sort = '[('+sort.join('),(')+')]'
    end
    if page_roles.include?("all")
      roles = Role.all.collect do |role|
        { "title" => role.title, "id" => role.id }
      end
    else
      page_role_status.each do |status_id|
        page_roles << RoleStatus.find(status_id).role.id.to_s
      end

      roles = Role.find(page_roles.uniq).collect do |role|
        { "title" => role.title, "id" => role.id, "status" => RoleStatus.where(:role_id=>role, :_id.in=>page_role_status).to_a }
      end
    end

    role_list = []
    roles.each do |role|
      attribute_field = AttributeField.where(:key => 'job_title', :role_id => role['id']).first
      role_fields_to_show = [{"id"=> attribute_field.id.to_s, "key"=>"job_title", "type"=>"role","sort_order"=>1}] + fields_to_show if !attribute_field.blank?
      status_list = []
      if !role['status'].blank?
        role['status'].each do |status|
          member_profiles = get_members_by_status(status, sort, role_fields_to_show)
          status_list << { "status-title" => status.title, "members" => member_profiles } if !member_profiles.blank?
        end
      else
        # Members with status
        role_status = RoleStatus.order_by(:id=>"asc").where(:role_id=>role['id'])
        role_status_ids = role_status.collect{|status| status.id.to_s}

        role_status.each do |status|
          member_profiles = get_members_by_status(status, sort, role_fields_to_show)
          next if member_profiles.blank?
          status_list << { "status-title" => status.title, "members" => member_profiles }
        end

        # Members without status
        member_profiles = []
        MemberProfile.not_in(:role_status_ids.in=>role_status_ids).where(:role_ids.in=>[role['id']]).collect do |profile|
          member_profiles << get_member_data(profile, fields_to_show)
        end
        member_profiles = member_profiles.sort_by{|data| eval(sort)} rescue member_profiles
        status_list << { "status-title" => role['title'], "members" => member_profiles } if !member_profiles.blank?
      end
      role_list << {  "role-title" => role['title'], "status-list" => status_list }
    end
    {
      "roles" => role_list,
      "extras" => {
        "widget-title"=>t(:member_)
      }
    }
  end

  def get_members_by_status(status, sort, fields_to_show)
    member_profiles = []

    status.member_profiles.each do |member|
      member_profiles<<get_member_data(member, fields_to_show)
    end

    return member_profiles.sort_by{|data| eval(sort)} rescue member_profiles
  end

  def get_member_data(member, fields_to_show)
    image = member.avatar.present? ? member.avatar.thumb.url : ActionController::Base.helpers.asset_path('member-pic.png')
    {
      'profile_data'=>member_data(member, fields_to_show), 
      'list_order' => member.position,
      'name' => member.name,
      'image'=>image, 
      "link_to_show" => OrbitHelper.url_to_show(member.to_param)
    }
  end

  def show
    params = OrbitHelper.params
    member = MemberProfile.find_by(uid: params[:uid])

    profile_data = []

    #role status
    member.roles.where(:disabled => false).asc("_id").collect do |role|
      role_status = member.role_statuses.where(role_id: role.id).map{|t|t.title.to_s}.join(',') rescue ''
      profile_data = profile_data.push({"key"=>"role_status", "title"=>"", "value"=> role_status, "title_class"=>"member-data-title-role-status", "value_class"=>"member-data-value-role-status"}) if !role_status.blank?
      attribute_field = role.attribute_fields.where(:key => 'job_title').first
        profile_data = profile_data + member_data(member, [{"id"=> attribute_field.id.to_s, "key"=> attribute_field.key, "type"=>"role"}]) if !attribute_field.blank? and !attribute_field.to_show.blank?
    end

    fields_to_show = [
                        {"key"=>"name", "type"=>"profile"},
                        {"key"=>"office_tel", "type"=>"profile"},
                        {"key"=>"email", "type"=>"profile"}
                     ]
    profile_data = profile_data + member_data(member, fields_to_show)

    profile_fields_to_show = []

    # member info
    infos = MemberInfo.order('created_at DESC')
    infos.each do |info|
      info.member_profile_fields.each do |member_profile_field|
        profile_fields_to_show << {"id"=> member_profile_field.id.to_s, "key"=> member_profile_field.key, "type"=>"custom"} if !member_profile_field.to_show.blank?
      end
    end
    profile_data = profile_data + member_data(member, profile_fields_to_show)

    # member role
    role_fields_to_show = []
    member.roles.where(:disabled => false).asc("_id").collect do |role| 
      role.attribute_fields.where(:key.ne => 'job_title').asc("_id").each do |attribute_field|
        role_fields_to_show << {"id"=> attribute_field.id.to_s, "key"=> attribute_field.key, "type"=>"role"} if !attribute_field.to_show.blank?
      end
    end
    profile_data = profile_data + member_data(member, role_fields_to_show)

    # member plugin
    plugins = OrbitApp::Plugin::Registration.all rescue nil
    plugin_list = plugins.collect.with_index do |plugin, idx|
      intro = PersonalPluginIntro.find_by(member_profile_id: member.id, _type: "#{plugin.app_name}Intro") rescue nil
      if !intro.blank?
        if !intro.complete_list.blank?
          plugin_data = plugin.app_name.constantize.where(member_profile_id: member) rescue nil
          pd = plugin_data.collect do |p|
            slug_title = ["JournalPaper","WritingConference"].include?(plugin.app_name) ? p.create_link : p.slug_title
            {
              "data_title" => slug_title,
              "link_to_show" => OrbitHelper.url_to_plugin_show(p.to_param,plugin.module_app_name.underscore)
            }
          end
        end

        if !intro.brief_intro.blank?
          pdi = []
          pdi << {"data_intro_title" => intro.text.html_safe}
        end

        if intro.complete_list.blank?
          complete_display = "hide"
        end

        if intro.brief_intro.blank?
          brief_display = "hide"
        end
      end

      {
        "plugin_data" => pd,
        "plugin_data_intro" => pdi,
        "complete_display" => complete_display,
        "brief_display" => brief_display,
        "plugin_name" => plugin.module_app_name.underscore,
        "plugin_title" => t('module_name.'+plugin.module_app_name.underscore),
        "plugin_class" => idx==0 ? "active" : ""
      }     
    end 

    plugin_list = plugin_list.reject{|plugin| plugin['plugin_data'].blank? and plugin['plugin_data_intro'].blank?}
    {
      "plugins" => plugin_list,
      "profile_data" => profile_data,
      "data" => {
        "image" => member.avatar.present? ? member.avatar.thumb.url : ActionController::Base.helpers.asset_path('member-pic.png'),
        "name" => member.name
      }
    }
  end

  def member_data(member, fields_to_show)
    profile_data = []
    fields_to_show.each do |field| 
      # debugger
      case field['type']
      when 'profile'
        field_data = member.get_attribute_data(field) rescue {}
      when 'custom'
        if !field['id'].blank?
          field_data = member.member_profile_field_values.find_by(:member_profile_field_id=>field['id'],:key=>field['key']).get_field_value rescue {}
        else
          field_data = member.member_profile_field_values.find_by(:key=>field['key']).get_field_value rescue {}
        end
      when 'role'
        if !field['id'].blank?
          field_data = member.attribute_values.find_by(:attribute_field_id=>field['id'],:key=>field['key']).get_field_value rescue {}
        else
          field_data = member.attribute_values.find_by(:key=>field['key']).get_field_value rescue {}
        end
      end
      next if field_data.blank? or field_data['value'].blank?
      
      if field['sort_order']
        field_data['sort_value'] = field_data['val'].blank? ? field_data['value'] : field_data['val']
        field_data['sort_value'] = (field_data['sort_value'].is_i? ? field_data['sort_value'].to_i : field_data['sort_value']  rescue field_data['sort_value'])
      end

      if field['link_to_show']
        field_data['value'] = "<a href='#{OrbitHelper.url_to_show(member.to_param)}'>#{field_data['value']}</a>"          
      end

      if field['max_length']
        field_data['value'] = (field_data['value'].length > field['max_length']) ? field_data['value'][0..field['max_length']]+'...' : field_data['value']
      end

      field_data['title_class'] = "member-data-title-"+field['key'].underscore.gsub('_','-')
      field_data['value_class'] = "member-data-value-"+field['key'].underscore.gsub('_','-')

      profile_data.push(field_data) 
    end
    return profile_data
  end
end