module Contabilidade
class ContasExtraOrcamentariasController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:movimentacoes_das_contas, :detalhamento_da_movimentacao, :retorna_receita_da_conta, :retorna_saldo]
	before_action :set_conta_extra_orcamentaria, only: %i[show edit update destroy detalhamento_da_movimentacao carrega_select_box_para_edit ativar inativar]
	before_action :disponibiliza_dependencias, only: %i[new edit movimentacoes_das_contas index]
	before_action :carrega_select_box_para_new, only: %i[new create]

	# GET /contabilidade/contas_extra_orcamentarias
	def index
		@q = contabilidade_atual.contas_extra_orcamentarias.order(:codigo).search(params[:q])
		@contas_extra_orcamentarias = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
		@classes_pcasp = Contabilidade::ContaExtraOrcamentaria.classes_pcasp
	end

	def movimentacoes_das_contas
		@q = contabilidade_atual.contas_extra_por_unidades_orcamentarias.joins(:conta_extra_orcamentaria).order("contabilidade_contas_extra_orcamentarias.codigo").search(params[:q])
		@contas_extra_por_unidades_orcamentarias = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
	end

	def detalhamento_da_movimentacao
		@unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_id])
	end

	# GET /contabilidade/contas_extra_orcamentarias/new
	def new
		@conta_extra_orcamentaria = ContaExtraOrcamentaria.new
		adicionar_todas_unidades
	end

	# POST /contabilidade/contas_extra_orcamentarias
	def create
		@conta_extra_orcamentaria = contabilidade_atual.contas_extra_orcamentarias.new(conta_extra_orcamentaria_params)

		if @conta_extra_orcamentaria.save
			redirect_to @conta_extra_orcamentaria, notice: 'Conta extraorçamentária foi criada com sucesso.'
		else
			carrega_select_box_para_edit
			disponibiliza_dependencias
			flash.now[:alert] = 'Não foi possível criar a conta extraorçamentária, verifique as informações.'
			render :new
		end
	end

	# GET /contabilidade/contas_extra_orcamentarias/1
	def show
	end

	# GET /contabilidade/contas_extra_orcamentarias/1/edit
	def edit
		carrega_select_box_para_edit
		adicionar_todas_unidades
	end

	# PATCH/PUT /contabilidade/contas_extra_orcamentarias/1
	def update
		if @conta_extra_orcamentaria.update( conta_extra_orcamentaria_params )
			redirect_to @conta_extra_orcamentaria, notice: 'Conta extraorçamentária foi atualizado(a) com sucesso.'
		else
			carrega_select_box_para_edit
			disponibiliza_dependencias
			flash.now[:alert] = 'Não foi possível atualizar a conta extraorçamentária, verifique as informações.'
			render :edit
		end
	end

	# DELETE /contabilidade/contas_extra_orcamentarias/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@conta_extra_orcamentaria)
		redirect_to contabilidade_contas_extra_orcamentarias_url(contabilidade_atual), mensagem
	end

	def adicionar_todas_unidades
		if params[:todas].present? && params[:todas] == "true"
			unidades_existentes = @conta_extra_orcamentaria.contas_extra_por_unidades_orcamentarias.map(&:unidade_orcamentaria)
			unidades_restantes = @unidades_orcamentarias - unidades_existentes
			unidades_restantes.each do |unidade_orcamentaria|
				@conta_extra_orcamentaria.contas_extra_por_unidades_orcamentarias.build(unidade_orcamentaria: unidade_orcamentaria)
			end
		else
			@conta_extra_orcamentaria.contas_extra_por_unidades_orcamentarias.build if @conta_extra_orcamentaria.contas_extra_por_unidades_orcamentarias.empty?
		end
	end


	# GET /licitacao/pedidos/1/unidades_orcamentarias
	def editar_unidades
		return if bloqueia_usuario_com_base_em 'update'
	end

	# PATCH /licitacao/conta_extra_orcamentarias/1/unidades_orcamentarias
	def atualizar_unidades
		if @conta_extra_orcamentaria.update(unidades_params)
			redirect_to @conta_extra_orcamentaria, notice: 'Conta foi atualizada com sucesso.'
		else
			@unidades_orcamentarias = contabilidade_atual.unidades_orcamentarias
			flash.now[:alert] = 'Não foi possível atualizar as unidades, verifique as informações.'
			render :editar_unidades
		end
	end

	# GET /contas_extra_orcamentaria/:tipo_de_imposto/retorna_receita_da_conta
	def retorna_receita_da_conta
		if params[:tipo_de_imposto] == "irpj"
			@natureza_da_receita = contexto_atual.contas_extra_orcamentarias.find_by(retencao_para: 5).natureza_da_receita
		elsif params[:tipo_de_imposto] == "iss"
			@natureza_da_receita = contexto_atual.contas_extra_orcamentarias.find_by(retencao_para: 1).natureza_da_receita
		elsif params[:tipo_de_imposto] == "irpf"
			@natureza_da_receita = contexto_atual.contas_extra_orcamentarias.find_by(retencao_para: 4).natureza_da_receita
		elsif params[:tipo_de_imposto] == "irpf_aluguel"
			@natureza_da_receita = contexto_atual.naturezas_da_receita.find_by(codigo: '0011130341000000').present? ? contexto_atual.naturezas_da_receita.find_by(codigo: '0011130341000000') : contexto_atual.contas_extra_orcamentarias.find_by(retencao_para: 4).natureza_da_receita
		end

		render json: {
			'codigo_receita': @natureza_da_receita.try(:codigo_formatado_e_descricao),
		}
	end

	# GET /contas_extra_orcamentaria/:conta_extra_orcamentaria_id/retorna_saldo
	def retorna_saldo
		@conta_selecionada = contexto_atual.contas_extra_orcamentarias.find_by(id: params[:conta_extra_orcamentaria_id])
		if !params[:unidade_orcamentaria_id].nil?
			render json: {
				'saldo': (@conta_selecionada.contas_extra_por_unidades_orcamentarias.find_by(unidade_orcamentaria_id: params[:unidade_orcamentaria_id]).saldo.to_f - @conta_selecionada.anulacoes_da_conta_extra.where(unidade_orcamentaria_id: params[:unidade_orcamentaria_id]).sum(:valor).to_f).real_contabil,
			}
		else
			render json: {
				'saldo': @conta_selecionada.saldo.real_contabil,
			}
		end
	end
	
	# PATCH /contabilidade/contas_extra_orcamentarias/:conta_extra_orcamentaria_id/ativar
	def ativar
		@conta_extra_orcamentaria.data_de_inativacao = nil

		if @conta_extra_orcamentaria.save
			redirect_to @conta_extra_orcamentaria, notice: 'Conta Extraorçamentária foi ativada com sucesso.'
		end
	end

	private
	def set_conta_extra_orcamentaria
		@conta_extra_orcamentaria = ContaExtraOrcamentaria.find(params[:id])
	end

	def disponibiliza_dependencias
		if @conta_extra_orcamentaria.present? && @conta_extra_orcamentaria.classe_pcasp.present?
			natureza_do_saldo = @conta_extra_orcamentaria.ativo? ? 'devedor' : 'credor'
			@contas_pcasp = contexto_atual.contas.where(nivel_detalhado: 1, natureza_do_saldo: natureza_do_saldo).order(:codigo)
		else
			@contas_pcasp = Array.new
		end

		@classes_pcasp = Contabilidade::ContaExtraOrcamentaria.classes_pcasp
		@grupos_pcasp = Contabilidade::ContaExtraOrcamentaria.grupos_pcasp
		@codigos_sim = Contabilidade::ContaExtraOrcamentaria.codigos_sim
		@tipos_de_conta = Contabilidade::ContaExtraOrcamentaria.tipo_de_contas
		@naturezas_da_receita = contexto_atual.naturezas_da_receita.order(:codigo)
		@contas_extra_orcamentarias_modal = contexto_atual.contas_extra_orcamentarias.order(:codigo)

		if current_usuario.desenvolvedor?
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.order("loa_unidades_orcamentarias.codigo", "loa_unidades_orcamentarias.nome")
		else
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)).order("loa_unidades_orcamentarias.codigo", "loa_unidades_orcamentarias.nome")
		end
	end

	def carrega_select_box_para_new
		@detalhamentos = []
		@subcontas = []
		@subcontaspcasp = Contabilidade::SubContaPcasp.investimentos || []
	end

	def carrega_select_box_para_edit
		if @conta_extra_orcamentaria.tipo_de_conta.present? 

			if @conta_extra_orcamentaria.ativo?
				codigos_detalhamento =["113810000"]
			elsif @conta_extra_orcamentaria.passivo? && @conta_extra_orcamentaria.conta_extra?
				codigos_detalhamento =["218810100", "218810200", "218810300", "218810400", "218819900"]
			elsif @conta_extra_orcamentaria.passivo? && @conta_extra_orcamentaria.conta_extra_intra_orcamentaria?
				codigos_detalhamento = ["218820100"]
			end

			@detalhamentos = contexto_atual.contas.where(codigo:codigos_detalhamento)
			if @conta_extra_orcamentaria.detalhamento_id.present?				
				@subcontas = @conta_extra_orcamentaria.detalhamento.contas_filho
			else
				@subcontas = []
			end

			@subcontaspcasp = Contabilidade::SubContaPcasp.investimentos || []
		else
			carrega_select_box_para_new
		end
	end


	# Permite apenas os parâmetros específicos
	def conta_extra_orcamentaria_params
		params.require(:contabilidade_conta_extra_orcamentaria).permit(:tipo_de_conta, :subconta_id, :detalhamento_id, :classificacao, :codigo, :codigo_sim,
			:data_de_envio_pro_sim,:arquivo_id,:orcamento_id, :descricao, :classe_pcasp, :saldo_inicial, :retencao_para, :natureza_da_receita_id, :pessoa_id,
			:conta_id, :data_de_inativacao, :inativacao, :sub_conta_pcasp_id, :investimento_rpps, :grupo_pcasp,
			contas_extra_por_unidades_orcamentarias_attributes: [:unidade_orcamentaria_id, :id, :conta_extra_orcamentaria_id, :saldo, :_destroy])
	end
end
end
