class Contabilidade::DespesasExtraOrcamentariasController < ApplicationController
	include ContabilidadeControllerConcern
	include ControllerConcern
	include GeradorDeEventosContabeisController
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:imprimir]
	before_action :set_despesa_extra_orcamentaria, only: [:show, :edit, :update, :destroy, :disponibiliza_dependencias, :imprimir]
	before_action :disponibiliza_dependencias, only: [:new, :create, :index, :edit, :update, :imprimir]
	before_action :disponibiliza_eventos_contabeis, only: [:new, :edit, :create, :update]
	before_action -> { usuario_pode_visualizar?(@despesa_extra_orcamentaria) }, except: [:index, :new, :create]
	# before_action -> {verifica_mes_bloqueado(@despesa_extra_orcamentaria)}, only: [:edit, :destroy]

	# GET /contabilidade/:exercicio/despesas_extra_orcamentarias
	def index
		if current_usuario.desenvolvedor?
			@q = contabilidade_atual.despesas_extra_orcamentarias.order("data_de_emissao DESC").search(params[:q])
		else
			@q = contabilidade_atual.despesas_extra_orcamentarias.where(unidade_orcamentaria_id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)).order("data_de_emissao DESC").search(params[:q])
		end

		@despesas_extra_orcamentarias = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
		@credores = Base::Pessoa.includes(:tipo_de_pessoa).where("fornecedor = true").order(:nome)
		@contas_bancarias = Base::ContaBancaria.where("data_de_inativacao >= ? OR data_de_inativacao is null", Date.today).left_outer_joins(agencia: :banco).includes(agencia: :banco).all.order(conta_caixa_pcasp: :desc, sigla: :asc, numero_da_conta: :asc)
		
		if request.format.pdf?
			titulo2 = ""
			titulo3 = ""
			if params[:q].present? && params[:q]["unidade_orcamentaria_id_eq"].present?
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:q]["unidade_orcamentaria_id_eq"])
				titulo2 += "Unidade Orçamentária: #{unidade_orcamentaria.codigo_e_nome} - "
			else
				titulo2 += "Unidade Orçamentária: CONSOLIDADO - "
			end
			if params[:q].present? && params[:q]["pessoa_id_eq"].present?
				fornecedor = Base::Pessoa.find(params[:q]["pessoa_id_eq"])
				titulo3 += "Fornecedor: #{fornecedor.nome_e_cpf_ou_cnpj} - "
			end
			titulo2 += "Período: #{params[:q]["data_de_emissao_gteq"]} até #{params[:q]["data_de_emissao_lteq"]} " if params[:q].present? and (params[:q]["data_de_emissao_gteq"].present? || params[:q]["data_de_emissao_lteq"].present?)
			titulo2 += "Nº do Pagamento: #{params[:q][:numero_de_caixa_cont]} - " if params[:q].present? and params[:q][:numero_de_caixa_cont].present?
			conta_enxtra_orcamentaria = Contabilidade::ContaExtraOrcamentaria.find(params[:q][:conta_extra_orcamentaria_id_eq]) if params[:q].present? and params[:q][:conta_extra_orcamentaria_id_eq].present?
			titulo3 += "Cod. Despesa: #{conta_enxtra_orcamentaria.descricao}" if params[:q].present? and params[:q][:conta_extra_orcamentaria_id_eq].present?
			@despesas_extra_orcamentarias = @q.result(distinct: false)
		end

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

			format.pdf do
				render pdf: "despesas_extra_orcamentarias",
				template: 'contabilidade/despesas_extra_orcamentarias/index.pdf.slim',
				orientation: 'Landscape',
				header: {
					html: {
						template: 'layouts/_cabecalho_pdf.html.slim',
						locals: { titulo1: 'Relação de Despesas de Extra-Orçamentárias' , 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
	end

	# GET /contabilidade/:exercicio/despesas_extra_orcamentarias/new
	def new
		if params[:atributos].present?
			@despesa_extra_orcamentaria = contabilidade_atual.despesas_extra_orcamentarias.new
			reconstroi_gerador( @despesa_extra_orcamentaria, params[:atributos].except(:id, :created_at, :updated_at) )

			@despesa_extra_orcamentaria.unidade_orcamentaria_id = @despesa_extra_orcamentaria.conta_bancaria_por_unidade_orcamentaria.unidade_orcamentaria.id
			@despesa_extra_orcamentaria.conta_bancaria_id = @despesa_extra_orcamentaria.conta_bancaria_por_unidade_orcamentaria.conta_bancaria.id
		else
			@despesa_extra_orcamentaria = contabilidade_atual.despesas_extra_orcamentarias.new
			@despesa_extra_orcamentaria.numero_do_documento = 0
			@despesa_extra_orcamentaria.tipo_de_documento = 2
		end
		disponibiliza_dependencias_create
		@contas_extras = Contabilidade::ContaExtraOrcamentaria.where("contabilidade_contas_extra_orcamentarias.id = ?", @despesa_extra_orcamentaria.conta_extra_orcamentaria_id ) || Array.new
	end

	# POST /contabilidade/:exercicio/despesas_extra_orcamentarias
	def create
		mes_de_competencia = despesa_extra_orcamentaria_params[:mes_de_competencia].blank? ? nil : despesa_extra_orcamentaria_params[:mes_de_competencia].to_i
		ano_de_competencia = despesa_extra_orcamentaria_params[:ano_de_competencia].blank? ? nil : despesa_extra_orcamentaria_params[:ano_de_competencia].to_i
		@despesa_extra_orcamentaria = contabilidade_atual.despesas_extra_orcamentarias.new(despesa_extra_orcamentaria_params.merge(mes_de_competencia: mes_de_competencia, ano_de_competencia: ano_de_competencia))

		ActiveRecord::Base.transaction do
			if @despesa_extra_orcamentaria.save

				if @despesa_extra_orcamentaria.faz_movimentacoes_validas?
					if params[:atributos_de_estorno].present?
						estorno_params = Hash[ JSON.parse params[:atributos_de_estorno].gsub('=>', ':') ]
						estorno = Contabilidade::EstornoDeDespesaExtraOrcamentaria.new( estorno_params )
						if estorno.save
							redirect_to @despesa_extra_orcamentaria, notice: 'Despesa Extraorcamentária foi criado(a) com sucesso.'
						else
							redirect_to new_contabilidade_estornos_de_despesa_extra_orcamentaria_path(estorno.despesa_extra_orcamentaria_id), notice: 'Erro ao cadastrar o estorno.'
							raise ActiveRecord::Rollback
						end
					else
						redirect_to @despesa_extra_orcamentaria, notice: 'Despesa Extraorcamentária foi criado(a) com sucesso.'
					end
				else
					disponibiliza_dependencias_create
					error = mensagem_de_erro_das_movimentacoes_erradas( @despesa_extra_orcamentaria )
					redirect_to new_contabilidade_despesa_extra_orcamentaria_path(exercicio: contabilidade_atual.exercicio, atributos: despesa_extra_orcamentaria_params), alert: error
					raise ActiveRecord::Rollback
				end
			else
				
				disponibiliza_dependencias_create
				render :new
			end
		end
	end

	# GET /contabilidade/despesas_extra_orcamentarias/:id
	def show
		@exibir_alerta_contexto = self.send(:exibir_alerta_de_contexto?, @despesa_extra_orcamentaria&.data_de_emissao)
	end

	# GET /contabilidade/despesas_extra_orcamentarias/:id/edit
	def edit
		if @despesa_extra_orcamentaria.orcamento.exercicio != contexto_atual.exercicio
			redirect_to @despesa_extra_orcamentaria, alert: 'Não é possivel editar a Despesa extra, a data é diferente do exercicio logado .'
		end	
		disponibiliza_dependencias_create
	end

	# PATCH/PUT /contabilidade/despesas_extra_orcamentarias/:id
	def update
		mes_de_competencia = despesa_extra_orcamentaria_params[:mes_de_competencia].blank? ? nil : despesa_extra_orcamentaria_params[:mes_de_competencia].to_i
		ano_de_competencia = despesa_extra_orcamentaria_params[:ano_de_competencia].blank? ? nil : despesa_extra_orcamentaria_params[:ano_de_competencia].to_i

		if @despesa_extra_orcamentaria.update(despesa_extra_orcamentaria_params.merge(mes_de_competencia: mes_de_competencia, ano_de_competencia: ano_de_competencia))
			redirect_to @despesa_extra_orcamentaria, notice: 'Despesa foi atualizada com sucesso.'
		else
			disponibiliza_dependencias_create
			render :edit
		end
	end

	# DELETE /contabilidade/despesas_extra_orcamentarias/:id
	def destroy
		mensagem = apaga_e_retorna_mensagem(@despesa_extra_orcamentaria)
		redirect_to contabilidade_despesas_extra_orcamentarias_path(contabilidade_atual), mensagem
	end

	def imprimir
		bloqueia_usuario_com_base_em :read, "contabilidade/despesas_extra_orcamentarias"
		relatorio = params[:relatorio]

		id = params[:despesa_extra_orcamentaria_id] || params[:id]

		@despesa_extra_orcamentaria = Contabilidade::DespesaExtraOrcamentaria.find_by(id: id)
		@unidade_orcamentaria = @despesa_extra_orcamentaria&.unidade_orcamentaria

		if respond_to? relatorio.to_s, :private
			loa = CombinePDF.new
			if relatorio != "estorno_despesa_extra_orcamentaria" && params[:com_capa] == "true"
				loa << CombinePDF.parse(capa_despesa_extra_orcamentaria)
			end
			loa << CombinePDF.parse(send(relatorio))
			send_data loa.to_pdf, filename: "#{relatorio}.pdf", type: "application/pdf", disposition: 'inline'
		else
			redirect_to :back, alert: 'Demonstrativo selecionado não existe'
		end
	end

	def capa_despesa_extra_orcamentaria
		render_to_string pdf: "capa_despesa_extra_orcamentaria",
			template: "contabilidade/despesas_extra_orcamentarias/capa_despesa_extra_orcamentaria.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,
			dpi: '96',
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas(top: 5)
	end

	def despesa_extra_orcamentaria
		titulo2 = "Pagamento " + @despesa_extra_orcamentaria.numero_formatado

		render_to_string pdf: "despesa_extra_orcamentaria",
			template: "contabilidade/despesas_extra_orcamentarias/despesa_extra_orcamentaria.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: "Relatorio de Pagamento Extraorçamentário",	titulo2: titulo2 }
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end

	def estorno_despesa_extra_orcamentaria
		@despesa_extra_orcamentaria = Contabilidade::DespesaExtraOrcamentaria.find_by(id: params[:despesa_extra_orcamentaria_id])

		titulo2 = "Pagamento " + @despesa_extra_orcamentaria.numero_formatado

		render_to_string pdf: "estorno_despesa_extra_orcamentaria",
			template: "contabilidade/despesas_extra_orcamentarias/estorno_despesa_extra_orcamentaria.pdf.slim",
			orientation: 'Portrait',
			disable_smart_shrinking: true,

			dpi: '96',
			header: {
				html: {
					template: 'layouts/_cabecalho_pdf.html.slim',
					locals: { titulo1: "Relatorio de Estorno de Pagamento Extraorçamentário",	titulo2: titulo2 }
				},
				spacing: 5
			},
			footer: {
				html: {
					template: 'layouts/_rodape_pdf.html.slim'
				}
			},
			margin: @configuracoes.margens_customizadas
	end
	
	def set_despesa_extra_orcamentaria
		@despesa_extra_orcamentaria = Contabilidade::DespesaExtraOrcamentaria.find(params[:id])
	end
	
	private
	# Permite apenas os parâmetros específicos
	def despesa_extra_orcamentaria_params
		params.require(:contabilidade_despesa_extra_orcamentaria).permit(:arquivo_id, :tipo_de_lancamento,:orcamento_id, :evento_contabil_id,
			:data_de_emissao, :unidade_orcamentaria_id, :conta_extra_orcamentaria_id, :conta_bancaria_id, :numero_de_caixa,
			:credor_id, :tipo_de_documento, :numero_do_documento, :valor_da_despesa, :valor_da_deducao, :historico, :fonte_de_recursos_id,
			:valor_juros_e_multa, :mes_de_competencia, :ano_de_competencia
		)
	end

	def disponibiliza_dependencias_create
		@fontes_de_recursos = []
		@contas_extra_orcamentarias = []
		@contas_bancarias = []

		if @despesa_extra_orcamentaria.present? && @despesa_extra_orcamentaria.conta_extra_orcamentaria&.repasse_duodecimo_para_a_camara?
			@fontes_de_recursos = contexto_atual.present? ? contexto_atual.fontes_de_recursos.select { |f| f.codigo_completo == '1500000000' } : []
		else
			@fontes_de_recursos = contexto_atual.present? ? contexto_atual.fontes_de_recursos.select { |f| f.codigo_completo == '1869000000' } : []
		end

		if @despesa_extra_orcamentaria.unidade_orcamentaria_id.present?
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(@despesa_extra_orcamentaria.unidade_orcamentaria_id)
			@contas_extra_orcamentarias = unidade_orcamentaria&.contas_extra_orcamentarias.order(:codigo)
			@contas_bancarias = unidade_orcamentaria.contas_bancarias.left_outer_joins(agencia: :banco).order(conta_caixa_pcasp: :desc, sigla: :asc, numero_da_conta: :asc) rescue []
			# @fontes_de_recursos = Loa::OrcamentoDaReceita.joins(unidade_orcamentaria_por_natureza_da_receita: :unidade_orcamentaria).where("loa_unidades_orcamentarias_por_natureza_da_receita.unidade_orcamentaria_id = ?", @despesa_extra_orcamentaria.unidade_orcamentaria_id).all.map { |i| i.fonte_de_recursos }.uniq
		end
	end

	def disponibiliza_dependencias
		@configuracoes = Configuracao.last
		@contas_bancarias = []
		@contas_extras = Contabilidade::ContaExtraOrcamentaria.ativos.joins(:contas_extra_por_unidades_orcamentarias).where("contabilidade_contas_extra_por_unidades_orcamentarias.unidade_orcamentaria_id = ?", @despesa_extra_orcamentaria.unidade_orcamentaria_id ).order("id ASC") rescue Array.new

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

		@tipos_de_documentos = Contabilidade::DespesaExtraOrcamentaria.tipos_de_documento
		@tipos_de_lancamento = Contabilidade::DespesaExtraOrcamentaria.tipo_de_lancamentos
		@contas_extra_orcamentarias_filtros = contexto_atual.contas_extra_orcamentarias
		@contas_extra_orcamentarias = []
	end
end
