class BulkUpload < ApplicationRecord
  enum log_type: { lettings: "lettings", sales: "sales" }

  belongs_to :user

  has_many :bulk_upload_errors, dependent: :destroy

  has_many :lettings_logs
  has_many :sales_logs

  after_initialize :generate_identifier, unless: :identifier

  def completed?
    incomplete_logs = logs.where.not(status: "completed")
    !incomplete_logs.exists?
  end

  def year_combo
    "#{year}/#{year - 2000 + 1}"
  end

  def end_year
    year + 1
  end

  def logs
    if lettings?
      lettings_logs
    else
      sales_logs
    end
  end

  def form
    @form ||= if lettings?
                FormHandler.instance.lettings_form_for_start_year(year)
              else
                FormHandler.instance.sales_form_for_start_year(year)
              end
  end

  def general_needs?
    needstype == 1
  end

  def supported_housing?
    needstype == 2
  end

  def prefix_namespace
    type_class = case log_type
                 when "lettings"
                   "Lettings"
                 when "sales"
                   "Sales"
                 else
                   raise "unknown log type"
                 end

    year_class = case year
                 when 2022
                   "Year2022"
                 when 2023
                   "Year2023"
                 else
                   raise "unknown year"
                 end

    "BulkUpload::#{type_class}::#{year_class}".constantize
  end

  def unpend
    logs.find_each do |log|
      log.skip_update_status = true
      log.status = log.status_cache
      log.save!
    end
  end

  def unpend_and_confirm_soft_validations
    logs.find_each do |log|
      log.retirement_value_check = 0

      if log.lettings?
        log.pregnancy_value_check = 0
        log.major_repairs_date_value_check = 0
        log.void_date_value_check = 0
        log.rent_value_check = 0
        log.net_income_value_check = 0
        log.carehome_charges_value_check = 0
      elsif log.sales?
        log.mortgage_value_check = 0
        log.shared_ownership_deposit_value_check = 0
        log.value_value_check = 0
        log.savings_value_check = 0
        log.income1_value_check = 0
        log.deposit_value_check = 0
        log.wheel_value_check = 0
        log.extrabor_value_check = 0
        log.grant_value_check = 0
        log.staircase_bought_value_check = 0
        log.deposit_and_mortgage_value_check = 0
        log.old_persons_shared_ownership_value_check = 0
        log.income2_value_check = 0
        log.monthly_charges_value_check = 0
        log.student_not_child_value_check = 0
        log.discounted_sale_value_check = 0
        log.buyer_livein_value_check = 0
        log.percentage_discount_value_check = 0
      end
      log.save!
    end
  end

  def logs_with_errors_count
    bulk_upload_errors.distinct.count("row")
  end

private

  def generate_identifier
    self.identifier ||= SecureRandom.uuid
  end
end