module Patrimonio
class BensPatrimoniaisController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!, except: [:imprimir]
	before_action :autoriza_usuario!, except: [:imprimir]
	before_action :set_bem_patrimonial, only: %i[show edit update destroy editar_fotos_do_bem atualizar_fotos_do_bem item_patrimonial_tombado imprimir]
	before_action :set_dependencias, only: %i[index item_patrimonial_tombado]

	# GET /patrimonio/bens_patrimoniais
	def index
		if params[:q].present?
			@tipo_de_tela = params[:q][:bens_patrimoniais] if params[:q].present?
		else
			@tipo_de_tela = params[:bens_patrimoniais]
		end
		if @tipo_de_tela.present?
			@q = BemPatrimonial.where(unidade_gestora: current_usuario.unidades_gestoras_do_usuario_do_exercicio(contexto_atual.id)).select("DISTINCT ON (item_id) *").ransack(params[:q])
		else
			bens_patrimoniais = BemPatrimonial.where(unidade_gestora: current_usuario.unidades_gestoras_do_usuario_do_exercicio(contexto_atual.id)).pluck(:unidade_gestora_id).uniq
			@unidades_gestoras_por_bem = Loa::UnidadeGestora.where(id: bens_patrimoniais).order('codigo ASC')
			@q = BemPatrimonial.joins(:unidade_gestora).where(unidade_gestora: current_usuario.unidades_gestoras_do_usuario_do_exercicio(contexto_atual.id)).select("DISTINCT ON (patrimonio_bens_patrimoniais.unidade_gestora_id) *").search(params[:q])
		end
		@bens_patrimoniais = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)

		respond_to do |format|
			format.html
			format.json
		end
	end

	# GET /patrimonio/bens_patrimoniais/1
	def show
		respond_to do |format|
			format.html
			format.json
		end
	end

	def exibir_por_unidade_gestora
		@unidade_gestora = Loa::UnidadeGestora.find( params[:unidade_gestora_id] )
		@q = BemPatrimonial.where(unidade_gestora: @unidade_gestora ).ransack(params[:q])
		@bens_patrimoniais = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
	end

	# GET /patrimonio/bens_patrimoniais/new
	def new
		@bem_patrimonial = BemPatrimonial.new
	end

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

	# POST /patrimonio/bens_patrimoniais
	def create
		@bem_patrimonial = BemPatrimonial.new(bem_patrimonial_params)

		if @bem_patrimonial.save
			redirect_to @bem_patrimonial, notice: 'Bem patrimonial foi criado(a) com sucesso.'
		else
			render :new
		end
	end

	# PATCH/PUT /patrimonio/bens_patrimoniais/1
	def update
		if @bem_patrimonial.update( bem_patrimonial_params )
			redirect_to @bem_patrimonial, notice: 'Bem patrimonial foi atualizado(a) com sucesso.'
		else
			render :edit
		end
	end

	# DELETE /patrimonio/bens_patrimoniais/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@bem_patrimonial)
		redirect_to patrimonio_bens_patrimoniais_url, mensagem
	end

	def editar_fotos_do_bem
		dependecias_multiplas
	end

	def atualizar_fotos_do_bem
		dependecias_multiplas

		if @bem_patrimonial.update(bem_patrimonial_params)
			if bem_patrimonial_params[:eh_de_recebimento].present? && bem_patrimonial_params[:eh_de_recebimento] == "true"
				@bem_patrimonial.gerar_foto_dos_outros_bens_de_msm_recebimento

				redirect_to patrimonio_recebimento_de_bem_path(@bem_patrimonial.recebimento_de_bem.id), notice: 'Fotos cadastradas com sucesso !'
			else
				redirect_to @bem_patrimonial, alert: 'Fotos deletadas com sucesso !'
			end
		else
			render :editar_fotos_do_bem
		end
	end

	def item_patrimonial_tombado
		@q = BemPatrimonial.order(:id).search(params[:q])
		@tombamentos = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
	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_bem_patrimonial_path(@bem_patrimonial), alert: 'Relatório não encontrado'
    end
  end

  def termo_de_guarda_patrimonial
		@configuracoes = Configuracao.last
		@unidade_gestora = @bem_patrimonial.unidade_gestora

		@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?

    render_to_string pdf: "Termo de Guarda Patrimonial",
      template: "patrimonio/bens_patrimoniais/relatorios/termo_de_guarda_patrimonial.pdf.slim",
      orientation: 'Portrait',
      disable_smart_shrinking: true,

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

  def nota_de_tombamento_patrimonial
		@configuracoes = Configuracao.last
		@unidade_gestora = @bem_patrimonial.unidade_gestora

    render_to_string pdf: "Termo de Guarda Patrimonial",
      template: "patrimonio/bens_patrimoniais/relatorios/nota_de_tombamento.pdf.slim",
      orientation: 'Portrait',
      disable_smart_shrinking: true,

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

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

	private
	def set_bem_patrimonial
		@bem_patrimonial = BemPatrimonial.find( params[:id] )
	end

	def set_dependencias
		@unidades_gestoras = contexto_atual.unidades_gestoras.all
	end

	def dependecias_multiplas
		@eh_de_recebimento = params[:eh_de_recebimento] if params[:eh_de_recebimento].present?
	end

	# Permite apenas os parâmetros específicos
	def bem_patrimonial_params
		params.require(:patrimonio_bem_patrimonial).permit(
			:item_do_recebimento_de_bem_id, :numero_do_tombamento, :status, :descricao, :orcamento_id,
			:data_do_tombamento, :unidade_gestora_id, :dados_extras_do_bem_id, :eh_de_recebimento,
			conservacoes_dos_bens_attributes: [
				:id, 
				:bem_patrimonial_id, 
				:estado_do_bem, 
				:status
			],
			fotos_do_bem_patrimonial_attributes: [
				:id, 
				:foto,
				:_destroy,
			]
		)
	end

	def responsavel_do_bem_patrimonial_params
		params.require(:patrimonio_responsavel_do_bem_patrimonial).permit(:bem_patrimonial_id, :pessoa_id)
	end
end
end
