module Loa
	class UnidadesOrcamentariasController < ApplicationController
		include ControllerConcern

		before_action :authenticate_usuario!
		before_action :bloquear_orcamento, only: [:edit, :destroy]
		before_action :autoriza_usuario!, except: [:index, :editar_unidades_vinculada, :atualizar_unidades_vinculada]
		before_action :set_unidade_orcamentaria, only: [:edit, :update, :destroy, :show, :editar_unidades_vinculada, :atualizar_unidades_vinculada, :editar_logo, :atualizar_logo]
		before_action :disponibiliza_dependencias, only: [:new, :edit, :create, :update]
		before_action only: [:edit, :update, :destroy] do
			verifica_autorizacao_para_status_de_orcamento_helper(@unidade_orcamentaria.status_do_orcamento)
		end

		# GET /loa/orgaos/:orgao/unidades_orcamentarias
		def index
			if params[:id].present?
				render json: contexto_atual.unidades_orcamentarias.where( orgao_id: params[:id]).order(:codigo), methods: :codigo_e_nome
			else
				@q = contexto_atual.unidades_orcamentarias.order(:codigo).ransack(query_params)
				@acesso_direto = true
				@unidades_orcamentarias = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
			end
		end

		#GET /loa/unidades_orcamentarias/1
		def show
			respond_to do |format|
				format.html
				format.json
			end
		end

		def retorna_todas_as_unidades_orcamentarias
			@q = Loa::UnidadeOrcamentaria.ransack(params[:q])
			@unidades_orcamentarias = @q.result(distinct: true)
		end

		def retorna_unidades_orcamentarias_por_tipo_de_poder
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.joins(:tipo_de_unidade_administrativa).where("base_tipos_de_unidades_administrativas.poder_associado = ?", params[:tipo_de_poder])
		end

		# GET /loa/unidades_orcamentarias/new
		def new
			orgao = contexto_atual.orgaos.find(params[:id])
			disponibiliza_tipos_de_unidades_administrativas(orgao)

			@unidade_orcamentaria = orgao.unidades_orcamentarias.new
		end

		# GET /loa/orgaos/:orgao/unidades_orcamentarias/1/edit
		def edit
			disponibiliza_tipos_de_unidades_administrativas(@unidade_orcamentaria.orgao)
		end

		# POST /loa/orgaos/:orgao/unidades_orcamentarias
		def create
			orgao = contexto_atual.orgaos.find(params[:id])

			@unidade_orcamentaria = orgao.unidades_orcamentarias.new(unidade_orcamentaria_params)
			@unidade_orcamentaria.status_do_orcamento = contexto_atual[:status]
			if @unidade_orcamentaria.save
				if manter_form_apos_cadastro?
					disponibiliza_tipos_de_unidades_administrativas(orgao)
					redirect_path = { action: :new, id: orgao.to_param }
				else
					redirect_path = @unidade_orcamentaria
				end
				redirect_to redirect_path, notice: 'Unidade orcamentária foi criada com sucesso.'
			else
				disponibiliza_tipos_de_unidades_administrativas(orgao)
				render :new
			end
		end

		# PATCH/PUT /loa/orgaos/:orgao/unidades_orcamentarias/1
		def update
			if @unidade_orcamentaria.update( unidade_orcamentaria_params )
				redirect_to @unidade_orcamentaria, notice: 'Unidade orcamentária foi atualizada com sucesso.'
			else
				disponibiliza_tipos_de_unidades_administrativas(@unidade_orcamentaria.orgao)
				render :edit
			end
		end

		# DELETE /loa/orgaos/:orgao/unidades_orcamentarias/1
		def destroy
			mensagem = apaga_e_retorna_mensagem(@unidade_orcamentaria)
			redirect_to @unidade_orcamentaria.orgao, mensagem
		end

		#GET	loa/unidades_orcamentarias/:id/editar_unidades_vinculada
		def editar_unidades_vinculada
			return if bloqueia_usuario_com_base_em 'update'
			disponibiliza_dependencias_codigos
			if @unidade_orcamentaria.unidades_orcamentaria_vinculada.empty?
				@unidade_orcamentaria.unidades_orcamentaria_vinculada.build
			end
		end

		#PATCH	loa/unidades_orcamentarias/:id/atualizar_unidades_vinculada
		def atualizar_unidades_vinculada
			return if bloqueia_usuario_com_base_em 'update'
			if @unidade_orcamentaria.update(unidade_orcamentaria_params)
				redirect_to @unidade_orcamentaria, notice: 'Códigos cadastrados com sucesso.'
			else
				disponibiliza_dependencias_codigos
				render :editar_unidades_vinculada
			end
		end

		def editar_logo
		end

		def atualizar_logo
			if @unidade_orcamentaria.update(unidade_orcamentaria_params)
				redirect_to @unidade_orcamentaria, notice: 'Logo cadastrada com sucesso.'
			else
				render :editar_logo
			end
		end

		private
		def set_unidade_orcamentaria
			@unidade_orcamentaria = contexto_atual.unidades_orcamentarias.find( params[:id] )
		end

		# Permite apenas os parâmetros específicos
		def unidade_orcamentaria_params
			params.require(:loa_unidade_orcamentaria).permit(
				:rpps,:saae, :pessoa_id, :situacao_orcamentaria,:parcelamento,:codigo, :nome, :sigla, :tipo_de_administracao_id,
				:tipo_de_unidade_administrativa_id, :unidade_gestora_id, :orgao_id, :importar_dependencias, :is_unidade_arrecadadora,
				:logo, :data_de_inclusao,
				unidades_orcamentaria_vinculada_attributes: [
					:id,
					:unidade_orcamentaria_vinculada_id,
					:orcamento_id,
					:_destroy
				]
			)
		end

		def disponibiliza_dependencias
			@tipos_de_administracao = contexto_atual.tipos_de_administracao.order(:sigla)
			@unidades_gestoras = contexto_atual.unidades_gestoras.order(:codigo)
			@orgaos = contexto_atual.orgaos.order(:codigo)
			@fornecedores = Base::Pessoa.includes(:tipo_de_pessoa).where(fornecedor: :true)
		end

		def disponibiliza_dependencias_codigos
			@orcamentos = Orcamento.all.order(exercicio: :desc)
		end

		def disponibiliza_tipos_de_unidades_administrativas(orgao)
			if orgao.tipo_de_unidade_administrativa.present?
				poder_do_orgao = orgao.tipo_de_unidade_administrativa[:poder_associado]
			end

			@tipos_de_unidades_administrativas = contexto_atual.tipos_de_unidades_administrativas.where(poder_associado: poder_do_orgao).order(:codigo)
		end
	end
end
