class Obra::GarantiaDaObra < ApplicationRecord
	has_paper_trail
	include AASM
	include TradutorConcern

	attr_default :situacao, :aberta

	belongs_to :obra, class_name: 'Contabilidade::Obra', required: true

	validates :data_do_deposito, :valor_do_caucao, :conta_corrente, presence: true, if: Proc.new { self.caucao_em_dinheiro? }
	validates :data_de_resgate, :nome_do_titulo, presence: true, if: Proc.new { self.caucao_em_titulo_de_divida? }
	validates :nome_da_seguradora, :numero_da_apolice, :valor_do_premio, :quantidade_de_dias_de_vigencia, presence: true, if: Proc.new { self.seguro? }
	validates :nome_do_banco, :valor_fianca, :quantidade_de_dias_de_vigencia, presence: true, if: Proc.new { self.fianca_bancaria? }

	validates :forma_de_garantia, presence: true

	validate :data_de_resgate_deve_ser_maior_que_prazo_de_finalizacao_da_obra, if: Proc.new { self.caucao_em_titulo_de_divida? && !self.data_de_resgate.nil? }

	enum forma_de_garantia: {
		caucao_em_dinheiro: 1,
		caucao_em_titulo_de_divida: 2,
		seguro: 3,
		fianca_bancaria: 4
	}

	enum situacao: {
		aberta: 1,
		devolvida: 2
	}

	aasm column: :situacao, enum: true, whiny_transitions: false do
		state :aberta, :initial => true
		state :devolvida

		event :devolver do
			transitions from: :aberta, to: :devolvida do
				guard do
					obra.esta_concluida?
				end
			end
		end

		event :retornar_para_aberta do
			transitions to: :aberta do
				guard do
					self.devolvida?
				end
			end
		end
	end

	def prazo_para_devolucao
		if obra.esta_concluida?
			(obra.situacoes_da_obra.last.data_do_termo_de_conclusao + 30)
		end
	end

	def garantia_nao_devolvida?
		if self.aberta? && !prazo_para_devolucao.nil?
			prazo_para_devolucao < Date.today
		end
	end

	def data_de_resgate_deve_ser_maior_que_prazo_de_finalizacao_da_obra
		if self.data_de_resgate < self.obra.contrato.data_final_de_acordo_com_aditivos
			errors.add(:data_de_resgate, "data de resgate deve ser maior que prazo de finalização da obra #{self.obra.contrato.data_final_de_acordo_com_aditivos}")
		end
	end
end
