class EmployeeAddress < Address
  audited associated_with: :employee

  enum code: { billing: 0, employers: 1, employment: 2, mailing: 3, other_home: 4, physical: 5 }

  attr_accessor :skip_sync

  belongs_to :employee, foreign_key: :associated_id, inverse_of: :addresses

  after_save :sync_legacy_addresses, unless: :skip_sync

  before_destroy :remove_legacy_addresses

  validates :code, uniqueness: { scope: :associated_id }

  private
    def sync_legacy_addresses
      return unless employers? || physical?

      fields = [:street, :street_ext, :city, :state, :zip]
      employee_fields = if employers?
        [:address, :address_ext, :city, :state, :zip]
      elsif physical?
        [:home_address, :home_address_ext, :home_city, :home_state, :home_zip]
      end

      employee_fields.each_with_index do |field, index|
        employee[field] = self[fields[index]]
      end

      employee.save!
    end

    def remove_legacy_addresses
      case code.to_sym
      when :employers
        employee.update(
          address: nil,
          address_ext: nil,
          city: nil,
          state: nil,
          zip: nil
        )
      when :physical
        employee.update(
          home_address: nil,
          home_address_ext: nil,
          home_city: nil,
          home_state: nil,
          home_zip: nil
        )
      end
    end
end
