module Listing

  MAPPINGS = {
                    'AccountBalance' => {fields: [:id, [:user, :name], [:user, :last_name], :amount_cents, :withdrawable, :created_at, :updated_at] },
                    'User' => {fields: [:id, :name, :email, :activation_state, :type, :admin, :rate_in_cents, :response_time, :searchable, :last_name, :phone, :credits_booked, :level, :exp_title, :is_registration_completed, :location, :experience, :summary, :auth_token, :university_id, :skills_count, :courses_count]},
                    'Attachment' => {fields: [:id, :resource_id, :resource_type, :attachment_file_name, :attachment_content_type, :attachment_file_size, :attachment_updated_at, :created_at, :updated_at]},
                    'Authentication' => {fields: [:id, [:user, :name],  [:user, :last_name], :provider, :uid, :created_at, :updated_at, :email, :auth]},
                    'Availability' => {fields:  [:id, [:user, :name], [:user, :last_name],:created_at, :updated_at, :all_day, :start_time_hr, :start_time_min, :end_time_hr, :end_time_min, :day]},
                    'Award' => {fields: [:id, [:user, :name], [:user, :last_name],:issuer, :name, :created_at, :updated_at, :date_received, :description]},
                    'BankAccount' => {fields: [:id, [:user, :name], [:user, :last_name],:name_on_account, :routing_number, :account_number, :account_type, :uri, :active, :created_at, :updated_at]},
                    'ChatActivity' => {fields: [:id, [:user, :name], [:user, :last_name], [:chat_conversation, :grouped], :minimized, :created_at, :updated_at]},
                    'ChatConversation' => {fields: [:id, :grouped, :messages_count, :created_at, :updated_at, :resource_id, :resource_type]},
                    'ChatMember' => {fields:  [:id, [:user, :name], [:user, :last_name], [:chat_conversation, :grouped], :logged_out_at, :created_at, :updated_at]},
                    'Comment' =>{fields: [:id, [:user, :name], [:user, :last_name], :body, :created_at, :updated_at, :commentable_id, :commentable_type, :subject, :parent_id, :lft, :rgt, :comments_count, :deleted_at]},
                    'Notification' => {fields: [:id, :trackable_id, :trackable_type, :owner_id, :owner_type, :key, :parameters, :recipient_id, :recipient_type, :created_at, :updated_at, :read, :type, [:group, :name], :comments_count, :response]},
                    'Payment' => {fields: [:id, :amount, :created_at, :updated_at, :status, :payment_for_id, :payment_for_type, [:user, :name], [:user, :last_name], :user_type, :uri, :_type, :transaction_id, :description, :balanced_transaction]},
                    'Course' => {fields: [:id, [:subject, :name], :name, :number, :description, :created_at, :updated_at, :mini_description]},
                    'RequestLog' => {fields: [:id, [:user, :name], [:user, :last_name], :controller, :action, :parameters, :ip_address, :created_at, :url]},
                   'Tutor' => {fields: [:id, :name, :email, :activation_state, :created_at, :updated_at,:type, :admin,:rate_in_cents, :availability_defaults,  :billed_length, :searchable, :last_name,:points, :streak, :level, :exp_title, :minimum_level, :balanced_api_id,:is_featured, :is_registration_completed, :is_manually_deactivated, :billing_address_1, :billing_address_2, :billing_city, :billing_state, :billing_zipcode, :shipping_address_1, :shipping_address_2, :shipping_city, :shipping_state, :shipping_zipcode,    :location, :experience, :summary, :awards, :skills, :industry, :headline, :onboard_step, :pending_chat_with, :cached_notification_count, :cached_message_count,:auth_token, :level_changed, :skills_count, :courses_count]},
                   'UserCourse' => {fields: ["id", [:user, :name], [:user, :last_name], [:course, :name], :created_at, :updated_at]},
                    'Transaction' => {fields: [:id, [:from_user, :name], [:to_user, :name], :created_at, :updated_at, :description, :payable_amount, :charged, :paid]},
                    'SubjectsTutor' => {fields:  [:subject_id, [:subject, :name], [:tutor,:name]] },
                    'AccountBalanceHistory' => {fields: [:id, [:account_balance, :id], :resource_id , :resource_type, :account_type,:amount,:credit,:created_at, :updated_at]},
                    'BankTransfer' => {fields: [:id , :transfer_id, :stripe_id, :status, :bank_account,:amount_cents, :description, :university_id, :created_at, :updated_at]},
                    'Charge' => {fields: [:id, :user_id, :resource_id, :resource_type, :stripe_id,:status, :card_number, :amount_cents,:created_at,:updated_at]},
                    'CreditCard' => {fields: [:id, [:user,:name], :name, :number, :stripe_id, :active, :created_at, :updated_at]},
                    'GroupMembership' =>{fields: [:id, [:group, :name], [:user,:name], :email,:status, :created_at, :updated_at]},
                    'Invite' => {fields: [:id, :registered, [:inviter,:name], [:invitee,:name],:created_at, :updated_at, :invitee_email, :tutoring_session_reward, :invite_token,:accepted_at]},
                    'Invoice' =>{fields:  [:id, :tutor_id, [:user,:name], :invoiceable_id,:created_at,:updated_at,:paid, :email_notifications,:last_notification,:manually_billed,:payable_amount,:description,:invoiceable_type,:charged]}
                                      }

  def self.model_names
    [
      'AccountBalance',
      'AccountBalanceHistory',
      'Attachment',
      'Authentication',
      'Availability',
      'Award',
      'BankAccount',
      'BankTransfer',
      'Category',
      'Charge',
      'ChatActivity',
      'ChatConversation',
      'ChatMember',
      'Comment',
      'Configuration',
      'Course',
      'CreditCard',
      'Education',
      'Event',
      'Group',
      'GroupMembership',
      'Invite',
      'Invoice',
      'Payment',
      'RequestLog',
      'Subject',
      'SubjectsTutor',
      'Subscriber',
      'Syllabus',
      'Task',
      'Tutor',
      'Transaction',
      'User',
      'UserCourse'
    ]
  end

  def self.fields_for(model)
    if Listing::MAPPINGS[model.name] and Listing::MAPPINGS[model.name][:fields]
        Listing::MAPPINGS[model.name][:fields]
    else
      model.column_names.select { |h| !model.column_names.include? h['university_id'] }
    end
  end

  def self.field_type(model, column_name)
    if column_name.is_a? Array
      associated_model_name = model.reflect_on_all_associations(:belongs_to).find {|a| a.name.to_s == column_name.first.to_s}.class_name
      associated_model_name.constantize.column_types[column_name.last.to_s].type
    else
       model.column_types[column_name.to_s].type
    end
  end
end
