module Loa
	class ProgramasDeGovernoController < ApplicationController
		include ControllerConcern

		before_action :authenticate_usuario!
		before_action :autoriza_usuario!
		before_action :bloquear_orcamento, only: [:new, :edit, :destroy]
		before_action :set_programa, only: [:show, :edit, :update, :destroy]
		before_action :disponibiliza_dependencias, only: [:index, :edit, :new]
		before_action :set_solicitacao_de_alteracao_orcamentaria, only: [:new]
		before_action only: [:edit, :update, :destroy] do
			verifica_autorizacao_para_status_de_orcamento_helper(@programa_de_governo.status_do_orcamento)
		end

		# GET /loa/programas_de_governo
		def index
			orcamento = Orcamento.find_by( exercicio: params[:exercicio] )
			if request.format == :pdf
				@programas_de_governo = orcamento.programas_de_governo.order(:codigo).all
			else
				@q = orcamento.programas_de_governo.order(:codigo).ransack(query_params)
				@programas_de_governo = @q.result(distinct: true).paginate(page: params[:page], per_page: 10)
				@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
			end

			respond_to do |format|
				format.html
				format.pdf do
					render pdf: "programas_de_governo",
						orientation: 'Portrait',
						dpi: '750',
						header: {
							html: {
								template: 'layouts/_cabecalho_pdf.html.slim',
								locals: { titulo1:  "Projeto de Lei: #{orcamento.try(:numero_da_lei)}", titulo2: "Resumo financeiro dos programas" }
							}
						},
						footer: { right: '[page]', font_size: 8 },
						margin: @configuracoes.margens_customizadas
				end
			end
		end

		# GET /loa/programas_de_governo/1
		def show
			@q = @programa_de_governo.acoes.order(:codigo).search(params[:q])
			@acoes = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
		end

		# GET /loa/programas_de_governo/new
		def new
			tipo_de_programa = Loa::TipoDePrograma.find_by(id: params[:tipo_de_programa_id])

			if tipo_de_programa
				orcamento = Orcamento.find_by( exercicio: params[:exercicio] )
				@programa_de_governo = orcamento.programas_de_governo.new(tipo_de_programa_id: tipo_de_programa.id)
			else
				redirect_to loa_programas_de_governo_url, alert: 'Selecione o tipo de programa.'
			end
		end

		# GET /loa/programas_de_governo/1/edit
		def edit
			if @programa_de_governo.importado_do_ppa?
				redirect_to loa_programas_de_governo_path(orcamento_atual), notice: 'Este programa de governo foi importado do PPA e não pode ser editado.'
			end
		end

		# POST /loa/programas_de_governo
		def create
			orcamento = Orcamento.find_by( exercicio: params[:exercicio] )
			@programa_de_governo = orcamento.programas_de_governo.new(programa_params)
			@programa_de_governo.status_do_orcamento = contexto_atual[:status]
			disponibiliza_dependencias
			if @programa_de_governo.save
				if manter_form_apos_cadastro?
					redirect_path = { action: :new }
				else
					redirect_path =  @programa_de_governo
				end
				redirect_to redirect_path, notice: 'Programa de governo foi criado(a) com sucesso.'
			else
				set_solicitacao_de_alteracao_orcamentaria
				render :new
			end

		end

		# PATCH/PUT /loa/programas_de_governo/1
		def update
			if @programa_de_governo.update( programa_params )
				redirect_to @programa_de_governo, notice: 'Programa de governo foi atualizado(a) com sucesso.'
			else
				disponibiliza_dependencias
				render :edit
			end
		end

		# DELETE /loa/programas_de_governo/1
		def destroy
			mensagem = apaga_e_retorna_mensagem(@programa_de_governo)
			if contabilidade_atual.present?
				redirect_to contabilidade_solicitacao_de_alteracao_orcamentaria_path(@programa_de_governo.solicitacao_de_alteracao_orcamentaria), mensagem
			else
				redirect_to loa_programas_de_governo_url(@programa_de_governo.orcamento), mensagem
			end
		end

		def prepara_importacao
			programas_ja_importados_ids = orcamento_atual.programas_de_governo.where("programa_id is not null").map(&:programa_id)
			if programas_ja_importados_ids.empty?
				@ppa_programas = Ppa::Programa.where("ppa_id = ?", orcamento_atual.ppa_id).all
			else
				@ppa_programas = Ppa::Programa.where("ppa_id = ? and id not in (?)", orcamento_atual.ppa_id, programas_ja_importados_ids).all
			end
		end

		def importar
			if params[:ppa_programas]
				params[:ppa_programas].each do |ppa_programa_id|
					programa_de_governo = Loa::ProgramaDeGoverno.new(orcamento: orcamento_atual, programa_id: ppa_programa_id)
					programa_de_governo.importar_dados_do_programa
					programa_de_governo.save(validate: false)
				end
				redirect_to loa_programas_de_governo_url(orcamento_atual), success: "#{params[:ppa_programas].size} programa(s) importado(s)."
			else
				redirect_to importar_programas_do_ppa_path(orcamento_atual), notice: "Nenhum programa selecionado para importação."
			end
		end

		private
		def set_programa
			@programa_de_governo = ProgramaDeGoverno.find( params[:id] )
		end

		def set_solicitacao_de_alteracao_orcamentaria
			if contabilidade_atual.present? || logado_no_administrativo?
				solicitacao_de_alteracao_id = params[:solicitacao_de_alteracao_id] || params[:loa_programa_de_governo][:solicitacao_de_alteracao_orcamentaria_id]
				@solicitacao_de_alteracao_orcamentaria =  Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.find(solicitacao_de_alteracao_id)
			end
		end

		# Permite apenas os parâmetros específicos
		def programa_params
			params.require(:loa_programa_de_governo).permit(:orcamento_id,
				:solicitacao_de_alteracao_orcamentaria_id, :codigo, :nome, :objetivo, :tipo_de_programa_id)
		end

		def disponibiliza_dependencias
			@tipos_de_programa = Loa::TipoDePrograma.order(:codigo)
			@configuracoes = Configuracao.last
		end
	end
end
