class Loa::MetasFisicasController < ApplicationController
	# include LoaControllersConcern
	include ControllerConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:importa]
	before_action :disponibiliza_dependencias, only: [:new, :edit]
	before_action :set_meta_fisica, only: [:edit, :update, :destroy]
	before_action only: [:edit, :update, :destroy] do
		verifica_autorizacao_para_status_de_orcamento_helper(@meta_fisica.status_do_orcamento)
	end

	# GET /loa/metas_fisicas/new
	def new
		if params[:subacao_id]
			@subacao = Loa::Subacao.find(params[:subacao_id])
		elsif params[:acao_id]
			@subacao = Loa::Acao.find(params[:acao_id]).subacao
		end

		@meta_fisica = @subacao.metas_fisicas.new

		verifica_autorizacao_para_status_de_orcamento_helper(@meta_fisica.subacao.status_do_orcamento)
	end

	def prepara_importacao
		@subacao = Loa::Subacao.find(params[:subacao_id])
		metas_ja_importadas_ids = @subacao.acao.programa_de_governo.metas_fisicas.where("ppa_meta_id is not null").map(&:ppa_meta_id)
		if @subacao.acao.importado_do_ppa?
			if metas_ja_importadas_ids.empty?
				@ppa_metas = @subacao.acao.iniciativa.objetivo.metas
			else
				@ppa_metas = @subacao.acao.iniciativa.objetivo.metas.where("ppa_metas.id not in (?)", metas_ja_importadas_ids)
			end
		elsif @subacao.acao.programa_de_governo.importado_do_ppa?
			if metas_ja_importadas_ids.empty?
				@ppa_metas = @subacao.acao.programa_de_governo.programa.metas.all
			else
				@ppa_metas = @subacao.acao.programa_de_governo.programa.metas.where("ppa_metas.id not in (?)", metas_ja_importadas_ids)
			end
		else
			redirect_to :back, alert: "Não foi possível encontrar metas válidas para essa ação."
		end
	end

	def importar
		@subacao = Loa::Subacao.find(params[:subacao_id])
		if params[:ppa_metas]
			params[:ppa_metas].each do |ppa_meta_id|
				meta =  Loa::MetaFisica.new(subacao_id: @subacao.id, ppa_meta_id: ppa_meta_id)
				meta.importar_dados_da_meta(orcamento_atual)
				meta.save(validate: false)
			end
			redirect_to @subacao, success: "#{params[:ppa_metas].size} meta(s) física(s) importada(s)."
		else
			redirect_to prepara_importacao_das_metas_fisicas_do_ppa_path(@subacao), notice: "Nenhuma meta selecionada para importação."
		end
	end

	# POST /loa/metas_fisicas
	def create
		@meta_fisica = Loa::MetaFisica.new(meta_fisica_params)
		@meta_fisica.status_do_orcamento = contexto_atual[:status]

		verifica_autorizacao_para_status_de_orcamento_helper(@meta_fisica.status_do_orcamento)

		if @meta_fisica.save
			if manter_form_apos_cadastro?
				redirect_path = { action: :new, id: @meta_fisica.subacao_id }
			else
				redirect_path = subacao_ou_acao_correspondente @meta_fisica.subacao
			end

			redirect_to redirect_path, notice: 'Meta Física foi criada com sucesso.'
		else
			disponibiliza_dependencias
			render :new
		end
	end

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

	# PATCH/PUT /loa/metas_fisicas/1
	def update
		if @meta_fisica.update( meta_fisica_params )
			redirect_to url_for(subacao_ou_acao_correspondente(@meta_fisica.subacao)) + "?tab=metas_fisicas", notice: 'Meta Física foi atualizada com sucesso.'
		else
			disponibiliza_dependencias
			render :edit
		end
	end

	# DELETE /loa/metas_fisicas/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@meta_fisica)
		redirect_to url_for(subacao_ou_acao_correspondente(@meta_fisica.subacao)) + "?tab=metas_fisicas", mensagem
	end

	private
	def set_meta_fisica
		@meta_fisica = Loa::MetaFisica.find( params[:id] )
	end

	# Permite apenas os parâmetros específicos
	def meta_fisica_params
		params.require(:loa_meta_fisica).permit( :subacao_id, :unidade_de_medida_id, :produto, :quantidade)
	end

	def disponibiliza_dependencias
		@unidades_de_medida = UnidadeDeMedida.disponiveis.order( :descricao )
	end
end
