class Contabilidade::ItensDaNotaFiscalController < ApplicationController
	include ControllerConcern
	include Contabilidade::LiquidacaoHelper

	before_action -> { verifica_modulo_na_sessao(["contabilidade", "administrativo"]) }
	before_action :authenticate_usuario!, except: [:destroy, :editar_itens, :atualiza_itens, :busca_itens, :adiciona_itens]
	before_action :verifica_status_da_liquidacao, only: [:destroy]
	before_action :set_liquidacao, only: [:editar_itens, :atualiza_itens, :busca_itens, :adiciona_itens]
	before_action :set_item_da_nota_fiscal, only: [:destroy]
	before_action :disponibiliza_dependencias_itens, only: [:editar_itens, :atualiza_itens, :adiciona_itens]
	before_action -> {verifica_mes_bloqueado(@item_da_nota_fiscal)}, only: [:destroy, :editar_itens, :atualiza_itens, :busca_itens, :adiciona_itens]


	# DELETE /contabilidade/itens_da_nota_fiscal/1
	def destroy
		bloqueia_usuario_com_base_em :create, "administrativo/liquidacoes"
		if @item_da_nota_fiscal.liquidacao.estornada?
			redirect_to :back, alert: 'Não é possível excluir itens para uma liquidação estornada.'
		else
			mensagem = apaga_e_retorna_mensagem(@item_da_nota_fiscal)
			redirect_to rota_liquidacao( @item_da_nota_fiscal.liquidacao ) + "?tab=itens", mensagem
		end
	end

	# GET /administrativo/liquidacoes/itens_da_nota_fiscal/1
	def editar_itens
		bloqueia_usuario_com_base_em :create, "administrativo/liquidacoes"

		if params[:todos].present? && params[:todos] == "true"
			itens_existentes = @liquidacao.itens_da_nota_fiscal.map(&:item)
			itens_restantes = @itens - itens_existentes
			@liquidacao.adicionar_todos_itens = true
			itens_restantes.each do |item|
				@liquidacao.itens_da_nota_fiscal.build(item: item)
			end
		elsif params[:todas_quantidades].present?
			itens_existentes = @liquidacao.itens_da_nota_fiscal.map(&:item)
			itens_restantes = @itens - itens_existentes

			@liquidacao.itens_da_nota_fiscal.each do |item_da_nota|
				item_do_empenho = @liquidacao.empenho.itens_do_empenho.find_by(item_id: item_da_nota.item_id)
				quantidade = item_do_empenho.quantidade_disponivel_a_liquidar
				total = quantidade * item_do_empenho.valor_unitario

				item_da_nota.quantidade = quantidade
				item_da_nota.total = total
			end
			itens_restantes.each do |item|
				item_do_empenho = @liquidacao.empenho.itens_do_empenho.find_by(item_id: item.id)
				quantidade = item_do_empenho.quantidade_disponivel_a_liquidar
				total = quantidade * item_do_empenho.valor_unitario

				@liquidacao.itens_da_nota_fiscal.build(item: item, quantidade: quantidade, total: total)
			end
		else
			@liquidacao.itens_da_nota_fiscal.build if @liquidacao.itens_da_nota_fiscal.empty?
			if @liquidacao.empenho.empenho_de_folha? && @liquidacao.descrimina_itens_processo_ou_empenho? == false
				@liquidacao.itens_da_nota_fiscal.last.item_id = Base::Item.find_by(descricao: "FOLHA DE PAGAMENTO").try(:id)
			end
		end
	end

	# PATCH /administrativo/liquidacoes/itens_da_nota_fiscal/1
	def atualiza_itens
		bloqueia_usuario_com_base_em :create, "administrativo/liquidacoes"
		if @liquidacao.update(liquidacao_params)
			if params[:cadastrar_proxima].present?
				proxima_liquidacao = @liquidacao.proxima_liquidacao_filha
				redirect_to administrativo_editar_itens_liquidacao_path(proxima_liquidacao), notice: 'Itens foram atualizados com sucesso'
			elsif logado_na_contabilidade? && @liquidacao.nota_fiscal.present? && @liquidacao.nota_fiscal.tipo_de_emissao.present? && @liquidacao.nota_fiscal.cadastrar_retencoes? && !@liquidacao.possui_retencoes?
				redirect_to contabilidade_edit_retencoes_liquidacao_path(@liquidacao), notice: 'Itens foram atualizados com sucesso'
			elsif logado_na_contabilidade? && @liquidacao.tem_folha_de_pagamento? && !@liquidacao.possui_retencoes?
				redirect_to contabilidade_editar_retencoes_de_folha_path(@liquidacao), notice: 'Itens foram atualizados com sucesso'
			else
				if logado_na_contabilidade?
					redirect_to contabilidade_liquidacao_path(@liquidacao), notice: 'Liquidações salvas com sucesso'
				elsif logado_no_administrativo?
					redirect_to administrativo_liquidacao_path(@liquidacao), notice: 'Liquidações salvas com sucesso'
				elsif logado_na_controladoria?
					redirect_to controladoria_liquidacao_path(@liquidacao), notice: 'Liquidações salvas com sucesso'
				end
			end
		else
			flash.now[:alert] = 'Não foi possível adicionar os itens.' + @liquidacao.errors.full_messages.join(',')
			render :editar_itens
		end
	end

	# GET /administrativo/liquidacoes/itens_da_nota_fiscal/1/busca_itens
	def busca_itens
		bloqueia_usuario_com_base_em :create, "administrativo/liquidacoes"
		disponibiliza_dependencias_busca_itens
		@q = Base::Item.where(id: @itens.pluck(:id)).search(params[:q])
		@itens = params[:q].try(:values).try(:delete_if, &:empty?).try(:present?) ? @q.result(distinct: false) : []
		if @itens.size > 100
			@qtd_removida = @itens.size - 100
			@itens = @itens.limit(100)
		end
	end

	# PATCH /administrativo/liquidacoes/itens_da_nota_fiscal/1/adiciona_itens
	def adiciona_itens
		bloqueia_usuario_com_base_em :create, "administrativo/liquidacoes"
		if params[:itens] && params[:itens].size > 0
			quantidade = @liquidacao.adiciona_itens(params[:itens])
			render :editar_itens
		else
			redirect_to administrativo_busca_itens_liquidacao_path(@liquidacao), notice: 'Nenhum item foi selecionado.'
		end
	end

	private
	def set_item_da_nota_fiscal
		@item_da_nota_fiscal = Contabilidade::ItemDaNotaFiscal.find(params[:id])
	end

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

	def verifica_status_da_liquidacao
		@liquidacao = Contabilidade::Liquidacao.find(params[:liquidacao_id])
		unless @liquidacao.solicitado? || @liquidacao.confirmado?
			redirect_back(fallback_location: rota_liquidacao(@liquidacao), alert: 'Não é possível adicionar itens para esta liquidação.')
		end
	end

	def disponibiliza_dependencias
		if @item_da_nota_fiscal.liquidacao.empenho.itens_do_empenho.size > 0
			@itens = Base::Item.where("id in (?)", @item_da_nota_fiscal.liquidacao.empenho.itens_do_empenho.pluck(:item_id)).order(:unidade_de_medida_id)
		else
			@itens = Base::Item.order(:unidade_de_medida_id)
		end
	end

	def disponibiliza_dependencias_itens
		@ncms = Ncm.order(:codigo).all
		@ncms_select = @ncms.map { |ncm|
			[
				ncm.codigo,
				ncm.id
			]
		}

		empenho = @liquidacao.empenho
		if @liquidacao.descrimina_itens_processo_ou_empenho?
			if empenho.itens_do_empenho.present?
				@itens = empenho.itens_do_empenho.map(&:item)
				@itens_select = empenho.itens_do_empenho.map { |item_do_empenho|
					[
						item_do_empenho.item.codigo_descricao_unidade_codigo_da_prefeitura,
						item_do_empenho.item.id,
						{
							"data-valor-unitario" => item_do_empenho.valor_unitario,
							"data-saldo" => item_do_empenho.quantidade_disponivel_a_liquidar,
							"data-periodicidade" => item_do_empenho.try(:item_do_contrato).try(:item_do_pedido).try(:periodicidade_e_unidade_de_medida)
						}
					]
				}
			elsif empenho.derivado_de_contrato?
				@itens = empenho.contrato.itens_do_contrato.map(&:item)
				@itens_select = empenho.contrato.itens_do_contrato.map { |item_do_lote|
					[
						item_do_lote.item.codigo_descricao_unidade_codigo_da_prefeitura,
						item_do_lote.item.id
					]
				}
			elsif empenho.compra_direta?
				@itens = empenho.projeto.itens_do_lote.map(&:item)
				@itens_select = empenho.projeto.itens.map { |item|
					[
						item.codigo_descricao_unidade_codigo_da_prefeitura,
						item.id
					]
				}
			else
				@itens = Base::Item.includes(:unidade_de_medida).all.map { |item|
					[
						item.codigo_descricao_unidade_codigo_da_prefeitura,
						item.id
					]
				}
				@itens_select = @itens
			end
		else
			@itens = Base::Item.includes(:unidade_de_medida).all.map { |item|
				[
					item.codigo_descricao_unidade_codigo_da_prefeitura,
					item.id
				]
			}
			@itens_select = @itens
		end
	end

	def disponibiliza_dependencias_busca_itens
		empenho = @liquidacao.empenho

		if @liquidacao.descrimina_itens_processo_ou_empenho?
			if empenho.itens_do_empenho.any?
				@itens = empenho.itens_do_empenho
			elsif empenho.derivado_de_contrato?
				@itens = empenho.contrato.itens_do_contrato
			elsif empenho.compra_direta?
				@itens = empenho.projeto.itens_do_lote
			else
				@itens = Base::Item.all
			end
		else
			@itens = Base::Item.all
		end
	end

	# Permite apenas os parâmetros específicos
	def liquidacao_params
		params.require(:contabilidade_liquidacao).permit(
			:adicionar_todos_itens,
			itens_da_nota_fiscal_attributes: [:id,:logado_na_contabilidade, :ncm_id, :liquidacao_id, :item_id, :quantidade, :valor_unitario, :total, :_destroy]
		)
	end
end
