class Patrimonio::DadosExtrasDoBem < ApplicationRecord
  include EnumIsh::Base
  has_paper_trail

  attr_default :estado_do_bem, 'novo'
  attr_default :data_do_tombamento, Date.today
  attr_default :data_inicio_depreciacao, Date.today + 1.month

  attr_accessor :descricao_do_bem
  attr_accessor :data_do_tombamento
  attr_accessor :numero_do_tombo
  attr_accessor :data_inicio_depreciacao
  attr_accessor :unidade_gestora_id
  attr_accessor :estado_do_bem
  attr_accessor :localizacao
  attr_accessor :responsavel_localizacao
  attr_accessor :tombamento_manual

  enum natureza_do_bem: { previsao_orcamentaria: 1, execucao_orcamentaria: 2}

  enum tipo_de_ingresso: { doacao: 1, confeccao: 2 , compra: 3, carta_de_setenca: 4, cessao: 5, comodato: 6, implantacao: 7, locacao: 8,
    permuta: 9, reintegracao: 10, desapropriacao: 11, nascimento: 12, usucapiao: 13, dacao_em_pagamento: 14, construcao: 15, de_relancamento: 16 }

  enum_ish :estado_do_bem, ['novo', 'bom', 'regular', 'pessimo', 'ocioso', 'recuperavel', 'antieconomico', 'inservivel_irrecuperavel'], default: 'novo'

  has_many :bens_patrimoniais, class_name: 'Patrimonio::BemPatrimonial', dependent: :destroy
  belongs_to :fornecedor, class_name: "Base::Pessoa", foreign_key: "fornecedor_id"
  belongs_to :doador, class_name: "Base::Pessoa", foreign_key: "doador_id"
  belongs_to :item_do_recebimento_de_bem, class_name: 'Patrimonio::ItemDoRecebimentoDeBem'

  has_one :recebimento_de_bem, through: :item_do_recebimento_de_bem

  accepts_nested_attributes_for :bens_patrimoniais

  validates_presence_of :data_do_tombamento, :inicio_da_depreciacao, if: proc { self.bens_patrimoniais.blank? }, unless: Proc.new { Rails.env.test? }
  validates_numericality_of :vida_util, greater_than_or_equal_to: 1, less_than_or_equal_to: 10, unless: Proc.new{ recebimento_de_bem.de_veiculo? }

  def unidade_gestora
    unidade = unidade_gestora_id.present? ? Loa::UnidadeGestora.find(unidade_gestora_id) : recebimento_de_bem.unidade_orcamentaria.unidade_gestora
    unidade.codigo_e_nome
  end

  def gerar_bens_patrimoniais(ultima_sequencia)
    tomb_inicial = self.numero_do_tombo
    invalidos = []
    bens = []
    unless self.gerou_bens == true
      if self.bens_patrimoniais.present?
        self.bens_patrimoniais.each do |bem|
          unless self.tombamento_manual.to_boolean == true
            bem.numero_do_tombamento = tomb_inicial
            bem.data_do_tombamento = self.data_do_tombamento
            bem.inicio_da_depreciacao = self.data_inicio_depreciacao
            bem.descricao = self.descricao_do_bem

            tomb_inicial = (tomb_inicial.to_i + 1).to_s.rjust(tomb_inicial.size, '0')
          end
          ultima_sequencia = ultima_sequencia.to_i + 1
          bem.sequencia = ultima_sequencia
          bem.unidade_gestora_id = unidade_gestora_id
          bem.gera_localizacao_do_bem_inicial(self.localizacao) if bem.id.present?

          bens << bem
          invalidos << true if !bem.valid?
        end
      else
        self.item_do_recebimento_de_bem.quantidade.to_i.times do |i|
          ultima_sequencia = ultima_sequencia.to_i + 1
          bem_patrimonial = Patrimonio::BemPatrimonial.new(
            orcamento_id: self.item_do_recebimento_de_bem.recebimento_de_bem.orcamento_id,
            sequencia: ultima_sequencia,
            dados_extras_do_bem_id: self.id,
            descricao: descricao_do_bem,
            unidade_gestora_id: unidade_gestora_id,
            status: 'ativo',
            data_do_tombamento: data_do_tombamento,
            item_do_recebimento_de_bem_id: item_do_recebimento_de_bem.id
          )
          bens << bem_patrimonial
          invalidos << true if !bem_patrimonial.valid?
        end
      end

      if !invalidos.present?
        bens.each{|bem| bem.save!}
        self.update_column(:gerou_bens, true)
        return ultima_sequencia
      end
    end
  end

end
