module Loa
	class AcoesController < ApplicationController
		include ControllerConcern

		before_action :authenticate_usuario!
		before_action :bloquear_orcamento, only: [:new, :edit, :destroy]
		before_action :autoriza_usuario!, except: [:prepara_importacao]
		before_action :set_acao, only: [:show, :edit, :update, :destroy]
		before_action :set_solicitacao_de_alteracao_orcamentaria, only: [:new]
		before_action :disponibiliza_dependencias, only: [:create, :new, :update, :edit]
		before_action :disponibiliza_dependencias_subacao_nested,
			only: [:create, :new, :update, :edit], unless: :trabalha_com_subacao?
		before_action only: [:edit, :update, :destroy] do
			verifica_autorizacao_para_status_de_orcamento_helper(@acao.status_do_orcamento)
		end

		# GET /loa/acoes/1
		def show
			if trabalha_com_subacao?
				render 'show'
			else
				@subacao = @acao.subacoes.first
				render 'loa/subacoes/show'
			end
		end

		# GET /loa/acoes/new
		def new
			@programa = ProgramaDeGoverno.find( params[:id] )
			@acao = @programa.acoes.new(solicitacao_de_alteracao_orcamentaria_id: @solicitacao_de_alteracao_orcamentaria)
			@subacao = @acao.subacoes.build unless trabalha_com_subacao?
		end

		# POST /loa/acoes
		def create
			params[:loa_acao][:subacoes_attributes]["0"][:data_de_envio_ao_sim] = Date.new(contexto_atual.exercicio, 1, 1) if trabalha_com_subacao? == false && params[:loa_acao][:subacoes_attributes]["0"][:data_de_envio_ao_sim] == ""
			programa = ProgramaDeGoverno.find( params[:id] )
			@acao = programa.acoes.new(acao_params)
			@acao.status_do_orcamento = contexto_atual[:status]

			if @acao.save
				if logado_na_alteracao_orcamentaria? && @solicitacao_de_alteracao_orcamentaria.present?
					redirect_to @acao.solicitacao_de_alteracao_orcamentaria
				else
					if manter_form_apos_cadastro?
						query_params_url = @acao.solicitacao_de_alteracao_orcamentaria_id.present? ? "?solicitacao_de_alteracao_id=#{@acao.solicitacao_de_alteracao_orcamentaria_id}" : ""
						redirect_to new_loa_acao_path( id: programa.to_param ) + query_params_url, notice: 'Ação foi criado(a) com sucesso.'
					else
						redirect_to @acao, notice: 'Ação foi criado(a) com sucesso.'
					end
				end
			else
				set_solicitacao_de_alteracao_orcamentaria
				render :new
			end
		end

		# GET /loa/acoes/1/edit
		def edit
		end

		# PATCH/PUT /loa/acoes/1
		def update
			if @acao.update( acao_params )
				if contabilidade_atual.present? && @acao.solicitacao_de_alteracao_orcamentaria.present?
					redirect_to @acao.solicitacao_de_alteracao_orcamentaria, notice: 'Ação foi atualizado(a) com sucesso.'
				else
					redirect_to @acao, notice: 'Ação foi atualizado(a) com sucesso.'
				end
			else
				render :edit
			end
		end

		# DELETE /loa/acoes/1
		def destroy
			mensagem = apaga_e_retorna_mensagem(@acao, :omitir_relacao)
			if contabilidade_atual.present? && @acao.solicitacao_de_alteracao_orcamentaria.present?
				redirect_to contabilidade_solicitacao_de_alteracao_orcamentaria_path(@acao.solicitacao_de_alteracao_orcamentaria), mensagem
			else
				redirect_to @acao.programa_de_governo, mensagem
			end
		end

		def prepara_importacao
			@programa_de_governo = Loa::ProgramaDeGoverno.find(params[:id])
			iniciativas_ja_importadas_ids = @programa_de_governo.acoes.where("iniciativa_id is not null").map(&:iniciativa_id)
			if iniciativas_ja_importadas_ids.empty?
				@ppa_iniciativas = @programa_de_governo.programa.iniciativas
			else
				@ppa_iniciativas = @programa_de_governo.programa.iniciativas.where("ppa_iniciativas.id not in (?)", iniciativas_ja_importadas_ids)
			end
		end

		def importar
			@programa_de_governo = Loa::ProgramaDeGoverno.find(params[:id])
			if params[:ppa_iniciativas]
				params[:ppa_iniciativas].each do |ppa_iniciativa_id|
					acao = Loa::Acao.new(programa_de_governo_id: @programa_de_governo.id, iniciativa_id: ppa_iniciativa_id)
					acao.importar_dados_da_iniciativa
					acao.save(validate: false)
				end
				redirect_to @programa_de_governo, success: "#{params[:ppa_iniciativas].size} programa(s) importado(s)."
			else
				redirect_to prepara_importacao_das_acoes_do_ppa_path(@programa_de_governo), notice: "Nenhum programa selecionado para importação."
			end
		end

		private
		def set_acao
			@acao = Acao.find( params[:id] )
		end

		def set_solicitacao_de_alteracao_orcamentaria
			@solicitacao_de_alteracao_orcamentaria = nil
			if (contabilidade_atual.present? || logado_no_administrativo?) && params[:solicitacao_de_alteracao_id].present?
				@solicitacao_de_alteracao_orcamentaria =  Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.find( params[:solicitacao_de_alteracao_id] )
			elsif @acao && @acao.solicitacao_de_alteracao_orcamentaria.present?
				@solicitacao_de_alteracao_orcamentaria = @acao.solicitacao_de_alteracao_orcamentaria
			end
		end

		def disponibiliza_dependencias
			@natureza_da_acao = contexto_atual.naturezas_da_acao.all
			@unidades_de_medida = ::UnidadeDeMedida.order(:descricao)
		end

		def disponibiliza_dependencias_subacao_nested
			@despesa_da_educacao = Loa::Subacao.despesa_da_educacoes
			@orgaos = contexto_atual.orgaos.order( :codigo )
			@funcoes = contexto_atual.funcoes.order( :codigo )
			@programas = contexto_atual.programas_de_governo.order( :codigo )
		end

		def acao_params
			if trabalha_com_subacao?
				params.require(:loa_acao).permit(:id, :natureza_da_acao_id, :nome, :descricao, :programa_de_governo_id, :codigo, :produto, :unidade_de_medida_id, :solicitacao_de_alteracao_orcamentaria_id)
			else
				params.require(:loa_acao).permit(:id, :natureza_da_acao_id, :nome, :descricao, :programa_de_governo_id, :codigo, :solicitacao_de_alteracao_orcamentaria_id,
				:produto, :unidade_de_medida_id, subacoes_attributes: [
					:id, :despesa_da_educacao, :unidade_orcamentaria_id, :funcao_id, :subfuncao_id,
					:tipo_de_orcamento_id, :data_de_envio_ao_sim, temas_da_subacao_attributes: [
					:id, :orcamento_tematico_id, :percentual, :orcamento_id]
					])
			end
		end

		def trabalha_com_subacao?
			contexto_atual.trabalha_com_subacao?
		end

	end
end
