class Licitacao::DocumentoDoProcesso < ApplicationRecord
	has_paper_trail
	include AASM
	include TradutorConcern
	include MensagemConcern

	attr_default :data_do_documento, Date.today
	attr_default :documento_do_projeto, false
	attr_default :status_parecer, :pendente

	attr_accessor :lei

	has_attached_file :documento
	validates_attachment_content_type :documento, content_type: ['application/pdf']
	validates_attachment_size :documento, in: 0..5.megabytes

	before_create :altera_titulo_do_documento

	belongs_to :processo, class_name: "Licitacao::Processo", foreign_key: :projeto_id
	belongs_to :usuario
	belongs_to :modelo_do_documento, class_name: "Licitacao::ModeloDeDocumento"
	belongs_to :agente_publico_municipal , class_name: "Base::AgentePublicoMunicipal"

	has_many :vistos_de_documentos_do_processo, class_name: "Licitacao::VistoDeDocumentoDoProcesso"

	validates_presence_of :usuario_id, :tipo_de_documento, if: Proc.new{ !self.recebido_pelo_setor_juridico?}

	validates_presence_of :documento, unless: Proc.new{ self.texto.present? || self.enviado_ao_setor_juridico? || self.recebido_pelo_setor_juridico?}
	validates_presence_of :titulo_personalizado, if: Proc.new{ |documento_do_processo| documento_do_processo.tipo_de_documento == "personalizado" }
	validates_absence_of :texto, if: Proc.new{ |documento_do_processo| documento_do_processo.documento.present? }
	validates_presence_of :projeto_id
	validates_presence_of :agente_publico_municipal_id, if: Proc.new{ self.parecer? && !self.recebido_pelo_setor_juridico?}

	validates :data_do_documento, sabado_ou_domingo_ou_feriado: { flexivel: false }
	validates :tipo_de_documento, immutable: true
	validates_uniqueness_of :tipo_de_documento, scope: :projeto_id, if: Proc.new{ edital? || minuta_de_contrato? || minuta_de_ata_de_registro_de_preco? }

	validate :processo_ja_possui_um_termo_gerado, on: :create
	validate :processo_ja_possui_uma_autorizacao, on: :create
	validate :pode_gerar_minuta_de_ata_de_registro_de_preco?, if: Proc.new { minuta_de_ata_de_registro_de_preco? }

	scope :visiveis_no_projeto, -> { where(tipo_de_documento: [Licitacao::DocumentoDoProcesso.tipos_de_documento["autorizacao"], Licitacao::DocumentoDoProcesso.tipos_de_documento["termo_de_referencia"], Licitacao::DocumentoDoProcesso.tipos_de_documento["personalizado"], Licitacao::DocumentoDoProcesso.tipos_de_documento["outros_documentos"]])}
	scope :visiveis_no_processo, -> { where.not(tipo_de_documento: Licitacao::DocumentoDoProcesso.tipos_de_documento["autorizacao"])}

	enum tipo_de_documento: {
		edital: 0,
		# ata_de_registro_de_preco: 1,
		# contrato: 2, # NÃO UTILIZADO NOS DOCUMENTOS DO PROCESSO, APENAS EM GERAÇÃO DE CONTRATOS
		declaracao: 3,
		termo: 4, #termo_de_autuacao
		solicitacao: 5,
		autorizacao: 6,
		despacho: 7,
		parecer: 8,
		minuta_de_contrato: 9,
		minuta_de_ata_de_registro_de_preco: 10,
		termo_de_referencia: 11,
		minuta_do_edital: 12,
		anexos_do_edital: 13,
		capa: 14,
		personalizado: 98,
		outros_documentos: 99
	}

	enum status_parecer: {
		pendente: 0,
		concluido: 1,
		enviado_ao_setor_juridico: 2,
		recebido_pelo_setor_juridico: 3,
		devolvido: 4
	}

	def concluir_parecer
		self.concluido!
		#cria_mensagem_parecer_concluido
	end

	def receber_parecer_no_setor_juridico
		self.recebido_pelo_setor_juridico!
	end

	def devolver_parecer
		self.devolvido!
	end

	def processo_ja_possui_um_termo_gerado
		if self.processo && self.processo.possui_um_termo_gerado? && self.termo?
			errors.add(:tipo_de_documento, "Processo só pode possuir um termo de autuação")
		end
	end

	def processo_ja_possui_uma_autorizacao
		if self.processo && self.processo.possui_autorizacao? && self.autorizacao?
			errors.add(:tipo_de_documento, "Processo já foi autorizado")
		end
	end

	def titulo
		if self.titulo_personalizado.present?
			self.titulo_personalizado.try(:upcase)
		else
			self.localizar(:tipo_de_documento).try(:humanize).try(:upcase) + self.titulo_do_modelo.to_s
		end
	end

	def altera_titulo_do_documento
		self.titulo_personalizado ||= self.modelo_do_documento.try(:titulo)
	end

	def titulo_do_modelo
		if self.modelo_do_documento && self.modelo_do_documento.titulo
			" - " + self.modelo_do_documento.try(:titulo)
		end
	end

	def permite_editar_no_processo?
		processo.pode_editar_documentos?
	end

	def permite_editar_no_projeto?
		processo.pode_editar_documentos?
	end

	private
	def pode_gerar_minuta_de_ata_de_registro_de_preco?
		errors.add(:tipo_de_documento, "Não pode gerar ata nessa modalidade") unless processo.registro_de_preco?
	end

end
