module Contabilidade
	class RetencoesController < ApplicationController
		include ControllerConcern

		before_action -> { verifica_modulo_na_sessao(["administrativo", "contabilidade", "financeiro"]) }
		before_action :authenticate_usuario!, except: [:retencoes_por_liquidacao]
		before_action do
			autoriza_usuario!(action_name, "contabilidade/pagamentos")
		end
		before_action :set_liquidacao, only: [:edit, :update, :destroy]
		before_action :set_pagamento, only: [:edit, :update, :destroy]
		before_action :disponibiliza_dependencias, only: [:edit]

		def get_retencao
			@valor_calculado = Retencao.find_by(pagamento_id: params[:pagamento_id], imposto_type: params[:imposto_type]).try(:valor_calculado).to_f
			respond_to do |format|
				format.json { render json: @valor_calculado }
			end
		end

		# DELETE /contabilidade/retencoes/1
		def destroy
			@retencao = Retencao.find_by(id: params[:retencao_id])
			mensagem = apaga_e_retorna_mensagem(@retencao)
			if @pagamento.present?
				redirect_to @pagamento, mensagem
			elsif @liquidacao.present?
				redirect_to @liquidacao, mensagem
			end
		end

		def edit
			if @pagamento.present? && @pagamento.estornado
				redirect_to @pagamento, alert: 'Esse pagamento foi estornado, não é possível calcular retenções.'
			end

			if @liquidacao.present? && @liquidacao.tem_folha_de_pagamento?
				contas_extra_orcamentarias_por_unidade = @liquidacao.unidade_orcamentaria_do_exercicio_atual.contas_extra_por_unidades_orcamentarias
				contas_extra_orcamentarias_por_unidade.each do |conta_extra_por_unidade|
					retencao_folha = @liquidacao.retencoes_folha.find_by(conta_extra_orcamentaria_id: conta_extra_por_unidade.conta_extra_orcamentaria.id)
					@liquidacao.retencoes_folha.build(conta_extra_orcamentaria: conta_extra_por_unidade.conta_extra_orcamentaria) unless retencao_folha.present?
				end
			end
		end

		def update
			if @liquidacao.present?
				if @liquidacao.nota_fiscal.update(retencao_da_nota_params)
					redirect_to @liquidacao, notice: 'Retenção foi calculada com sucesso.'
				else
					flash.now[:alert] = "Não foi possivel calcular a retencao, favor verificar os campos da liquidacao."
					disponibiliza_dependencias
					render :edit
				end
			end

			if @pagamento.present?
				if @pagamento.update(retencao_do_pagamento_params)
					redirect_to @pagamento, notice: 'Retenção foi calculada com sucesso.'
				else
					flash.now[:alert] = "Não foi possivel calcular a retencao, favor verificar os campos do pagamento."
					disponibiliza_dependencias
					render :edit
				end
			end
		end

		def retencoes_por_liquidacao
			liquidacao = Contabilidade::Liquidacao.find(params[:liquidacao_id] )

			if liquidacao.retencoes_folha.any?
				@retencoes = liquidacao.retencoes_folha
			else
				@retencoes = Contabilidade::Retencao.where(nota_fiscal_id: liquidacao.try(:nota_fiscal).try(:id))
			end

			respond_to do |format|
				format.json { render json: @retencoes}
				format.js
			end
		end

		private

		def set_liquidacao
			@liquidacao = Contabilidade::Liquidacao.find(params[:liquidacao_id]) if params[:liquidacao_id]
		end

		def set_pagamento
			if params[:pagamento_id]
				@pagamento = Pagamento.find(params[:pagamento_id])
				@pagamento.rentencoes_calculadas
			end
		end

		def disponibiliza_dependencias
			@contas_bancarias = Base::ContaBancaria.where("data_de_inativacao >= ? OR data_de_inativacao is null", Date.today).left_joins(agencia: :banco).includes(agencia: :banco).where("base_agencias.id is null OR base_agencias.orcamento_id is not null").order(conta_caixa_pcasp: :desc, sigla: :asc, numero_da_conta: :desc)
			@servicos_iss = contexto_atual.imposto_sobre_servicos.order('codigo::int')
			@atividades_irpj = contexto_atual.irrfs_pessoas_juridicas.order(:codigo)
			@atividades_inss_pj = contexto_atual.inss_pessoas_juridicas.order(:codigo)
			@aliquotas_inss_pf = contexto_atual.inss_vigente.present? ? contexto_atual.inss_vigente.inss_pessoas_fisicas : []
			@tipos_de_acao = Contabilidade::Retencao.tipos_de_acao
		end

		# Permite apenas os parâmetros específicos
		def retencao_da_nota_params
			params.require(:contabilidade_nota_fiscal).permit(
				:conta_extra_orcamentaria_id, :calcular_iss, :calcular_irpj, :calcular_irpf, :calcular_inss_pj, :calcular_inss_pf, :orcamentario_iss,:extraorcamentario_iss,:orcamentario_inss_pj,:extraorcamentario_inss_pj,:orcamentario_irpj,:extraorcamentario_irpj,:extraorcamentario_inss_pf,:orcamentario_irpf,:extraorcamentario_irpf,
				retencoes_attributes: [:id, :imposto_id, :imposto_type,:tipo_de_acao, :aliquota, :base_de_calculo, :valor_calculado, :conta_extra_orcamentaria_id, :_destroy]
			)
		end

		def retencao_do_pagamento_params
			params.require(:contabilidade_pagamento).permit(
				:conta_extra_orcamentaria_id, :calcular_iss, :calcular_irpj, :calcular_irpf, :calcular_inss_pj, :calcular_inss_pf, :orcamentario_iss,:extraorcamentario_iss,:orcamentario_inss_pj,:extraorcamentario_inss_pj,:orcamentario_irpj,:extraorcamentario_irpj,:extraorcamentario_inss_pf,:orcamentario_irpf,:extraorcamentario_irpf,
				retencoes_attributes: [:id, :imposto_id,:tipo_de_acao, :imposto_type, :aliquota, :base_de_calculo, :valor_calculado, :conta_bancaria_id, :conta_extra_orcamentaria_id, :_destroy]
			)
		end
	end
end
