class Loa::UnidadeGestora < ApplicationRecord
	include IncrementadorDeCodigoConcern
	include Rails.application.routes.url_helpers

	has_paper_trail

	after_initialize :sugestao_de_codigo, if: :new_record?
	attr_default :responsavel_contabil_diferente, false

	# belongs_to :orcamento, required: true
	belongs_to :orgao_pncp, class_name: 'Pncp::OrgaoPncp'
	belongs_to :arquivo, class_name: 'Tcm::Arquivo', required: false
	has_one :centro_de_custo, class_name: 'Controladoria::CentroDeCusto', dependent: :restrict_with_error
	has_many :centro_de_custos_filhos, through: :centro_de_custo
	has_many :unidades_orcamentarias, dependent: :restrict_with_exception
	has_many :unidades_gestoras_da_cessao, class_name: 'Patrimonio::UnidadeGestoraDaCessao'
	has_many :empenhos, through: :unidades_orcamentarias, class_name: 'Contabilidade::Empenho'
	has_many :liquidacoes, through: :empenhos, class_name: 'Contabilidade::Liquidacao'
	has_many :pagamentos, through: :liquidacoes, class_name: 'Contabilidade::Pagamento'
	has_many :estornos_de_pagamento, through: :pagamentos, class_name: 'Contabilidade::Pagamento'
	has_many :despesas_extra_orcamentarias, through: :unidades_orcamentarias
	has_many :contas_extra_orcamentarias, through: :unidades_orcamentarias, class_name: 'Contabilidade::ContaExtraOrcamentaria'
	has_many :transferencias, class_name: 'Patrimonio::Transferencia' 
	has_many :criticas_de_envio_pncp, as: :modulo, class_name: "Pncp::CriticasDeEnvio"
	has_many :bens_patrimoniais, class_name: 'Patrimonio::BemPatrimonial'
	has_many :gestores do
		def atual
			find_by_fim_da_gestao(nil)
		end

		def atual_na_data(data)
			find_by('(inicio_da_gestao <=  ? AND fim_da_gestao >= ?) OR (inicio_da_gestao <= ? AND fim_da_gestao IS NULL)', data, data, data)
		end
	end

	validates_presence_of :nome, :codigo, :numero_da_lei_de_criacao, :data_de_cadastro, :status_do_orcamento
	validates_presence_of :cnpj, on: :create
	validates_uniqueness_of :codigo, case_sensitive: false
	
	validates_length_of :nome, maximum: 80
	validates_length_of :codigo, maximum: 2

	scope :ativo_no_sistema, -> { where('data_encerramento is null OR data_encerramento >= ?', Date.today) }

	enum status_do_orcamento: STATUS_DO_ORCAMENTO
	
	def nome_e_cnpj
		if self.cnpj.blank?
			"#{nome} - #{Configuracao.last.try(:cnpj_da_prefeitura)}"
		else
			"#{nome} - #{cnpj.try(:as_cnpj)}"
		end
	end

	def codigo_e_nome
		"#{codigo} - #{nome.upcase}"
	end

	def gestor_no_periodo data
		gestores.where('(loa_gestores.inicio_da_gestao <= ? and loa_gestores.fim_da_gestao >= ?) OR (loa_gestores.inicio_da_gestao <= ? AND loa_gestores.fim_da_gestao IS NULL)', data, data, data).last
	end

	def enviado_ao_sim?
		arquivo_id.present? && arquivo_id > 0 && arquivo.lote.lote_processado_ou_enviado?
	end

	def codigo_to_pncp
		return self.codigo_pncp.to_i > 0 ? self.codigo_pncp : self.codigo
	end

	def to_sim(exercicio_e_mes_de_geracao, data_referencia, unidade_id)
		# Variáveis necessárias para gerar o SIM
		begin
			exercicio_do_orcamento = data_referencia.year.to_s
			unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(unidade_id)
			
			texto = ""
			texto << "108".sim_preenche(3) + ","
			texto << Configuracao.first.codigo_do_municipio_no_tcm.sim_preenche(3) + ","
			texto << exercicio_do_orcamento + "00" + ","
			texto << codigo[0..1].to_s.rjust(2, '0') + ","

			data_de_inclusao_uo = unidade_orcamentaria.created_at.to_date

			texto << unidade_orcamentaria.orgao.codigo.sim_limite(2) + ","
			texto << unidade_orcamentaria.codigo.codigo_uo_to_sim + ","
			texto << (data_de_inclusao_uo.year ==  exercicio_do_orcamento ? data_de_inclusao_uo.sim_data : data_referencia.sim_data) + ","

			texto << exercicio_e_mes_de_geracao + ","
			texto << nome.sim_limite(80) + ","
			texto << (data_de_cadastro.year ==  exercicio_do_orcamento ? data_de_cadastro.sim_data : data_referencia.sim_data) + ","
			texto << numero_da_lei_de_criacao.to_s.sim_limite(10)
			return texto
		rescue => e
			if e.class.to_s == "NoMethodError"
				atributo_falho = e.message.split(" ")[2]
				coluna = CSV.parse(texto, :headers => false).last.count
				raise e.mensagem_traduzida(self, self.codigo, atributo_falho, coluna)
			else
				raise e
			end
		end
	end

	def existe_gestor_periodo?(data_de_entrada, data_de_saida)
		existe_gestor = self.gestores.where('(inicio_da_gestao <= ? and fim_da_gestao >= ?) or (inicio_da_gestao <= ? and fim_da_gestao >= ?) or (inicio_da_gestao < ? and fim_da_gestao is null)', data_de_entrada, data_de_entrada, data_de_saida, data_de_saida, data_de_saida).first
		return existe_gestor
	end

	private
	def sugestao_de_codigo
		gerar_sugestao_codigo( :codigo, 2, nil) if (codigo.blank?)
	end
end
