class Patrimonio::AvaliacaoDoBem < ApplicationRecord
  include TradutorConcern

  has_paper_trail

  attr_default :status, :confirmado

  belongs_to :bem_patrimonial, class_name: 'Patrimonio::BemPatrimonial'
  belongs_to :comissao, class_name: 'Patrimonio::Comissao'

  has_one :movimentacoes_financeiras_dos_bens, class_name: 'Patrimonio::MovimentacaoFinanceiraDoBem'
  has_one :vida_util_do_bem, class_name: 'Patrimonio::VidaUtilDoBem'

  validates_presence_of :bem_patrimonial_id, :comissao_id, :data_da_avaliacao, :tipo_de_avaliacao, :valor_diferenca, :observacao, :vida_util
  validates :data_da_avaliacao, date: true

  before_save :define_vida_util_e_valor

  after_create :gerar_movimentacao_financeira_do_tombamento
  # after_create :define_valor_residual
  after_create :gerar_vida_util
  after_destroy :remove_dependentes

  enum status: {
    solicitado: 1,
    confirmado: 2
  }

  enum tipo_de_avaliacao: {
    avaliacao: 1,
    reavaliacao: 2,
    avaliacao_aumentativa: 3,
    avaliacao_diminutiva: 4,
    desvalorizacao: 5
  }

  def avaliacao_aumentativa
    reavaliacao? || avaliacao_aumentativa?
  end

  def define_valor_residual
    self.update_column(:valor_residual, ((self.valor_final * 0.10) rescue 0))
  end

  def define_vida_util_e_valor
    self.vida_util = (self.vida_util / 12).to_d if self.vida_util.present?
    self.valor_diferenca = -self.valor_diferenca.abs if !self.avaliacao_aumentativa && self.valor_diferenca.present?
  end

  def gerar_movimentacao_financeira_do_tombamento
    movimentacao_financeira_do_tombamento = Patrimonio::MovimentacaoFinanceiraDoBem.create!(
      bem_patrimonial_id: self.bem_patrimonial.id,
      data_da_movimentacao: self.data_da_avaliacao,
      origem_id: self.id,
      origem_type: self.class.name,
      valor_inicial: self.valor_inicial,
      valor_da_operacao: self.valor_diferenca,
      valor_final: self.valor_final
      )
  end

  def gerar_vida_util
    vida_util_do_bem = Patrimonio::VidaUtilDoBem.create!(
      bem_patrimonial_id: self.bem_patrimonial.id,
      data_da_operacao: self.data_da_avaliacao,
      vida_util: self.vida_util,
      origem_da_alteracao: 3,
      avaliacao_do_bem_id: self.id
    )
  end

  def remove_dependentes
    ActiveRecord::Base.connection.execute("DELETE FROM patrimonio_movimentacoes_financeiras_dos_bens WHERE origem_id = #{self.id} AND origem_type = 'Patrimonio::AvaliacaoDoBem'; DELETE FROM patrimonio_vidas_uteis_dos_bens WHERE avaliacao_do_bem_id = #{self.id}")
  end

  def tipo_de_label_status
    if self.solicitado?
      'info'
    else
      'success'
    end
  end
end
