module Controladoria
	class CentroDeCustosController < ApplicationController
		include ControllerConcern
		before_action :authenticate_usuario!, except: [:imprimir]
		before_action :autoriza_usuario!, except: [:imprimir]
		before_action :set_centro_de_custo_ou_unidade_gestora, only: [:show, :edit, :update, :destroy, :alterar_ativacao, :imprimir]
		before_action :set_dependencias, only: [:show, :edit, :update]

		# GET /controladoria/centro_de_custos
		def index
			if request.format == :json
				if params[:com_filhas].present?
					@q = Controladoria::CentroDeCusto.order(:id).search(params[:q])
					@centro_de_custos = @q.result(distinct: true)

					@centro_de_custos = Controladoria::CentroDeCusto.where("mae_principal_id in(?) OR id in(?)", @centro_de_custos.ids, @centro_de_custos.ids).distinct
				else
					@q = Controladoria::CentroDeCusto.order(:id).search(params[:q])
					@centro_de_custos = @q.result(distinct: true)
				end
			else
				@q = contexto_atual.unidades_gestoras.order(:id).search(params[:q])
				@unidades_gestoras = @q.result(distinct: true).paginate(page: params[:page], per_page: 10)
			end

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

		# GET /controladoria/centro_de_custos/1
		def show
			@familia_ug = JSON.generate(@centro_de_custo.carregar_familia_da_ug)
		end

		# GET /controladoria/centro_de_custos/new
		def new
			@centro_de_custo = CentroDeCusto.new
		end

		# GET /controladoria/centro_de_custos/1/edit
		def edit
			unless @tipo == 'editar_dados'
				@centro_de_custo.centro_de_custos_filhos.build if @centro_de_custo.centro_de_custos_filhos.empty?
			end
		end

		# POST /controladoria/centro_de_custos
		def create
			@centro_de_custo = CentroDeCusto.new(centro_de_custo_params)

			if @centro_de_custo.save
				redirect_to @centro_de_custo, notice: 'Centro de custo foi criado(a) com sucesso.'
			else
				render :new
			end
		end

		# PATCH/PUT /controladoria/centro_de_custos/1
		def update
			if @centro_de_custo.update( centro_de_custo_params )
				redirect_to @centro_de_custo, notice: 'Centro de custo foi atualizado(a) com sucesso.'
			else
				render :edit
			end
		end

		def editar_responsaveis_do_centro_de_custos

		end

		def atualiza_responsaveis_do_centro_de_custos
			return if bloqueia_usuario_com_base_em 'editar_responsaveis_do_centro_de_custos'
			if @centro_de_custo.update( centro_de_custo_params )
				redirect_to @centro_de_custo, notice: 'Centro de custo foi atualizado(a) com sucesso.'
			else
				render :edit
			end
		end

		# PATCH /base/contas_bancarias/1
		def alterar_ativacao
			if params[:status] == "inativo"
				@centro_de_custo.status = 2
				mensagem = 'Centro de custo foi inativado com sucesso.'
			else
				@centro_de_custo.status = 1
				mensagem = 'Centro de custo foi ativado com sucesso.'
			end
			
			if @centro_de_custo.save
				redirect_to @centro_de_custo, notice: mensagem
			else
				redirect_to @centro_de_custo, alert: @centro_de_custo.errors.full_messages.join(', ')
			end
		end

		# DELETE /controladoria/centro_de_custos/1
		def destroy
			mensagem = apaga_e_retorna_mensagem(@centro_de_custo)
			redirect_to controladoria_centro_de_custos_url, mensagem
		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 controladoria_centro_de_custo_path(@centro_de_custo), alert: 'Relatório não encontrado'
			end
		end

		def termo_de_guarda_patrimonial
			@configuracoes = Configuracao.last
			@unidade_gestora = @centro_de_custo.unidade_gestora.present? ? @centro_de_custo.unidade_gestora : @centro_de_custo.centro_de_custos_mae_principal.unidade_gestora
			@bens = Patrimonio::BemPatrimonial.joins(:localizacao_atual).where("patrimonio_bens_patrimoniais.unidade_gestora_id = #{@unidade_gestora.id} 
				and patrimonio_bens_patrimoniais.status = 1 
				and patrimonio_localizacoes_dos_bens.centro_de_custo_id = #{@centro_de_custo.id}").includes(:dados_extras_do_bem, item: :unidade_de_medida)

			# @bens_patrimoniais = @bens.map{|i| 
			# 	{ id: i.id, item_descricao: i.item.descricao_do_item, num_tombamento: i.numero_do_tombamento, 
			# 		data_tombamento: i.data_do_tombamento, aquisicao: i.dados_extras_do_bem.tipo_de_ingresso_i18n
			# 	}
			# }

			render_to_string pdf: "Termo de Movimentação",
				template: "controladoria/centro_de_custos/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 termo_de_centros_de_custos_filhos
			@configuracoes = Configuracao.last
			@unidade_gestora = @centro_de_custo.unidade_gestora.present? ? @centro_de_custo.unidade_gestora : @centro_de_custo.centro_de_custos_mae_principal.unidade_gestora
			@centros_filhos = @centro_de_custo.centro_de_custos_filhos.ativos.order("string_to_array(codigo, '.')::int[]")

			render_to_string pdf: "Termo de Quantidade",
				template: "controladoria/centro_de_custos/relatorios/termo_de_centros_filhos.pdf.slim",
				orientation: 'Portrait',
				disable_smart_shrinking: true,

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

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

		private
		def set_centro_de_custo
			@centro_de_custo = CentroDeCusto.find( params[:id] )
		end

		def set_centro_de_custo_ou_unidade_gestora
			if params[:flag] == 'unidade_gestora'
				@unidade_gestora = Loa::UnidadeGestora.find( params[:id] )
				unless @unidade_gestora.centro_de_custo.present?
					@unidade_gestora.build_centro_de_custo(nivel: 1, descricao: @unidade_gestora.nome, status: :ativo)
					@unidade_gestora.save
				end
				@centro_de_custo = CentroDeCusto.find( @unidade_gestora.centro_de_custo.id )
			else
				@centro_de_custo = CentroDeCusto.find( params[:id] )
			end
		end

		def set_dependencias
			@tipo = params[:tipo].to_s
		end

		# Permite apenas os parâmetros específicos
		def centro_de_custo_params
			params.require(:controladoria_centro_de_custo).permit(:unidade_gestora_id, :centro_de_custos_mae_id, :mae_principal_id, :nivel, :descricao, :status, :endereco, :numero, :complemento, :bairro, :cep, centro_de_custos_filhos_attributes: [:id, :unidade_gestora_id, :centro_de_custos_mae_id, :mae_principal_id, :nivel, :status, :descricao, :_destroy])
		end

		def responsaveis_do_centro_de_custo_params
			params.require(:controladoria_centro_de_custo).permit(:unidade_gestora_id, :centro_de_custos_mae_id, :mae_principal_id, :nivel, :descricao, :status, :endereco, :numero, :complemento, :bairro, :cep, centro_de_custos_filhos_attributes: [:id, :unidade_gestora_id, :centro_de_custos_mae_id, :mae_principal_id, :nivel, :status, :descricao, :_destroy])
		end
	end
end
