module Patrimonio
class RequisicoesPatrimoniaisController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!, except: [:imprimir]
	before_action :autoriza_usuario!, except: [:imprimir]
	before_action :set_requisicao_patrimonial, only: [
		:show, :edit, :update, :destroy, :editar_itens_da_requisicao, :atualiza_itens_da_requisicao, :enviar_requisicao_ao_patrimonio,
		:confirmar_requisicao, :recusar_requisicao, :retornar_requisicao_para_aberto, :aguardar_documentos_da_requisicao_patrimonial,
		:imprimir, :editar_itens_em_lote_da_requisicao, :atualiza_itens_em_lote_da_requisicao, :excluir_item_da_requisicao,
		:excluir_bem_da_requisicao
	]
	before_action :set_dependencias, only: [:index, :new, :edit]

	# GET /patrimonio/requisicoes_patrimoniais
	def index
		@q = RequisicaoPatrimonial.where(unidade_gestora: current_usuario.unidades_gestoras_do_usuario_do_exercicio(contexto_atual.id)).order(created_at: :desc).search(params[:q])
		respond_to do |format|
			format.html do
				@requisicoes_patrimoniais = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
			end
	
			format.pdf do
				titulo1 = 'Listagem de Requisições Patrimoniais'
				titulo2 = ''
				titulo3 = ''
				@requisicoes_patrimoniais = @q.result(distinct: false)
				render pdf: "recebimentos",
							 template: 'patrimonio/requisicoes_patrimoniais/index.pdf.slim',
							 orientation: 'Landscape',
							 header: {
								 html: {
									 template: 'layouts/_cabecalho_pdf.html.slim',
									 locals: {
										 titulo1: titulo1,
										 titulo2: titulo2,
										 titulo3: titulo3
									 }
								 },
								 spacing: 0
							 },
							 footer: {
								 right: '[page]',
								 font_size: 8
							 },
							 disable_smart_shrinking: true,
							 dpi: '96',
							 margin: (@configuracoes&.margens_customizadas(top: 30) || { top: 30 }) # Valor padrão se @configuracoes for nil
			end
		end
	
		@configuracoes = Configuracao.last
	end

	# GET /patrimonio/requisicoes_patrimoniais/1
	def show
	end

	# GET /patrimonio/requisicoes_patrimoniais/new
	def new
		@requisicao_patrimonial = RequisicaoPatrimonial.new
		if @requisicao_patrimonial.dados_dos_destinos_das_requisicoes.empty?
			@requisicao_patrimonial.dados_dos_destinos_das_requisicoes.build
		end
	end

	# GET /patrimonio/requisicoes_patrimoniais/1/edit
	def edit
	end

	# POST /patrimonio/requisicoes_patrimoniais
	def create
		@requisicao_patrimonial = RequisicaoPatrimonial.new(requisicao_patrimonial_params)
		@requisicao_patrimonial.orcamento = contexto_atual
		if @requisicao_patrimonial.save
			redirect_to @requisicao_patrimonial, notice: 'Requisicao patrimonial foi criado(a) com sucesso.'
		else
			render :new
		end
	end

	# PATCH/PUT /patrimonio/requisicoes_patrimoniais/1
	def update
		if @requisicao_patrimonial.update( requisicao_patrimonial_params )
			redirect_to @requisicao_patrimonial, notice: 'Requisicao patrimonial foi atualizado(a) com sucesso.'
		else
			render :edit
		end
	end

	# DELETE /patrimonio/requisicoes_patrimoniais/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@requisicao_patrimonial)
		redirect_to patrimonio_requisicoes_patrimoniais_url, mensagem
	end

	# DELETE ITEM DA REQUISICAO
	def excluir_item_da_requisicao
		@itens_da_requisicao = Patrimonio::ItemDaRequisicaoPatrimonial.where(requisicao_patrimonial_id: params[:id], item: params[:item])
		@itens_da_requisicao.each do |item|
			apaga_e_retorna_mensagem(item)
		end

		redirect_to patrimonio_requisicao_patrimonial_path(@requisicao_patrimonial), notice: 'Registro apagado com sucesso'
	end

	# DELETE BEM PATRIMONIAL ASSOCIADO AO ITEM DA REQUISICAO
	def excluir_bem_da_requisicao
		@bem_patrimonial_da_requisicao = Patrimonio::BemPatrimonialDaRequisicao.find_by(id: params[:bem], item_da_requisicao_patrimonial_id: params[:item])

		mensagem = apaga_e_retorna_mensagem(@bem_patrimonial_da_requisicao)
		redirect_to patrimonio_requisicao_patrimonial_path(@requisicao_patrimonial), mensagem
	end

	def editar_itens_da_requisicao
		@requisicao_patrimonial.itens_da_requisicao_patrimonial.build unless @requisicao_patrimonial.itens_da_requisicao_patrimonial.present?
		disponibiliza_dependencias_itens
	end

	def atualiza_itens_da_requisicao
		return if bloqueia_usuario_com_base_em 'editar_itens_da_requisicao'
		@requisicao_patrimonial.transaction do
			if @requisicao_patrimonial.update(itens_da_requisicao_patrimonial_params)
				mensagem = 'Itens atualizados com sucesso.'
				redirect_to patrimonio_requisicao_patrimonial_path(@requisicao_patrimonial), notice: mensagem
			else
				disponibiliza_dependencias_itens
				render :editar_itens_da_requisicao
			end
		rescue Exception => e
			disponibiliza_dependencias_itens
			render :editar_itens_da_requisicao
			raise ActiveRecord::Rollback
		end
	end

	def editar_itens_em_lote_da_requisicao
		disponibiliza_dependencias_itens
		@itens_requisicao = []
		@requisicao_patrimonial.itens_da_requisicao_patrimonial.build
	end

	def atualiza_itens_em_lote_da_requisicao
		return if bloqueia_usuario_com_base_em 'editar_itens_em_lote_da_requisicao'
		@requisicao_patrimonial.transaction do
			if @requisicao_patrimonial.update(itens_da_requisicao_em_lote_patrimonial_params)
				mensagem = 'Itens atualizados com sucesso.'
				redirect_to patrimonio_requisicao_patrimonial_path(@requisicao_patrimonial), notice: mensagem
			else
				disponibiliza_dependencias_itens
				render :editar_itens_em_lote_da_requisicao
			end
		rescue Exception => e
			disponibiliza_dependencias_itens
			render :editar_itens_em_lote_da_requisicao
			raise ActiveRecord::Rollback
		end
	end

	def enviar_requisicao_ao_patrimonio
		if @requisicao_patrimonial.enviar_requisicao_ao_patrimonio!
			redirect_to patrimonio_requisicao_patrimonial_path(@requisicao_patrimonial), notice: "Requisição Patrimonial enviado ao patrimônio."
		else
			render :show
		end
	end

	def confirmar_requisicao
		if @requisicao_patrimonial.confirmar_requisicao!
			redirect_to patrimonio_requisicao_patrimonial_path(@requisicao_patrimonial), notice: "Requisição Patrimonial confirmada."
		else
			render :show
		end
	end

	def recusar_requisicao
		@requisicao_patrimonial.motivo_da_recusa = requisicao_patrimonial_params[:motivo_da_recusa]
		if @requisicao_patrimonial.recusar_requisicao!
			redirect_to patrimonio_requisicao_patrimonial_path(@requisicao_patrimonial), notice: "Requisição Patrimonial recusada e enviada de volta para o administrativo."
		else
			render :show
		end
	end

	def retornar_requisicao_para_aberto
		if @requisicao_patrimonial.retornar_requisicao_para_aberto!
			redirect_to patrimonio_requisicao_patrimonial_path(@requisicao_patrimonial), notice: "Requisição Patrimonial reaberta."
		else
			render :show
		end
	end

	def aguardar_documentos_da_requisicao_patrimonial
		if @requisicao_patrimonial.aguardar_documentos_da_requisicao_patrimonial!
			if @requisicao_patrimonial.confirmado?
				redirect_to patrimonio_requisicao_patrimonial_path(@requisicao_patrimonial), notice: "Requisição Patrimonial Aguardando documentos."
			else
				redirect_to patrimonio_requisicao_patrimonial_path(@requisicao_patrimonial), notice: "Requisição Patrimonial confirmada."
			end
		else
			render :show
		end
	end

	#----------------------------------------------------------------------------#

	def imprimir
    relatorio = params[:relatorio]
    
    if respond_to? relatorio.to_s, :private
      loa = CombinePDF.new
      loa << CombinePDF.parse(send(relatorio))
      loa.number_pages(location: :bottom_right, margin_from_height: 0, number_format: '%s', font_size: 8)
      send_data loa.to_pdf, filename: "#{relatorio}.pdf", type: "application/pdf", disposition: 'inline'
    else
      redirect_to patrimonio_requisicao_patrimonial_path(@requisicao_patrimonial), alert: 'Relatório não encontrado'
    end
  end

  def termo_de_movimentacao
		@configuracoes = Configuracao.last
		@unidade_gestora = @requisicao_patrimonial.unidade_gestora

    render_to_string pdf: "Termo de Movimentação",
      template: "patrimonio/requisicoes_patrimoniais/relatorios/termo_de_movimentacao.pdf.slim",
      orientation: 'Portrait',
      disable_smart_shrinking: true,

      dpi: '96',
      header: {
        html: {
          template: 'layouts/_cabecalho_pdf_central_patrimonio.html.slim',
          locals: {
            titulo1: "TERMO DE MOVIMENTAÇÃO"
          }
        },
        spacing: 5
      },
      footer: {
        html: {
          template: 'layouts/_rodape_pdf.html.slim'
        }
      },
      margin: @configuracoes.margens_customizadas
  end

  def requisicao_patrimonial
		@configuracoes = Configuracao.last
		@unidade_gestora = @requisicao_patrimonial.unidade_gestora

    render_to_string pdf: "Requisição Patrimonial",
      template: "patrimonio/requisicoes_patrimoniais/relatorios/requisicao_patrimonial.pdf.slim",
      orientation: 'Portrait',
      disable_smart_shrinking: true,

      dpi: '96',
      header: {
        html: {
          template: 'layouts/_cabecalho_pdf_central_patrimonio.html.slim',
          locals: {
            titulo1: "Requisição Patrimonial"
          }
        },
        spacing: 5
      },
      footer: {
        html: {
          template: 'layouts/_rodape_pdf.html.slim'
        }
      },
      margin: @configuracoes.margens_customizadas
  end

	#----------------------------------------------------------------------------#

	private
	def set_requisicao_patrimonial
		@requisicao_patrimonial = RequisicaoPatrimonial.find( params[:id] )
	end

	def set_dependencias
		bens_patrimoniais = BemPatrimonial.where(unidade_gestora: current_usuario.unidades_gestoras_do_usuario_do_exercicio(contexto_atual.id)).pluck(:unidade_gestora_id).uniq
		@unidades_gestoras = Loa::UnidadeGestora.ativo_no_sistema.where(id: bens_patrimoniais).order('codigo ASC')
		if @requisicao_patrimonial.present?
			@centro_origem = [@requisicao_patrimonial.centro_de_custo]
			@centros_destinos = []
			@requisicao_patrimonial.dados_dos_destinos_das_requisicoes.each do |dado|
				@centros_destinos << dado.centro_de_custo if dado.centro_de_custo.present?
			end
		else
			@centros_destinos = [] #AJAX
			@centro_origem = [] #AJAX
		end
	end

	def disponibiliza_dependencias_itens
		@unidades = Loa::UnidadeGestora.where(id: @requisicao_patrimonial.dados_dos_destinos_das_requisicoes.pluck(:unidade_gestora_id))
		@centros_de_custo = Controladoria::CentroDeCusto.where(id: @requisicao_patrimonial.dados_dos_destinos_das_requisicoes.pluck(:centro_de_custo_id))
	
		#@bens_patrimoniais = Patrimonio::BemPatrimonial.joins(:localizacao_atual).where('patrimonio_bens_patrimoniais.status = 1
		#	and patrimonio_bens_patrimoniais.unidade_gestora_id = ? and patrimonio_localizacoes_dos_bens.centro_de_custo_id = ?',
		#	@requisicao_patrimonial.unidade_gestora, @requisicao_patrimonial.centro_de_custo).includes(:item).order('id ASC')
		@bens_patrimoniais = [] # AJAX
		
		#@itens = Base::Item.joins(bens_patrimoniais: [:unidade_gestora, :localizacoes_dos_bens]).where('patrimonio_bens_patrimoniais.unidade_gestora_id = ?
		#	and patrimonio_bens_patrimoniais.status = 1 and patrimonio_localizacoes_dos_bens.centro_de_custo_id = ?', @requisicao_patrimonial.unidade_gestora, @requisicao_patrimonial.centro_de_custo).distinct.order('id ASC')
		
		#@itens = @itens.filter {|item| item.quantidade_de_bens_com_mesmo_item_e_mesma_unidade_gestora_e_centro_de_custo(@requisicao_patrimonial.unidade_gestora.id, @requisicao_patrimonial.centro_de_custo.id) != 0}
		@itens = [] # AJAX
		
		@bens_patrimoniais_por_itens = []
	end

	# Permite apenas os parâmetros específicos
	def requisicao_patrimonial_params
		params.require(:patrimonio_requisicao_patrimonial).permit(
			:data_da_requisicao, :codigo, :unidade_gestora_id, :centro_de_custo_id, :responsavel_id, :status, :orcamento_id, :observacao, :motivo_da_recusa, :tipo,
			dados_dos_destinos_das_requisicoes_attributes: [ :id, :requisicao_patrimonial_id, :unidade_gestora_id, :centro_de_custo_id, :responsavel_id, :_destroy ]
		)
	end

	def itens_da_requisicao_patrimonial_params
		params.require(:patrimonio_requisicao_patrimonial).permit(
			itens_da_requisicao_patrimonial_attributes: [:id, :requisicao_patrimonial_id, :unidade_gestora_id, :centro_de_custo_id, :item_id, :quantidade_solicitada, :bem_patrimonial_id, :_destroy ]
		)	
	end

	def itens_da_requisicao_em_lote_patrimonial_params
		params.require(:patrimonio_requisicao_patrimonial).permit(
			itens_da_requisicao_patrimonial_attributes: 
				[
					:id, :requisicao_patrimonial_id, :unidade_gestora_id, :centro_de_custo_id, 
					:item_id, :quantidade_solicitada, :bem_patrimonial_id, :_destroy,
					bens_patrimoniais_da_requisicao_attributes: 
					[
						:id, :item_da_requisicao_patrimonial_id, :bem_id, :_destroy
					]
				]
		)	
	end
end
end
