module Obra
class OperacoesDeCreditoController < ApplicationController
	include ControllerConcern
	include ObraControllersConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:altera_status]
	before_action :set_operacao_de_credito, only: [:show, :edit, :update, :destroy, :altera_status]
	before_action :disponibiliza_dependencias, only: [:create, :new, :update, :edit]

	# GET /obra/operacoes_de_credito
	def index
		@q = Obra::OperacaoDeCredito.order(data: :desc).search(params[:q])
		@operacoes_de_credito = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
		@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
		@fornecedores = Base::Pessoa.includes(:tipo_de_pessoa).fornecedores.all
	end

	# GET /obra/operacoes_de_credito/1
	def show
	end

	# GET /obra/operacoes_de_credito/new
	def new
		@operacao_de_credito = Obra::OperacaoDeCredito.new
	end

	# GET /obra/operacoes_de_credito/1/edit
	def edit
	end

	# POST /obra/operacoes_de_credito
	def create
		@operacao_de_credito = Obra::OperacaoDeCredito.new(operacao_de_credito_params)

		if @operacao_de_credito.save
			redirect_to @operacao_de_credito, notice: 'Operação de Crédito foi criado(a) com sucesso.'
		else
			render :new
		end
	end

	# PATCH/PUT /obra/operacoes_de_credito/1
	def update
		if @operacao_de_credito.update( operacao_de_credito_params )
			redirect_to @operacao_de_credito, notice: 'Operação de Crédito foi atualizado(a) com sucesso.'
		else
			render :edit
		end
	end

	# DELETE /obra/operacoes_de_credito/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@operacao_de_credito)
		redirect_to obra_operacoes_de_credito_url, mensagem
	end

	# PATCH/PUT /obra/operacoes_de_credito/1/altera_status
	def altera_status
		return if bloqueia_usuario_com_base_em 'update'
		if @operacao_de_credito.save(validate: false)
			redirect_to @operacao_de_credito, notice: 'O status da operação de crédito foi alterado.'
		end
	end

	private

	def disponibiliza_dependencias
		if current_usuario.desenvolvedor?
			@orgaos = contexto_atual.orgaos
		elsif current_usuario.tipo_de_poder == 'ambos'
			@orgaos = contexto_atual.orgaos_do_usuario(current_usuario).joins(:tipo_de_unidade_administrativa).where.not(base_tipos_de_unidades_administrativas: {codigo: '99'}).order( :codigo )
		else
			poder_usuario = current_usuario.tipo_de_poder == 'legislativo' ? 0 : 1
			@orgaos = contexto_atual.orgaos_do_usuario(current_usuario).joins(:tipo_de_unidade_administrativa).where(base_tipos_de_unidades_administrativas: {poder_associado: poder_usuario}).order( :codigo )
		end
		
		@fornecedores = Base::Pessoa.includes(:tipo_de_pessoa).fornecedores.all
		@funcoes = contexto_atual.funcoes.all

		@contas_pcasp = contexto_atual.contas.where(codigo: ['212110101', '212110198', '212110201', '212110205', '212110298', '212110300', '212210100', '212210200', '212210300'])
		@sub_contas_pcasp = contexto_atual.sub_contas_pcasp.where(topico_da_conta: :operacao_de_credito)

		@unidades_orcamentarias = []
		@obras = []
		@receitas = []
		@contas_bancarias = []
		@contas_bancarias_arrecadadora = []
		@unidades_orcamentarias_arrecadadora = contexto_atual.unidades_orcamentarias

		if @operacao_de_credito && @operacao_de_credito.persisted?
			@obras = Contabilidade::Obra.joins(:contratos).where(licitacao_contratos: {unidade_orcamentaria_do_exercicio_id: @operacao_de_credito.unidade_orcamentaria_id}).all
			@receitas = contexto_atual.naturezas_da_receita.joins(:unidades_orcamentarias_por_natureza_da_receita).where("loa_unidades_orcamentarias_por_natureza_da_receita.unidade_orcamentaria_id =?", @operacao_de_credito.unidade_orcamentaria_id).order(:id)
			@unidades_orcamentarias = @operacao_de_credito.unidade_orcamentaria.orgao.unidades_orcamentarias
			@contas_bancarias = @operacao_de_credito.unidade_orcamentaria.contas_bancarias.includes(agencia: :banco) unless @operacao_de_credito.unidade_orcamentaria.nil?
			@contas_bancarias_arrecadadora = @operacao_de_credito.unidade_orcamentaria_arrecadadora.contas_bancarias.includes(agencia: :banco) unless @operacao_de_credito.unidade_orcamentaria_arrecadadora.nil?
		end
	end

	def set_operacao_de_credito
		@operacao_de_credito = Obra::OperacaoDeCredito.find( params[:id] )
	end

	# Permite apenas os parâmetros específicos
	def operacao_de_credito_params
		params.require(:obra_operacao_de_credito).permit(:data, :modalidade, :numero_do_contrato, :descricao, :unidade_orcamentaria_id,
			:obra_id, :moeda, :financiador_id, :funcao_id, :natureza_da_receita_id, :natureza_da_receita_aplicacao_fin_id,
			:inicio_da_vigencia, :fim_da_vigencia, :prazo_liberacao_execucao, :prazo_carencia, :periodicidade_amortizacao,
			:prazo_amortizacao, :valor_operacao_credito, :valor_contrapartida, :valor_total, :conta_bancaria_id, :conta_bancaria_arrecadadora_id, :conta_id,
			:sub_conta_pcasp_id, :unidade_orcamentaria_arrecadadora_id)
	end
end
end
