class Employee::AddressBook::ContactsController < Employee::Controller
  def index
    render_success :ok, json: contacts.decorate.map { |contact| contact_props(contact) }
  end

  def show
    render_success :ok, json: contact_props(contact.decorate)
  end

  def create
    contact = contacts.build(contact_params)
    contact.author = current_user

    if contact.save
      render_success :ok, json: contact_props(contact.decorate)
    else
      render_error :unprocessable_entity, errors: contact
    end
  end

  def update
    if contact.update(contact_params)
      render_success :ok, json: contact_props(contact.decorate)
    else
      render_error :unprocessable_entity, errors: contact
    end
  end

  private
    def contacts
      current_school.contacts.includes(:title, :company, :country, :categories)
    end

    def contact
      @contact ||= contacts.find_by(id: params[:id])
    end

    def contact_params
      params.permit(
        :first_name,
        :middle_name,
        :last_name,
        :suffix,
        :nickname,
        :date_of_birth,
        :company_id,
        :title_id,
        :address,
        :address_ext,
        :city,
        :state,
        :zip,
        :country_id,
        :external_id,
        :home_phone,
        :cell_phone,
        :work_phone,
        :work_phone_2,
        :fax_phone,
        :email,
        :email2,
        :email3,
        :gender,
        :marital_status,
        :private
      )
    end

    def contact_props(contact)
      {}.tap do |props|
        props[:id] = contact.id
        props[:full_name] = contact.full_name(:reverse)
        props[:title_name] = contact.title_name
        props[:title_id] = contact.title_id
        props[:first_name] = contact.first_name
        props[:middle_name] = contact.middle_name
        props[:last_name] = contact.last_name
        props[:suffix] = contact.suffix
        props[:nickname] = contact.nickname
        props[:date_of_birth] = contact.date_of_birth
        props[:company_name] = contact.company_name
        props[:company_id] = contact.company_id
        props[:external_id] = contact.external_id
        props[:address] = contact.address
        props[:address_ext] = contact.address_ext
        props[:city] = contact.city
        props[:state] = contact.state
        props[:zip] = contact.zip
        props[:country_name] = contact.country_name
        props[:country_id] = contact.country_id
        props[:home_phone] = contact.home_phone
        props[:cell_phone] = contact.cell_phone
        props[:work_phone] = contact.work_phone
        props[:work_phone_2] = contact.work_phone_2
        props[:fax_phone] = contact.fax_phone
        props[:email] = contact.email
        props[:email2] = contact.email2
        props[:email3] = contact.email3
        props[:gender] = contact.gender
        props[:marital_status] = contact.unspecified? ? nil : contact.marital_status
        props[:description] = contact.description
        props[:category_ids] = contact.category_ids
        props[:author_id] = contact.author_id? ? contact.author_id : nil
        props[:private] = contact.private
        return props if action_name.to_sym == :index

        props[:primary_email] = contact.primary_email_address
        props[:primary_suppression] = contact.primary_email_address&.suppression
      end
    end
end
