class Licitacao::AditivoDaAta < ApplicationRecord
	include TradutorConcern
	include AASM
	has_paper_trail

	attr_default :status, :solicitado

	belongs_to :ata_de_registro_de_precos, class_name: 'Licitacao::AtaDeRegistroDePrecos'
	belongs_to :orcamento, class_name: 'Orcamento'
	belongs_to :legislacao, class_name: 'Base::Legislacao'
	has_many :itens_do_aditivo_da_ata, class_name: 'Licitacao::ItemDoAditivoDaAta', dependent: :destroy
	has_many :itens_do_lote_da_ata, through: :ata_de_registro_de_precos
	has_many :documentos_do_aditivo_da_ata, dependent: :destroy

	validates_presence_of :modalidade, :data_do_aditivo, :ata_de_registro_de_precos_id
	accepts_nested_attributes_for :itens_do_aditivo_da_ata, reject_if: :all_blank, allow_destroy: true
	validates_presence_of :data_inicio_vigencia, :data_final_vigencia, if: Proc.new { self.modalidade == 'renovacao' }

	validates :itens_do_aditivo_da_ata, uniq_nested_attributes: { atributo: :item_do_lote_id, mensagem: "item deve ser único dentro de um contrato"}

	before_create :gerar_numero
	after_destroy :reordenar_numero

	scope :de_acrescimo, -> { where(modalidade: Licitacao::AditivoDaAta.modalidades["reajuste_de_valor_acrescimo"]) }
	scope :de_reducao, -> { where(modalidade: Licitacao::AditivoDaAta.modalidades["reajuste_de_valor_decrescimo"]) }
	scope :de_reajuste_de_valor, -> { where(modalidade: [Licitacao::AditivoDaAta.modalidades["reajuste_de_valor_acrescimo"], Licitacao::AditivoDaAta.modalidades["reajuste_de_valor_decrescimo"]]) }
	scope :confirmados, -> { where(status: :confirmado) }

	enum modalidade: {
		reajuste_de_valor_acrescimo: 0,
		reajuste_de_valor_decrescimo: 1,
		outros: 2,
		renovacao: 3
	}

	enum status: {
		solicitado: 0,
		confirmado: 1
	}

	scope :confirmados, -> { where(status: :confirmado) }

	aasm column: :status, enum: true, whiny_transitions: false do
		state :solicitado, :initial => true
		state :confirmado

		event :confirmar do
			transitions from: :solicitado, to: :confirmado do
				guard do
					itens_do_aditivo_da_ata.any?
				end
			end
		end

		event :voltar_etapa do
			transitions from: :confirmado, to: :solicitado do
			end
		end
	end

	def valida_data_do_aditivo
		if self.data_do_aditivo.present? && ata_de_registro_de_precos.present?
			errors.add(:data_do_aditivo, "Não pode ser anterior à data do aditivo (#{ata_de_registro_de_precos.data_inicio_de_vigencia})") if self.data_do_aditivo < contrato.data_do_contrato
		end
	end

	def possui_contratos_posteriores?
		ata_de_registro_de_precos.contratos.where('(licitacao_contratos.data_da_solicitacao >= ?)', data_do_aditivo).any?
	end

	# VALORES
	def valor_total
		if reajuste_de_valor_acrescimo?
			itens_do_aditivo_da_ata.to_a.sum(&:valor_total)
		else
			itens_do_aditivo_da_ata.to_a.sum(&:valor_total) * -1
		end
	end

	def gerar_numero
		self.numero = ata_de_registro_de_precos.aditivos_da_ata.maximum(:numero).to_i + 1
	end

	def reordenar_numero
		proximo_numero = 1
		if ata_de_registro_de_precos.aditivos_da_ata.any?
			ata_de_registro_de_precos.aditivos_da_ata.order(:numero).each do |aditivo|
				aditivo.update_column(:numero, proximo_numero)
				proximo_numero += 1
			end
		end
	end

	def valida_data_pelo_exercicio
		if self.data_do_aditivo.present? && ata_de_registro_de_precos.present?
			errors.add(:data_do_aditivo, "Deve estar no período do exercício selecionado (#{orcamento.exercicio})") if self.data_do_aditivo.year < orcamento.exercicio || self.data_do_aditivo.year > orcamento.exercicio
		end
	end
end
