class Patrimonio::Leilao < ApplicationRecord
  include AASM
  has_paper_trail

  attr_default :status, :aberto

  belongs_to :orcamento, class_name: 'Orcamento'
  belongs_to :comissao, class_name: 'Patrimonio::Comissao'
  has_many :unidades_gestoras_do_leilao, class_name: 'Patrimonio::UnidadeGestoraDoLeilao'
  has_many :unidades_gestoras, through: :unidades_gestoras_do_leilao, class_name: 'Loa::UnidadeGestora'
  has_many :lotes_do_leilao, class_name: 'Patrimonio::LoteDoLeilao'

  accepts_nested_attributes_for :unidades_gestoras_do_leilao

  validates_presence_of :numero_ato, :comissao_id, :objeto, :orcamento_id

  before_save :set_numero_leilao, if: Proc.new { self.numero_leilao.blank? || self.numero_leilao.nil? }

  enum status: {
    aberto: 1,
    confirmado: 2,
    finalizado: 3
  }

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

		event :confirmar_leilao do
			transitions from: :aberto, to: :confirmado do
				guard do
					self.aberto? && cada_lote_tem_ao_menos_um_bem? && cada_lote_tem_valor_definido?
				end
        after do
          do_etapas_leilao_confirmado
        end
			end
		end

		event :finalizar_leilao do
			transitions from: :confirmado, to: :finalizado do
				guard do
					self.lotes_do_leilao.map{ |a| a.status }.all? { |st| ['fracassado', 'homologado'].include?(st)}
				end
        after do
          do_etapas_leilao_finalizado
        end
			end
		end

    event :voltar_etapa_do_leilao do
      transitions from: :confirmado, to: :aberto do
        guard do
          self.confirmado?
        end
        after do
          undo_etapas_leilao_confirmado
        end
      end
      transitions from: :finalizado, to: :confirmado do
        guard do
          self.finalizado?
        end
        after do
          undo_etapas_leilao_finalizado
        end
      end
    end
  end

  def cada_lote_tem_ao_menos_um_bem?
    lotes_do_leilao.all? { |lote| lote.bens_dos_lotes_do_leilao.exists? } && lotes_do_leilao.exists?
  end

  def cada_lote_tem_valor_definido?
    lotes_do_leilao.all? { |lote| lote.valores_dos_lotes_do_leilao.definido.exists? }
  end

  def set_numero_leilao
    exercicio = self.orcamento.exercicio
    ultimo_leilao = Patrimonio::Leilao.where(orcamento_id: self.orcamento_id).order('numero_leilao DESC').first

    if ultimo_leilao.present?
      ultimo_numero = ultimo_leilao.numero_leilao[4..7]
    else
      ultimo_numero = 0
    end

    self.numero_leilao = "#{exercicio}#{(ultimo_numero.to_i + 1).to_s.rjust(4, '0')}"
  end

  def tipo_de_label
		if self.status == 'aberto'
			"info"
		elsif self.status == 'confirmado' || self.status == 'finalizado'
			"success"
		end
	end

  def do_etapas_leilao_confirmado
    lotes_do_leilao.each do |lote|
      lote.marca_bens_como_leilao
      lote.faz_reavaliacao_do_bem
    end
  end

  def do_etapas_leilao_finalizado
    lotes_do_leilao.each do |lote|
      lote.marca_bens_como_desreconhecido if lote.homologado?
      lote.desmarca_bens_como_leilao if lote.fracassado?
    end
  end

  def undo_etapas_leilao_confirmado
    lotes_do_leilao.each do |lote|
      lote.desmarca_bens_como_leilao
      lote.desfaz_reavaliacao_do_bem
    end
  end

  def undo_etapas_leilao_finalizado
    lotes_do_leilao.each do |lote|
      lote.desmarca_bens_como_desreconhecido if lote.homologado?
      lote.marca_bens_como_leilao if lote.fracassado?
    end
  end
end
