class Obra::DocumentoDaObra < ApplicationRecord
	has_paper_trail
	include TradutorConcern

	attr_default :data_do_documento, Date.today

	has_attached_file :documento
	validates_attachment_content_type :documento, content_type: [
		'text/plain',
		'application/pdf',
		'application/vnd.oasis.opendocument.spreadsheet',
		'application/vnd.ms-excel',
		'application/msexcel',
		'application/x-msexcel',
		'application/x-ms-excel',
		'application/x-excel',
		'application/x-dos_ms_excel',
		'application/xls',
		'application/x-xls',
		'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']

	validates_attachment_size :documento, in: 0..5.megabytes

	belongs_to :obra, class_name: "Contabilidade::Obra"
	belongs_to :usuario
	belongs_to :modelo_do_documento, class_name: "Licitacao::ModeloDeDocumento"

	validates_presence_of :usuario_id, :tipo_de_documento
	validates_presence_of :tipo_de_termo, if: Proc.new { self.termo_de_conclusao? }
	validates_presence_of :data_inicio_paralisacao, if: Proc.new { self.termo_de_paralisacao? }

	validates :data_do_documento, sabado_ou_domingo_ou_feriado: { flexivel: true }
	validates :tipo_de_documento, immutable: true
	validates_uniqueness_of :tipo_de_documento, scope: [:obra_id, :tipo_de_termo], if: Proc.new { self.termo_de_conclusao? }

	validate :verifica_se_obra_em_andamento

	after_create :altera_status_da_obra, if: Proc.new { self.termo_de_paralisacao? || self.termo_de_conclusao? || self.termo_de_reinicio?}
	after_destroy :deleta_status_da_obra, if: Proc.new { self.termo_de_paralisacao? || self.termo_de_conclusao? || self.termo_de_reinicio?}

	enum tipo_de_documento: {
		termo_de_paralisacao: 0,
		termo_de_conclusao: 1,
		termo_de_reinicio: 2,
		outros_documentos: 99
	}

	enum tipo_de_termo: {
		permanente: 0,
		provisorio: 1
	}

	def verifica_se_obra_em_andamento
		errors.add(:tipo_de_documento, "esse tipo de documento não pode ser cadastrado, obra não foi iniciada") if (self.termo_de_paralisacao? || self.termo_de_conclusao? || self.termo_de_reinicio?) && !self.obra.obra_iniciada?
	end

	def titulo
		self.localizar(:tipo_de_documento).try(:humanize).try(:upcase)
	end

	private

	def altera_status_da_obra
		if self.termo_de_paralisacao?
			situacao_da_obra = obra.situacoes_da_obra.new(data_da_situacao: self.data_do_documento, tipo_de_status_da_obra: tipo_de_status_da_obra)
		elsif self.termo_de_conclusao? && self.permanente?
			situacao_da_obra = obra.situacoes_da_obra.new(data_da_situacao: self.data_do_documento, data_do_termo_de_conclusao: self.data_do_documento, tipo_de_termo: self.tipo_de_termo, tipo_de_status_da_obra: tipo_de_status_da_obra)
		elsif self.termo_de_conclusao? && self.provisorio?
			situacao_da_obra = obra.situacoes_da_obra.new(data_da_situacao: self.data_do_documento, data_do_termo_de_conclusao: self.data_do_documento, tipo_de_termo: self.tipo_de_termo, tipo_de_status_da_obra: tipo_de_status_da_obra)
		elsif self.termo_de_reinicio?
			situacao_da_obra = obra.situacoes_da_obra.new(data_da_situacao: self.data_do_documento, tipo_de_status_da_obra: tipo_de_status_da_obra)
		end
		situacao_da_obra.save(validate: false)
	end

	def deleta_status_da_obra
		if (self.termo_de_paralisacao? && obra.esta_paralisada?) ||
				(self.termo_de_conclusao? && self.permanente? && obra.esta_concluida?) ||
					(self.termo_de_conclusao? && self.provisorio? && obra.esta_concluida_provisoria?) ||
						(self.termo_de_reinicio? && obra.em_andamento?)
			if obra.esta_concluida?
				obra.update_columns(prazo_de_garantia: nil, prazo_de_manutencao: nil)
			end
			obra.situacoes_da_obra.last.destroy
		end
	end

	def tipo_de_status_da_obra
		if self.termo_de_paralisacao?
			Contabilidade::SituacaoDaObra.tipos_de_status_da_obra[:paralisada]
		elsif self.termo_de_conclusao? && self.permanente?
			Contabilidade::SituacaoDaObra.tipos_de_status_da_obra[:concluida_definitiva]
		elsif self.termo_de_conclusao? && self.provisorio?
			Contabilidade::SituacaoDaObra.tipos_de_status_da_obra[:concluida_provisoria]
		elsif self.termo_de_reinicio?
			Contabilidade::SituacaoDaObra.tipos_de_status_da_obra[:em_andamento]
		end
	end
end
