class GestaoDeEstoque::ControleDeExtintor < ApplicationRecord
  has_paper_trail

  include TradutorConcern

  belongs_to :almoxarifado, class_name: "GestaoDeEstoque::Almoxarifado"

  validates :numero_do_extintor, presence: :true
  validates :data_de_fabricacao, presence: :false
  validates :tipo_de_extintor, presence: :true
  validates :almoxarifado_id, presence: :false

  has_many :manutencoes_do_extintor

  accepts_nested_attributes_for :manutencoes_do_extintor, allow_destroy: true


  enum tipo_de_extintor: {
    agua_pressurizada: 0,
    espuma: 1,
    cloreto_de_sodio: 2,
    dioximo_de_carbono: 3,
    po_quimico: 4,
    acetato_de_potassio: 5
  }

  enum prazo_para_recarga: {
    um_ano: 1,
    dois_anos: 2,
    tres_anos: 3,
    quatro_anos: 4,
    cinco_anos: 5
  }

  enum prazo_para_inspecao: {
    um_mes: 1,
    dois_meses: 2,
    tres_meses: 3,
    quatro_meses: 4,
    cinco_meses: 5,
    seis_meses: 6,
    sete_meses: 7,
    oito_meses: 8,
    nove_meses: 9,
    dez_meses: 10,
    onze_meses: 11,
    doze_meses: 12
  }

  def porcentagem_prazo_para_inspecao
    total_de_dias = ( self.data_da_ultima_manutencao - ( self.resgata_o_maior_prazo_para_inspecao ) ).to_i.abs
    dias_percorridos = ( Date.today - ( self.data_da_ultima_manutencao ) ).to_i * 100
    dias_percorridos = dias_percorridos > 0 ? dias_percorridos : 0
    porcentagem = (dias_percorridos.to_f / total_de_dias.to_f).round(2)
    return porcentagem > 100 ? 100 : porcentagem
  end

  def porcentagem_prazo_para_recarga
    total_de_dias = ( self.data_da_ultima_recarga - ( self.resgata_o_maior_prazo_para_recarga ) ).to_i.abs
    dias_percorridos = ( Date.today - ( self.data_da_ultima_recarga ) ).to_i * 100
    dias_percorridos = dias_percorridos > 0 ? dias_percorridos : 0
    porcentagem = (dias_percorridos.to_f / total_de_dias.to_f).round(2)
    return porcentagem > 100 ? 100 : porcentagem
  end

  def primeiro_prazo_da_inspecao
    if self.prazo_para_inspecao.present? && self.data_da_ultima_manutencao.present?
      return self.data_da_ultima_manutencao + self.prazo_para_inspecao_before_type_cast.month
    end
  end

  def primeiro_prazo_da_recarga
    if self.prazo_para_recarga.present? && self.data_da_ultima_recarga.present?
      return self.data_da_ultima_recarga + self.prazo_para_recarga_before_type_cast.year
    end
  end

  def resgata_o_maior_prazo_para_inspecao
    if self.manutencoes_do_extintor.any? { |manutencao| manutencao.inspecao? }
      maior_prazo_de_manutencao = Date.new
      self.manutencoes_do_extintor.inspecao.where.not(id: nil).each do |manutencao|
        if manutencao.data_de_expiracao_da_manutencao > maior_prazo_de_manutencao
          maior_prazo_de_manutencao = manutencao.data_de_expiracao_da_manutencao
        end
      end
      return maior_prazo_de_manutencao
    else
      return self.primeiro_prazo_da_inspecao
    end
  end

  def resgata_o_maior_prazo_para_recarga
    if self.manutencoes_do_extintor.any? { |manutencao| manutencao.recarga? }
      maior_prazo_de_recarga = Date.new
      self.manutencoes_do_extintor.recarga.where.not(id: nil).each do |manutencao|
        if manutencao.data_de_expiracao_da_manutencao > maior_prazo_de_recarga
          maior_prazo_de_recarga = manutencao.data_de_expiracao_da_manutencao
        end
      end
      return maior_prazo_de_recarga
    else
      return self.primeiro_prazo_da_recarga
    end
  end

  def dias_restantes_para_inspecao
    dias_restantes = (self.resgata_o_maior_prazo_para_inspecao - Date.today ).to_i
    return dias_restantes > 0 ? dias_restantes : 0
  end

  def dias_restantes_para_recarga
    dias_restantes = (self.resgata_o_maior_prazo_para_recarga - Date.today ).to_i
    return dias_restantes > 0 ? dias_restantes : 0
  end

end