module Patrimonio
class TransferenciasController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!, except: [:imprimir]
	before_action :autoriza_usuario!, except: [:imprimir]
	before_action :set_transferencia, only: [:show, :edit, :update, :destroy, :editar_itens_da_transferencia, :atualiza_itens_da_transferencia, :enviar_ao_patrimonio, :confirmar_transferencia, :recusar_transferencia, :retornar_para_aberto, :imprimir]
	before_action :set_dependencias, only: [:index, :new, :edit]
	before_action :disponibiliza_dependencias, only: [:new, :edit]

	# GET /patrimonio/transferencias
	def index
		@q = Transferencia.where(unidade_gestora_origem: current_usuario.unidades_gestoras_do_usuario_do_exercicio(contexto_atual.id)).order('patrimonio_transferencias.data_da_transferencia desc, patrimonio_transferencias.numero_da_transferencia desc').search(params[:q])
		@status = Transferencia.status
		respond_to do |format|
			format.html do
				@transferencias = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
			end
	
			format.pdf do
				titulo1 = 'Listagem de Transferências'
				titulo2 = ''
				titulo3 = ''
				@transferencias = @q.result(distinct: false)
				render pdf: "recebimentos",
							 template: 'patrimonio/transferencias/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 })
			end
		end
	
		@configuracoes = Configuracao.last
	end

	# GET /patrimonio/transferencias/1
	def show
	end

	# GET /patrimonio/transferencias/new
	def new
		@transferencia = Transferencia.new
		if @transferencia.dados_dos_destinos_das_transferencias.empty?
			@transferencia.dados_dos_destinos_das_transferencias.build
		end
	end

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

	# POST /patrimonio/transferencias
	def create
		@transferencia = Transferencia.new(transferencia_params)
		@transferencia.orcamento = contexto_atual
		if @transferencia.save
			redirect_to @transferencia, notice: 'Transferencia foi criado(a) com sucesso.'
		else
			render :new
		end
	end

	# PATCH/PUT /patrimonio/transferencias/1
	def update
		if @transferencia.update( transferencia_params )
			redirect_to @transferencia, notice: 'Transferencia foi atualizado(a) com sucesso.'
		else
			render :edit
		end
	end

	# DELETE /patrimonio/transferencias/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@transferencia)
		redirect_to patrimonio_transferencias_url, mensagem
	end

	def editar_itens_da_transferencia
		@transferencia.itens_da_transferencia.build unless @transferencia.itens_da_transferencia.present?
		disponibiliza_dependencias_itens_da_transferencia
		
	end

	def atualiza_itens_da_transferencia
		return if bloqueia_usuario_com_base_em 'editar_itens_da_transferencia'
		@transferencia.transaction do
			if @transferencia.update(itens_da_transferencia_params)
				mensagem = 'Itens atualizados com sucesso.'
				redirect_to patrimonio_transferencia_path(@transferencia), notice: mensagem
			else
				disponibiliza_dependencias_itens_da_transferencia
				render :editar_itens_da_transferencia
			end
		rescue Exception => e
			disponibiliza_dependencias_itens_da_transferencia
			render :editar_itens_da_transferencia
			raise ActiveRecord::Rollback
		end
	end

	def enviar_ao_patrimonio
		if @transferencia.enviar_ao_patrimonio!
			redirect_to patrimonio_transferencia_path(@transferencia), notice: "Transferência enviado ao patrimônio."
		else
			render :show
		end
	end

	def confirmar_transferencia
		if @transferencia.confirmar_transferencia!
			redirect_to patrimonio_transferencia_path(@transferencia), notice: "Transferência confirmada."
		else
			render :show
		end
	end

	def recusar_transferencia
		@transferencia.motivo_da_recusa = transferencia_params[:motivo_da_recusa]
		if @transferencia.recusar_transferencia!
			redirect_to patrimonio_transferencia_path(@transferencia), notice: "Transferência recusada e enviada de volta para o administrativo."
		else
			render :show
		end
	end

	def retornar_para_aberto
		if @transferencia.retornar_para_aberto!
			redirect_to patrimonio_transferencia_path(@transferencia), notice: "Transferência reaberta."
		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_transferencia_path(@transferencia), alert: 'Relatório não encontrado'
    end
  end

  def termo_de_responsabilidade_sintetica
		@configuracoes = Configuracao.last
		@unidade_gestora = @transferencia.unidade_gestora_origem

		@responsavel_relatorio = params[:responsavel_relatorio] if params[:responsavel_relatorio].present?
		@cargo_relatorio = params[:cargo_relatorio] if params[:cargo_relatorio].present?
		@matricula_relatorio = params[:matricula_relatorio] if params[:matricula_relatorio].present?
		@responsavel_relatorio_destino = params[:responsavel_relatorio_destino] if params[:responsavel_relatorio_destino].present?
		@cargo_relatorio_destino = params[:cargo_relatorio_destino] if params[:cargo_relatorio_destino].present?
		@matricula_relatorio_destino = params[:matricula_relatorio_destino] if params[:matricula_relatorio_destino].present?

    render_to_string pdf: "Termo de Movimentação",
      template: "patrimonio/transferencias/relatorios/termo_de_responsabilidade_sintetica.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 termo_de_responsabilidade_analitica
		@configuracoes = Configuracao.last
		@unidade_gestora = @transferencia.unidade_gestora_origem

    render_to_string pdf: "Termo de Movimentação",
      template: "patrimonio/transferencias/relatorios/termo_de_responsabilidade_analitica.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 termo_de_transferencia
		@configuracoes = Configuracao.last
		@unidade_gestora = @transferencia.unidade_gestora_origem

    render_to_string pdf: "Termo de transferencia",
      template: "patrimonio/transferencias/relatorios/termo_de_transferencia.pdf.slim",
      orientation: 'Portrait',
      disable_smart_shrinking: true,

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

  def termo_de_recolhimento
		@configuracoes = Configuracao.last
		@unidade_gestora = @transferencia.unidade_gestora_origem

    render_to_string pdf: "Termo de Recolhimento",
      template: "patrimonio/transferencias/relatorios/termo_de_recolhimento.pdf.slim",
      orientation: 'Portrait',
      disable_smart_shrinking: true,

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

  def envio_dos_bens
		@configuracoes = Configuracao.last
		@unidade_gestora = @transferencia.unidade_gestora_origem

    render_to_string pdf: "Envio dos Bens",
      template: "patrimonio/transferencias/relatorios/envio_dos_bens.pdf.slim",
      orientation: 'Portrait',
      disable_smart_shrinking: true,

      dpi: '96',
      header: {
        html: {
          template: 'layouts/_cabecalho_pdf_central_patrimonio.html.slim',
          locals: {
            titulo1: "TERMO DE REPARO - ENVIO DOS BENS"
          }
        },
        spacing: 5
      },
      footer: {
        html: {
          template: 'layouts/_rodape_pdf.html.slim'
        }
      },
      margin: @configuracoes.margens_customizadas
  end

  def retorno_de_bens
		@configuracoes = Configuracao.last
		@unidade_gestora = @transferencia.unidade_gestora_origem

    render_to_string pdf: "Retorno de Bens",
      template: "patrimonio/transferencias/relatorios/retorno_de_bens.pdf.slim",
      orientation: 'Portrait',
      disable_smart_shrinking: true,

      dpi: '96',
      header: {
        html: {
          template: 'layouts/_cabecalho_pdf_central_patrimonio.html.slim',
          locals: {
            titulo1: "TERMO DE REPARO - RETORNO DE BENS"
          }
        },
        spacing: 5
      },
      footer: {
        html: {
          template: 'layouts/_rodape_pdf.html.slim'
        }
      },
      margin: @configuracoes.margens_customizadas
  end

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

	private
	def set_transferencia
		@transferencia = Transferencia.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.order('codigo ASC')

	end

	def disponibiliza_dependencias
		if @transferencia.present?
			@centro_origem = [@transferencia.centro_de_custo_origem]
			@centros_destinos = []
			@transferencia.dados_dos_destinos_das_transferencias.each do |dado|
				@centros_destinos << dado.centro_de_custo_destino
			end
		else
			@centros_destinos = [] #AJAX
			@centro_origem = [] #AJAX
		end
	end

	def disponibiliza_dependencias_itens_da_transferencia
		@unidades = Loa::UnidadeGestora.ativo_no_sistema.where(id: @transferencia.dados_dos_destinos_das_transferencias.pluck(:unidade_gestora_destino_id))
		@centros_de_custo = Controladoria::CentroDeCusto.where(id: @transferencia.dados_dos_destinos_das_transferencias.pluck(:centro_de_custo_destino_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 = ?',
		#	@transferencia.unidade_gestora_origem, @transferencia.centro_de_custo_origem).includes(:item).order('id ASC')
		@bens_patrimoniais = []

		# @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 = ?', @transferencia.unidade_gestora_origem, @transferencia.centro_de_custo_origem).distinct.order('id ASC')

		#@itens = @itens.filter {|item| item.quantidade_de_bens_com_mesmo_item_e_mesma_unidade_gestora_e_centro_de_custo(@transferencia.unidade_gestora_origem.id, @transferencia.centro_de_custo_origem.id) != 0}
		@itens = []
	end

	# Permite apenas os parâmetros específicos
	def transferencia_params
		params.require(:patrimonio_transferencia).permit(
			:unidade_gestora_origem_id, :centro_de_custo_origem_id, :responsavel_origem_id, :data_da_transferencia, :historico, :motivo_da_recusa, :tipo,
			dados_dos_destinos_das_transferencias_attributes: [ :id, :transferencia_id, :unidade_gestora_destino_id, :centro_de_custo_destino_id, :responsavel_destino_id, :_destroy ]
		)	
	end

	def itens_da_transferencia_params
		params.require(:patrimonio_transferencia).permit(
			itens_da_transferencia_attributes: [:id, :item_id, :bem_patrimonial_id, :unidade_gestora_id, :centro_de_custo_id, :quantidade_solicitada, :_destroy ]
		)	
	end
end
end
