class Patrimonio::LoteDoLeilao < ApplicationRecord
  include AASM
  has_paper_trail

  attr_default :status, :aberto

  belongs_to :leilao, class_name: 'Patrimonio::Leilao'
  has_many :bens_dos_lotes_do_leilao, class_name: 'Patrimonio::BemDoLoteDoLeilao'
  has_many :bens_patrimoniais, through: :bens_dos_lotes_do_leilao
  has_many :valores_dos_lotes_do_leilao, class_name: 'Patrimonio::ValorDoLoteDoLeilao'

  accepts_nested_attributes_for :bens_dos_lotes_do_leilao, reject_if: :all_blank, allow_destroy: true
  accepts_nested_attributes_for :valores_dos_lotes_do_leilao, reject_if: Proc.new{ |atributo| atributo['valor_do_lote'].blank? && atributo['data_do_lote'].blank? }

  validates_presence_of :leilao_id, :ordem_lote

  before_validation :preenche_ordem_do_lote

  after_save :cria_ou_atualiza_valor_inicial_do_lote

  enum status: {
    aberto: 1,
    fracassado: 2,
    homologado: 3
  }

  aasm column: :status, enum: true, whiny_transitions: false do
    state :aberto, :initial => true
    state :fracassado
    state :homologado

    event :fracassar_lote do
      transitions from: :aberto, to: :fracassado do
        guard do
          self.aberto? && self.leilao.confirmado? && !self.valores_dos_lotes_do_leilao.da_venda.present?
        end
      end
    end

    event :homologar_lote do
      transitions from: :aberto, to: :homologado do
        guard do
          self.aberto? && self.leilao.confirmado? && self.valores_dos_lotes_do_leilao.da_venda.present?
        end
      end
    end

    event :voltar_para_aberto do
      transitions from: :fracassado, to: :aberto do
        guard do
          self.fracassado? && !self.leilao.finalizado?
        end
      end
      transitions from: :homologado, to: :aberto do
        guard do
          self.homologado? && !self.leilao.finalizado?
        end
      end
    end
  end

  def valor_por_bem
    valor_para_calculo = self.valores_dos_lotes_do_leilao.definido.first.valor_do_lote

    valor_para_calculo / self.bens_dos_lotes_do_leilao.count rescue 0
  end

  def preenche_ordem_do_lote
    if ordem_lote.blank?
      ultimo_lote = self.leilao.lotes_do_leilao.order(:ordem_lote).last rescue nil

      if ultimo_lote.present?
        self.ordem_lote = ultimo_lote.ordem_lote + 1
      else
        self.ordem_lote = 1
      end
    end
  end

  def marca_bens_como_leilao
    self.bens_dos_lotes_do_leilao.each do |bem_do_lote|

      desafetacao_do_bem = Patrimonio::DesafetacaoDoBem.create!(
        bem_patrimonial_id: bem_do_lote.bem_patrimonial_id,
        status: :leilao,
        para_venda: true,
        data_da_desafetacao: Date.today,
        observacao: "Desafetação realizada através do Leilão de Nº #{self.leilao.numero_leilao}, Lote Nº #{self.ordem_lote}."
      )

      bem_do_lote.bem_patrimonial.status = :desafetado
      #alterar a conta pcasp aqui
      bem_do_lote.bem_patrimonial.save!
    end
  end

  def desmarca_bens_como_leilao
    self.bens_dos_lotes_do_leilao.each do |bem_do_lote|
      bem_do_lote.bem_patrimonial.desafetacao_do_bem.destroy!

      bem_do_lote.bem_patrimonial.status = :ativo
      #alterar a conta pcasp aqui
      bem_do_lote.bem_patrimonial.save!
    end
  end

  def marca_bens_como_desreconhecido
    self.bens_dos_lotes_do_leilao.each do |bem_do_lote|

      baixa_do_bem = Patrimonio::BaixaDoBem.create!(
        bem_patrimonial_id: bem_do_lote.bem_patrimonial_id,
        status: :confirmado,
        motivo_da_baixa: :venda,
        comissao_id: self.leilao.comissao_id,
        data_da_baixa: Date.today,
        observacao: "Baixa realizada através do Leilão de Nº #{self.leilao.numero_leilao}, Lote Nº #{self.ordem_lote}.",
        valor_atual_do_bem: self.valor_por_bem
      )

      movimentacao_financeira_do_tombamento = Patrimonio::MovimentacaoFinanceiraDoBem.create!(
        bem_patrimonial_id: bem_do_lote.bem_patrimonial_id,
        data_da_movimentacao: baixa_do_bem.data_da_baixa,
        origem_id: baixa_do_bem.id,
        origem_type: baixa_do_bem.class.name,
        valor_inicial: self.valor_por_bem,
        valor_da_operacao: (self.valor_por_bem * - 1),
        valor_final: 0
      )

      bem_do_lote.bem_patrimonial.status = :desreconhecido
      #alterar a conta pcasp aqui
      bem_do_lote.bem_patrimonial.save!
    end
  end

  def desmarca_bens_como_desreconhecido
    self.bens_dos_lotes_do_leilao.each do |bem_do_lote|
      bem_do_lote.bem_patrimonial.baixa_do_bem.destroy!

      bem_do_lote.bem_patrimonial.status = :desafetado
      bem_do_lote.bem_patrimonial.valor_atualizado_do_bem = bem_do_lote.bem_patrimonial.valor_atualizado_do_bem_patrimonial
      #alterar a conta pcasp aqui
      bem_do_lote.bem_patrimonial.save!
    end
  end

  def faz_reavaliacao_do_bem
    self.bens_dos_lotes_do_leilao.each do |bem_do_lote|

      reavaliacao_do_bem = Patrimonio::AvaliacaoDoBem.create!(
        bem_patrimonial_id: bem_do_lote.bem_patrimonial_id,
        status: :confirmado,
        tipo_de_avaliacao: :reavaliacao,
        comissao_id: self.leilao.comissao_id,
        data_da_avaliacao: Date.today,
        observacao: "Reavaliação realizada através do Leilão de Nº #{self.leilao.numero_leilao}, Lote Nº #{self.ordem_lote}.",
        valor_diferenca: (bem_do_lote.bem_patrimonial.valor_atualizado_do_bem - self.valor_por_bem),
        valor_inicial: bem_do_lote.bem_patrimonial.valor_atualizado_do_bem,
        valor_final: self.valor_por_bem,
        vida_util: 0
      )

    end
  end

  def desfaz_reavaliacao_do_bem
    self.bens_dos_lotes_do_leilao.each do |bem_do_lote|
      reavaliacao_do_bem = Patrimonio::AvaliacaoDoBem.where(bem_patrimonial_id: bem_do_lote.bem_patrimonial_id,
        observacao: "Reavaliação realizada através do Leilão de Nº #{self.leilao.numero_leilao}, Lote Nº #{self.ordem_lote}." )

      reavaliacao_do_bem.destroy_all
    end
  end

  def tipo_de_label
		if self.status == 'aberto'
			"info"
		elsif self.status == 'homologado'
			"success"
		elsif self.status == 'fracassado'
			"danger"
		end
	end

  def adiciona_bens_do_lote(bens)
		quantidade = 0
		bens.each do |bem|
			if self.bens_dos_lotes_do_leilao.build(bem_patrimonial_id: bem.to_i)
				quantidade += 1
			end
		end
		return quantidade
	end

  def cria_ou_atualiza_valor_inicial_do_lote
    if self.bens_dos_lotes_do_leilao.any? && self.aberto?
      valor_inicial = valores_dos_lotes_do_leilao.inicial.first

      valor_total_dos_bens = self.bens_patrimoniais.sum(&:valor_atualizado_do_bem_patrimonial)

      if valor_inicial.present?
        valor_inicial.valor_do_lote = valor_total_dos_bens
        valor_inicial.save
      else
        valor_inicial = Patrimonio::ValorDoLoteDoLeilao.create(
          lote_do_leilao_id: self.id,
          tipo_de_valor: :valor_inicial,
          valor_do_lote: valor_total_dos_bens,
          data_do_valor: Date.today
        )
      end
    end
  end

end
