class Contabilidade::SubContaPcasp < ApplicationRecord
  has_paper_trail

  belongs_to :orcamento, class_name: '::Orcamento'
  belongs_to :centro_de_custo, class_name: "Controladoria::CentroDeCusto"
  has_many :movimentacoes_do_plano_de_contas, class_name: "Contabilidade::MovimentacaoDoPlanoDeContas", dependent: :restrict_with_exception

  validate :verifica_se_existe_movimentos_na_subconta_apos_inativacao
  validates_presence_of :topico_da_conta, :codigo, :descricao, :orcamento_id
  validates_presence_of :titulo, if: Proc.new { self.divida_ativa? }
  #validates_presence_of :centro_de_custo_id, if: Proc.new { self.almoxarifado? }
  
  before_validation :preenche_codigo_da_sub_conta, if: Proc.new {!self.codigo.present?}
  #before_validation :preenche_descricao_quando_almoxarifado, if: Proc.new { self.almoxarifado? }
  before_validation :preenche_orcamento

  enum topico_da_conta: {
    divida_ativa: 1,
    almoxarifado: 2,
    precatorio: 3,
    provisoes: 4,
    imobilizado: 5,
    rpps: 6,
    operacao_de_credito: 7,
    investimentos: 8,
    obrigacoes: 9,
    abertura: 999
  }

  enum titulo: {
		tributaria: 1,
		nao_tributaria: 2
	}


  def codigo_formatado
    "#{self.topico_da_conta_before_type_cast}.#{self.codigo}"
  end

  ransacker :codigo_formatado do
    Arel.sql("CONCAT(topico_da_conta, codigo)")
  end

  def codigo_e_descricao
    "#{self.topico_da_conta_before_type_cast}.#{self.codigo} - #{self.descricao}"
  end

  #BOOLEANS

  def inativo?
    !self.data_de_inativacao.nil?
  end

  def data_de_inativacao_inferior_a_data_dos_movimentos(data_de_inativacao)
    self.movimentacoes_do_plano_de_contas.where("data_de_lancamento >= ?", data_de_inativacao).any?
  end

  def preenche_codigo_da_sub_conta
    ultima_sub_conta_do_topico = Contabilidade::SubContaPcasp.where(topico_da_conta: self.topico_da_conta, orcamento_id: contexto_atual&.id).order('codigo::int DESC').first

    if ultima_sub_conta_do_topico.present?
      codigo_novo = ultima_sub_conta_do_topico.codigo.to_i + 1
    else
      codigo_novo = 1
    end

    self.codigo = codigo_novo.to_s.rjust(3, '0')
  end

  def preenche_descricao_quando_almoxarifado
    self.descricao = self.centro_de_custo.descricao_e_mae_principal
  end

  def preenche_orcamento
    self.orcamento_id = contexto_atual.id
  end

  def verifica_se_existe_movimentos_na_subconta_apos_inativacao
    if data_de_inativacao_inferior_a_data_dos_movimentos(self.data_de_inativacao)
      errors.add(:data_de_inativacao, "A data de inativação não pode ser inferior a data dos movimentos")
    end
  end

  def sub_conta_do_contexto_atual(orcamento_atual)
    if orcamento_atual.exercicio == self.orcamento.exercicio
      self
    else
      orcamento_atual.sub_contas_pcasp.where(topico_da_conta: self.topico_da_conta, codigo: self.codigo).first
    end
  end
end
