module Loa
	class SubacoesController < ApplicationController
		include LoaControllersConcern
		include ControllerConcern
		before_action :authenticate_usuario!
		before_action :autoriza_usuario!, except: [:subacoes_por_unidade_orcamentaria]
		before_action :set_subacao, only: [:show, :edit, :update, :destroy]
		before_action :disponibiliza_dependencias, only: [:edit]
		before_action only: [:edit, :update, :destroy] do
			verifica_autorizacao_para_status_de_orcamento_helper(@subacao.status_do_orcamento)
		end

		skip_before_action :verifica_se_sessao_eh_de_contabilidade, only: [:subacoes_por_unidade_orcamentaria]

		# GET /loa/subacoes
		def index
			@unidades_orcamentarias = orcamento_atual.unidades_orcamentarias
			@q = Loa::Subacao.joins(acao: [:programa_de_governo, :natureza_da_acao]).where(loa_programas_de_governo: {orcamento_id: orcamento_atual.id}).order("base_naturezas_das_acoes.codigo ASC, loa_acoes.codigo, loa_subacoes.codigo ASC").ransack(query_params)
			@subacoes = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
		end

		# GET /loa/subacoes/1
		def show
		end

		# GET /loa/subacoes/new
		def new
			acao = Acao.find(params[:acao_id])
			@subacao = acao.subacoes.new
			disponibiliza_dependencias
		end

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

		# POST /loa/subacoes
		def create
			acao = Acao.find(params[:acao_id])
			@subacao = acao.subacoes.new(subacao_params)
			@subacao.status_do_orcamento = orcamento_atual[:status]

			if @subacao.save
				if manter_form_apos_cadastro?
					redirect_path = { action: :new, acao_id: acao.to_param }
				else
					redirect_path = @subacao
				end
				redirect_to redirect_path, notice: 'Subação foi criada com sucesso.'
			else
				disponibiliza_dependencias
				render :new
			end
		end

		# PATCH/PUT /loa/subacoes/1
		def update
			if @subacao.update(subacao_params)
				redirect_to @subacao, notice: 'Subacao foi atualizado(a) com sucesso.'
			else
				disponibiliza_dependencias
				render :edit
			end
		end

		# DELETE /loa/subacoes/1
		def destroy
			@subacao.temas_da_subacao.destroy_all
			mensagem = apaga_e_retorna_mensagem(@subacao)
			redirect_to @subacao.acao, mensagem
		end

		def subacoes_por_unidade_orcamentaria
			if params[:projeto_id].present?
				projeto = Licitacao::Projeto.find(params[:projeto_id])
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_id])
				unidade_orcamentaria_contexto_atual = contexto_atual.unidades_orcamentarias.joins(:orgao).find_by(loa_orgaos:{codigo: unidade_orcamentaria.orgao.codigo}, codigo: unidade_orcamentaria.codigo)
				clausulas = { unidade_orcamentaria_id: unidade_orcamentaria_contexto_atual.id }
			elsif params[:pedido_id].present?
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_id])
				unidade_orcamentaria_contexto_atual = contexto_atual.unidades_orcamentarias.joins(:orgao).find_by(loa_orgaos:{codigo: unidade_orcamentaria.orgao.codigo}, codigo: unidade_orcamentaria.codigo)
				clausulas = { unidade_orcamentaria_id: unidade_orcamentaria_contexto_atual.id }
			else
				clausulas = { unidade_orcamentaria_id: params[:unidade_orcamentaria_id] }
			end

			@subacoes = Loa::Subacao.joins('left join loa_acoes as b on loa_subacoes.acao_id = b.id left join contabilidade_solicitacao_de_alteracao_orcamentarias as c on b.solicitacao_de_alteracao_orcamentaria_id = c.id').where('(c.status = ? or b.solicitacao_de_alteracao_orcamentaria_id is null)', Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.status["confirmado"]).where(clausulas).distinct

			respond_to do |format|
				format.json { render json: @subacoes, methods: :acao_iniciativa }
				format.js
			end
		end

		private
		def set_subacao
			@subacao = Subacao.find( params[:id] )
		end

		# Permite apenas os parâmetros específicos
		def subacao_params
			params.require(:loa_subacao).permit( :despesa_da_educacao, :unidade_orcamentaria_id, :funcao_id, :subfuncao_id, :tipo_de_orcamento_id, temas_da_subacao_attributes: [:id, :orcamento_tematico_id, :percentual, :orcamento_id])
		end

		def disponibiliza_dependencias
			@orgaos = orcamento_atual.orgaos.order( :codigo )
			@despesa_da_educacao = Loa::Subacao.despesa_da_educacoes
			if @subacao.acao.natureza_da_acao.codigo == '9'
				@funcoes = orcamento_atual.funcoes.where( codigo: "99" )
			else
				@funcoes = orcamento_atual.funcoes.where.not( codigo: "99" ).order( :codigo )
			end
		end
	end
end
