class Contabilidade::SaldoMensalDaContaPorInformacao < ApplicationRecord
  #has_paper_trail

  belongs_to :orcamento, class_name: "::Orcamento"
  belongs_to :conta, class_name: "Contabilidade::Conta"

  before_create :setar_codigo_da_conta

  validates_presence_of :conta_id, :mes_referencia, :orcamento_id, :tipo_de_saldo, :natureza_do_saldo, :valor

  enum tipo_de_saldo: { 
    saldo_inicial: 1, 
    saldo_final: 2 
  }

  enum natureza_do_saldo: { 
    debito: 1, 
    credito: 2 
  }

  enum mes_referencia: {
    janeiro: 1,
    fevereiro: 2,
    marco: 3,
    abril: 4,
    maio: 5,
    junho: 6,
    julho: 7,
    agosto: 8,
    setembro: 9,
    outubro: 10,
    novembro: 11,
    dezembro: 12,
    encerramento: 13
  }

  def setar_codigo_da_conta
    self.codigo_da_conta = self.conta.try(:codigo)
  end

  def self.calcular(orcamento_id, mes_referencia, consulta_somatorio, consulta_reducao = "", tipo_de_saldo = 2)
    query = Contabilidade::SaldoMensalDaContaPorInformacao.where(orcamento_id: orcamento_id, mes_referencia: mes_referencia)
    if tipo_de_saldo == 0
      total_inicial = query.where(consulta_somatorio).where(tipo_de_saldo: 1).sum(:valor)
      total_final = query.where(consulta_somatorio).where(tipo_de_saldo: 2).sum(:valor)
      total_somatorio = total_final - total_inicial
    elsif tipo_de_saldo == 3
      total_inicial = query.where(consulta_reducao).where(tipo_de_saldo: 2).sum(:valor)
      total_final = query.where(consulta_somatorio).where(tipo_de_saldo: 2).sum(:valor)
      total_somatorio = total_final - total_inicial
    elsif tipo_de_saldo == 5
      total_somatorio_1 = query.where(consulta_somatorio).where(tipo_de_saldo: 2, natureza_do_saldo: 2).sum(:valor)
      total_somatorio_2 = query.where(consulta_reducao).where(tipo_de_saldo: 2, natureza_do_saldo: 1).sum(:valor)

      if total_somatorio_2 >= total_somatorio_1
        total_somatorio = total_somatorio_2 - total_somatorio_1
      else
        total_somatorio = total_somatorio_1 - total_somatorio_2
      end
    elsif tipo_de_saldo == 6
      total_inicial = query.where(consulta_somatorio).where(tipo_de_saldo: 1).sum(:valor)
      total_final = query.where(consulta_somatorio).where(tipo_de_saldo: 2).sum(:valor)
      total_inicial_reducao = query.where(consulta_reducao).where(tipo_de_saldo: 1).sum(:valor)
      total_final_reducao = query.where(consulta_reducao).where(tipo_de_saldo: 2).sum(:valor)
      total_somatorio = (total_final - total_inicial) - (total_final_reducao - total_inicial_reducao)
    else
      unless consulta_reducao.nil? || consulta_reducao.empty?
        total_reducao_1 = query.where(consulta_reducao).where(tipo_de_saldo: tipo_de_saldo, natureza_do_saldo: 1).sum(:valor)
        total_reducao_2 = query.where(consulta_reducao).where(tipo_de_saldo: tipo_de_saldo, natureza_do_saldo: 2).sum(:valor)

        if total_reducao_2 >= total_reducao_1
          total_reducao = total_reducao_2 - total_reducao_1
        else
          total_reducao = total_reducao_1 + total_reducao_2
        end
      end
      total_somatorio_1 = query.where(consulta_somatorio).where(tipo_de_saldo: tipo_de_saldo, natureza_do_saldo: 1).sum(:valor)
      total_somatorio_2 = query.where(consulta_somatorio).where(tipo_de_saldo: tipo_de_saldo, natureza_do_saldo: 2).sum(:valor)

      if total_somatorio_2 >= total_somatorio_1
        total_somatorio = total_somatorio_2 - total_somatorio_1
      else
        total_somatorio = total_somatorio_1 - total_somatorio_2
      end
    end

    return total_somatorio.to_f + total_reducao.to_f
  end

  def self.calcular_no_mes(orcamento_id, mes_referencia, consulta_somatorio, consulta_reducao = "", tipo_de_saldo = 2)
    query = Contabilidade::SaldoMensalDaContaPorInformacao.where(orcamento_id: orcamento_id, mes_referencia: mes_referencia)

    total_inicial = query.where(consulta_somatorio).where(tipo_de_saldo: 1).sum(:valor)
    total_final = query.where(consulta_somatorio).where(tipo_de_saldo: 2).sum(:valor)
    total_inicial_reducao = query.where(consulta_reducao).where(tipo_de_saldo: 1).sum(:valor)
    total_final_reducao = query.where(consulta_reducao).where(tipo_de_saldo: 2).sum(:valor)
    total_somatorio = (total_final - total_inicial) - (total_final_reducao - total_inicial_reducao)

    return total_somatorio.to_f
  end

end
