module Contabilidade
class AnulacoesDosTaloesDeReceitaController < ApplicationController
	include ContabilidadeControllerConcern
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:fontes_de_recursos]
	before_action :set_talao_de_receita, only: %i[show new create edit update fontes_de_recursos]
	before_action :set_anulacao_do_talao_de_receita, only: [:edit, :update, :destroy, :disponibiliza_dependencias, :show, :verifica_mes_bloqueado]
	before_action :disponibiliza_dependencias, only: [:new, :edit, :show, :index, :imprimir]
	# before_action -> {verifica_mes_bloqueado(@anulacao_do_talao_de_receita)}, only: [:edit, :destroy]

	def index
		if params["tipo_de_anulacao"].present?
			@tipo_de_anulacao = params["tipo_de_anulacao"] == 'extraorcamentario' ? 'extraorcamentario' : 'orcamentario'
		else
			@tipo_de_anulacao = query_params["tipo_da_index"]
		end

		anulacoes_do_talao_de_receita = Contabilidade::AnulacaoDoTalaoDeReceita.joins(talao_de_receita: [unidade_orcamentaria: :orgao]).where("loa_orgaos.orcamento_id = ?", contexto_atual.id)
		
		if params["tipo_de_anulacao"] == 'extraorcamentario' || @tipo_de_anulacao == 'extraorcamentario'
			anulacoes_do_talao_de_receita = anulacoes_do_talao_de_receita.joins(:talao_de_receita).where("contabilidade_taloes_de_receita.origem_do_talao = ?", Contabilidade::TalaoDeReceita.origem_dos_taloes['extra_orcamentario'])
		else
			anulacoes_do_talao_de_receita = anulacoes_do_talao_de_receita.joins(:talao_de_receita).where("contabilidade_taloes_de_receita.origem_do_talao = ?", Contabilidade::TalaoDeReceita.origem_dos_taloes['orcamentario'])
		end

		@q = anulacoes_do_talao_de_receita.ransack(params[:q])

		if request.format.pdf?
			titulo2 = ""
			titulo3 = ""
			if params[:q].present? && params[:q]["talao_de_receita_unidade_orcamentaria_id_eq"].present?
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:q]["talao_de_receita_unidade_orcamentaria_id_eq"])
				titulo2 += "Unidade Gestora: #{unidade_orcamentaria.codigo_e_nome} - "
			else
				titulo2 += "Unidade Gestora: CONSOLIDADO - "
			end
			if params[:q].present? && params[:q]["talao_de_receita_pessoa_id_eq"].present?
				fornecedor = Base::Pessoa.find(params[:q]["talao_de_receita_pessoa_id_eq"])
				titulo3 += "Fornecedor: #{fornecedor.nome_e_cpf_ou_cnpj}"
			end

			titulo2 += "Período: #{params[:q]["data_da_anulacao_gteq"]} até #{params[:q]["data_da_anulacao_lteq"]} " if params[:q].present? and (params[:q]["data_da_anulacao_gteq"].present? || params[:q]["data_da_anulacao_lteq"].present?)
		end

		@lista_de_anulacoes = @q.result(distinct: false).order("data_da_anulacao DESC")

		@configuracoes = Configuracao.last
		respond_to do |format|
			format.html

			format.pdf do
				render pdf: "anulacoes_dos_taloes",
				template: 'contabilidade/anulacoes_dos_taloes_de_receita/index.pdf.slim',
				orientation: 'Landscape',
				header: {
					html: {
						template: 'layouts/_cabecalho_pdf.html.slim',
						locals: { titulo1: 'Relação de Anulações dos Talões de Receitas' , titulo2: titulo2, titulo3: titulo3 }
					},
					spacing: 0
				},
				footer: { right: '[page]', font_size: 8 },
				disable_smart_shrinking: true,
				dpi: '96',
				margin: @configuracoes.margens_customizadas(top: 4)
			end
		end
		
		@anulacoes_do_talao_de_receita = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
	end

	def show
	end
	# GET /contabilidade/taloes_de_receita/1/anulacoes/new
	def new
		@anulacao_do_talao_de_receita = @talao_de_receita.anulacoes_dos_taloes_de_receita.new
		# NECESSÁRIO PARA A ANULAÇÃO DE TALÕES DE DESCONTO
		if @anulacao_do_talao_de_receita.talao_de_receita.valor.to_f < 0
			@anulacao_do_talao_de_receita.talao_de_receita.valor = @anulacao_do_talao_de_receita.talao_de_receita.valor.to_f * -1
			@anulacao_do_talao_de_receita.talao_de_receita.valor_anulado = @anulacao_do_talao_de_receita.talao_de_receita.valor_anulado.to_f * -1
		end

	end

	# POST /contabilidade/taloes_de_receita/1/anulacoes
	def create
		@anulacao_do_talao_de_receita = @talao_de_receita.anulacoes_dos_taloes_de_receita.new(anulacao_do_talao_de_receita_params)
		# NECESSÁRIO PARA A ANULAÇÃO DE TALÕES DE DESCONTO
		if @anulacao_do_talao_de_receita.talao_de_receita.valor.to_f < 0
			@anulacao_do_talao_de_receita.talao_de_receita.valor = @anulacao_do_talao_de_receita.talao_de_receita.valor.to_f * -1
			@anulacao_do_talao_de_receita.talao_de_receita.valor_anulado = @anulacao_do_talao_de_receita.talao_de_receita.valor_anulado.to_f * -1
		end

		unless @anulacao_do_talao_de_receita[:relancamento].present?
			@anulacao_do_talao_de_receita[:relancamento] = false
		end

		unless @anulacao_do_talao_de_receita[:relancamento]
			@anulacao_do_talao_de_receita.skip_callback = true
			if @anulacao_do_talao_de_receita.save
				@anulacao_do_talao_de_receita.skip_callback = false
				@anulacao_do_talao_de_receita.gerar_todos_os_movimentos(:data_da_anulacao, contexto_atual)
				redirect_to @anulacao_do_talao_de_receita.talao_de_receita, notice: 'Anulacao do talao de receita foi criado(a) com sucesso.'
			else
				disponibiliza_dependencias
				render :new
			end
		else
			session[:anulacao_do_talao_de_receita] = @anulacao_do_talao_de_receita
			redirect_to new_contabilidade_talao_de_receita_path(contexto_atual.exercicio)  + "?relancamento=1"
		end
	end

	# GET /contabilidade/taloes_de_receita/1/anulacoes/1/edit
	def edit
	end

	# PATCH /contabilidade/taloes_de_receita/1/anulacoes/1
	def update
		@anulacao_do_talao_de_receita.skip_callback = true
		if @anulacao_do_talao_de_receita.update(anulacao_do_talao_de_receita_params)
			@anulacao_do_talao_de_receita.skip_callback = false
			@anulacao_do_talao_de_receita.gerar_todos_os_movimentos(:data_da_anulacao, contexto_atual)
			redirect_to @anulacao_do_talao_de_receita.talao_de_receita,
				notice: 'Anulação do Talão de Receita foi atualizada com sucesso!'
		else
			flash.now[:alert] = 'Não foi possível atualizar a Anulação do Talão de Receita, verifique os campos.'
			disponibiliza_dependencias
			render :edit
		end
	end

	# DELETE /contabilidade/taloes_de_receita/1/anulacoes/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@anulacao_do_talao_de_receita)
		redirect_to contabilidade_talao_de_receita_path(@anulacao_do_talao_de_receita.talao_de_receita) + "?tab=anulacoes_dos_taloes_de_receita", mensagem
	end

	def fontes_de_recursos
		@fontes_de_recursos = Contabilidade::TalaoDeReceita.find(params[:talao_de_receita_id]).orcamentos_dos_lancamentos_da_receita

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

	def imprimir
		relatorio = params[:relatorio]
		if respond_to? relatorio.to_s, :private
			loa = CombinePDF.new
			loa << CombinePDF.parse(send(relatorio))
			send_data loa.to_pdf, filename: "#{relatorio}.pdf", type: "application/pdf", disposition: 'inline'
		else
			redirect_to :back, alert: 'Relatório selecionado não existe'
		end
	end

	def anulacao_talao_de_receita
		@anulacao_do_talao_de_receita = Contabilidade::AnulacaoDoTalaoDeReceita.find(params[:id])
		render_to_string pdf: "anulacao_talao_de_receita.pdf",
			template: "contabilidade/taloes_de_receita/anulacao_talao_de_receita.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			
			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: "", titulo2: "" }
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	private

	def set_talao_de_receita
		if params[:talao_de_receita_id].present?
			@talao_de_receita = Contabilidade::TalaoDeReceita.find(params[:talao_de_receita_id])
		else
			anulacao = Contabilidade::AnulacaoDoTalaoDeReceita.find(params[:id])
			@talao_de_receita = Contabilidade::TalaoDeReceita.find(anulacao.talao_de_receita_id)
		end
	end

	def set_anulacao_do_talao_de_receita
		@anulacao_do_talao_de_receita = Contabilidade::AnulacaoDoTalaoDeReceita.find(params[:id])
	end

	def disponibiliza_dependencias
		@complementos_da_fonte =
			if @anulacao_do_talao_de_receita.nil? || @anulacao_do_talao_de_receita.new_record?
				[]
			else
				Contabilidade::ComplementoPorFonteDoTalaoDeReceita.complementacao_da_fonte_de_recursos
			end

		@tipos_de_anulacao_mapeados = Contabilidade::AnulacaoDoTalaoDeReceita.tipos_de_anulacao_mapeados
		@tipos_de_movimento_mapeados = Contabilidade::AnulacaoDoTalaoDeReceita.tipos_de_movimento
		data = ('01/01/'+"#{exercicio_atual}").to_date 
		@naturezas_da_receita = contexto_atual.naturezas_da_receita.joins(:receita_stn).where('base_receitas_stn.data_inativacao is null OR base_receitas_stn.data_inativacao <= ?', data).order('base_naturezas_da_receita.codigo')
		@contas_extra_orcamentarias = contexto_atual.contas_extra_orcamentarias
		
		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
		
		@pessoas = Base::Pessoa.includes(:tipo_de_pessoa).all
		@contas_bancarias = Base::ContaBancaria.all.sort_by{|conta| [conta.sigla, conta.numero_da_conta.gsub(/-(.*)/, "").gsub(/[,.-]/, '').gsub(/[Xx]/, '0').to_i]}
		@tipos_de_anulacao = Contabilidade::AnulacaoDoTalaoDeReceita.tipos_de_anulacao.map{|k| [Contabilidade::AnulacaoDoTalaoDeReceita.tipos_de_anulacao_i18n[k[0]], k[1]]}
		@configuracoes = Configuracao.last
	end

	def anulacao_do_talao_de_receita_params
		params.require(:contabilidade_anulacao_do_talao_de_receita).permit(:tipo_de_movimento,
			:talao_de_receita_id, :data_da_anulacao, :tipo_de_anulacao, :valor, :historico, :relancamento, :numero_da_anulacao, :orcamento_id,
			complementos_por_fonte_da_anulacao_do_talao_attributes: [:id, :orcamento_da_receita_id, :complementacao_da_fonte_de_recurso, :valor, :_destroy]
		)
	end
end
end
