module Contabilidade
  class PagamentosDasRetencoesController < ApplicationController
    include ControllerConcern
    before_action :authenticate_usuario!

    def new
      retencao = Contabilidade::Retencao.find_by(id: params[:retencao_id])
      contas_bancarias = retencao.pagamento.contas_bancarias
      conta_origem_id = contas_bancarias.size == 1 ? contas_bancarias.first.id : nil

      @pagamento_da_retencao = Contabilidade::PagamentoDaRetencao.new(retencao_id: retencao.id, conta_origem_id: conta_origem_id, data_do_pagamento: retencao.pagamento.data)
      disponibiliza_dependencias
    end

    def create
      @pagamento_da_retencao = Contabilidade::PagamentoDaRetencao.new(pagamentos_das_retencoes_params)

      ActiveRecord::Base.transaction do
        redirect_to @pagamento_da_retencao.retencao.pagamento, notice: 'Pagamento Efetuado com Sucesso' if @pagamento_da_retencao.save!
      end

    rescue => exception
      disponibiliza_dependencias
      render :new
    end

    def edit
      @pagamento_da_retencao = Contabilidade::PagamentoDaRetencao.find_by(id: params[:id])
      disponibiliza_dependencias
    end

    def update
      @pagamento_da_retencao = Contabilidade::PagamentoDaRetencao.find_by(id: params[:id])

      ActiveRecord::Base.transaction do
        if @pagamento_da_retencao.update(pagamentos_das_retencoes_params)
          redirect_to @pagamento_da_retencao.retencao.pagamento, notice: 'Pagamento Atualizado com Sucesso'
        end
      end

    rescue
      disponibiliza_dependencias
      render :new
    end

    def destroy
      @pagamento_da_retencao = Contabilidade::PagamentoDaRetencao.find_by(id: params[:id])
      
      mensagem = apaga_e_retorna_mensagem(@pagamento_da_retencao)
      redirect_to @pagamento_da_retencao.pagamento, mensagem
    end

    private

    def disponibiliza_dependencias
      @contas_bancarias = Base::ContaBancaria.where("data_de_inativacao >= ? OR data_de_inativacao is null", Date.today).left_outer_joins(agencia: :banco).includes(agencia: :banco).order(sigla: :asc, numero_da_conta: :asc)
      @contas_bancarias_origem = @contas_bancarias.joins(:contas_bancarias_por_unidade_orcamentaria).where(
        base_contas_bancarias_por_unidade_orcamentaria: {
          unidade_orcamentaria_id: @pagamento_da_retencao.retencao.get_liquidacao.unidade_orcamentaria_do_exercicio_atual(contexto_atual).id 
        }
      )

      @fontes_de_recursos = []
      if @pagamento_da_retencao.conta_destino_id.present?
        @fontes_de_recursos = contexto_atual.fontes_de_recursos.joins(:fontes_de_recursos_da_conta_bancaria)
          .where(base_fontes_de_recursos_da_conta_bancaria: {conta_bancaria_id: @pagamento_da_retencao.conta_destino_id})
      end
    end

    def pagamentos_das_retencoes_params
      params.require(:contabilidade_pagamento_da_retencao).permit(
        :conta_origem_id, :conta_destino_id, :retencao_id, :fonte_de_recursos_destino_id, :data_do_pagamento
      )
    end
  end
end