class Licitacao::Publicacao < ApplicationRecord
	include TradutorConcern
	include IncrementadorDeCodigoConcern

	has_paper_trail
	has_attached_file :anexo

	belongs_to :projeto, class_name: 'Licitacao::Projeto'

	validates_presence_of :projeto_id, :sequencia, :data_da_publicacao, :tipo_de_publicacao, :data_de_publicacao_no_flanelografo
	validates_presence_of :local_publicado, if: Proc.new{ self.jornal_de_grande_circulacao? }

	validates :data_da_publicacao, sabado_ou_domingo_ou_feriado: { flexivel: false }
	validates :data_de_publicacao_no_flanelografo, sabado_ou_domingo_ou_feriado: { flexivel: false }

	validate :valida_data_da_publicacao
	validate :valida_data_de_publicacao_no_flanelografo, if: Proc.new{ !self.try(:projeto).try(:sbqc) }

	validates_attachment_content_type :anexo, content_type: ['application/pdf', 'image/gif', 'image/jpeg', 'image/png', 'image/bmp']
	validates_attachment_size :anexo, in: 0..10.megabytes

	before_create :valida_data_da_publicacao
	before_validation :atribui_numero
	before_destroy :projeto_homologado?

	enum tipo_de_publicacao: {
		diario_oficial_da_uniao: 0,
		diario_oficial_do_estado: 1,
		diario_oficial_do_municipio: 2,
		jornal_de_grande_circulacao: 3,
		disponibilizacao_do_edital_de_convite: 4,
		outras_publicacoes_do_edital: 5
	}

	# BOOLEANS
	def projeto_homologado?
		if self.projeto.homologado?
				raise Exception.new('Não é possivel deletar, processo já está homologado')
		end
	end

	# VALIDAÇÕES
	def valida_data_da_publicacao
		if projeto.present? && !projeto.bid_obra_ou_servico && self.data_da_publicacao.present? && projeto.data_do_projeto.present?
			if self.projeto.orcamento == self.projeto.pedido.orcamento
				errors.add(:data_da_publicacao, "Data da publicação não deve ser anterior à data do pedido (#{projeto.pedido.data_do_pedido.strftime("%d/%m/%Y")})") if self.data_da_publicacao.to_date < projeto.pedido.data_do_pedido.to_date
			end
		end
	end

	def valida_data_de_publicacao_no_flanelografo
		if self.data_da_publicacao.present? && self.data_de_publicacao_no_flanelografo.present?
			errors.add(:data_de_publicacao_no_flanelografo, "Data da publicação no flanelógrafo não pode ser posterior à data de publicação") if self.data_da_publicacao.to_date < self.data_de_publicacao_no_flanelografo.to_date
			if self.projeto.orcamento == self.projeto.pedido.orcamento
				errors.add(:data_de_publicacao_no_flanelografo, "Data da publicação no flanelógrafo não deve ser anterior à data do pedido (#{projeto.pedido.data_do_pedido.strftime("%d/%m/%Y")})") if self.data_de_publicacao_no_flanelografo.to_date < projeto.pedido.data_do_pedido.to_date
			end
		end
	end

	# AÇÕES
	def atribui_numero
		gerar_sugestao_codigo(:sequencia, 2, {projeto_id: self.projeto.id}).to_i if sequencia.nil? && self.projeto.present?
	end

	# TCM
	def sim_tipo_de_publicacao
		codigo = case self.tipo_de_publicacao
			when "diario_oficial_da_uniao" then "1"
			when "diario_oficial_do_estado" then "2"
			when "diario_oficial_do_municipio" then "3"
			when "jornal_de_grande_circulacao" then "4"
			when "disponibilizacao_do_edital_de_convite" then "5"
			when "outras_publicacoes_do_edital" then "9"
			else "9"
		end
	end

	def to_sim
		begin
			texto = ""
			if projeto.parceria_osc?
				edital = projeto.documentos_do_processo.edital.first if projeto.possui_edital?
	
				texto << "532".to_s.sim_preenche(3) + ","
				texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + ","
				texto << projeto.data_de_autuacao.sim_data + ","
				texto << projeto.numero_do_processo.sim_limite(15) + ","
				texto << projeto.sigla_da_modalidade_do_processo.sim_preenche(1) + ","
				texto << (projeto.data_do_edital.nil? ? " ".sim_preenche(8) : projeto.data_do_edital.sim_data) + ","
				texto << (!projeto.numero_do_edital.nil? ? projeto.numero_do_edital.sim_preenche(8) : sequencia.to_s.sim_preenche(8)) + ","
				texto << sequencia.to_s.sim_preenche(2) + ","
				texto << sim_tipo_de_publicacao.sim_preenche(1) + ","
				texto << (local_publicado.blank? ? localizar(:tipo_de_publicacao) : local_publicado).gsub(/["\r\n]/, "").sim_limite(255) + ","
				texto << data_da_publicacao.sim_data + ","
			else
				texto << "502".to_s.sim_preenche(3) + ","
				texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + ","
				texto << projeto.data_de_autuacao.sim_data + ","
				texto << projeto.numero_do_processo.sim_limite(15) + ","
				texto << sequencia.to_s.sim_preenche(2) + ","
				texto << sim_tipo_de_publicacao.sim_preenche(1) + ","
				texto << (local_publicado.blank? ? localizar(:tipo_de_publicacao) : local_publicado).gsub(/["\r\n]/, "").sim_limite(255) + ","
				texto << data_da_publicacao.sim_data + ","
			end
			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, "", atributo_falho, coluna)
			else
				raise e
			end
		end
	end
end
