class GestaoDeEstoque::Almoxarifado < ApplicationRecord
	has_paper_trail

	include IncrementadorDeCodigoConcern
	include TradutorConcern

	after_initialize :atribui_codigo_disponivel, if: Proc.new { codigo.nil? }
	attr_default :contem_escola, false

	belongs_to :almoxarifado_principal, class_name: 'GestaoDeEstoque::Almoxarifado'
	belongs_to :cidade, class_name: 'Base::Cidade'
	belongs_to :farmaceutico, class_name: 'Base::Pessoa', foreign_key: 'farmaceutico_id'
	belongs_to :orcamento
	belongs_to :escola, class_name: 'GestaoDeEstoque::Escola'

	has_many :sub_almoxarifados, class_name: 'GestaoDeEstoque::Almoxarifado', foreign_key: 'almoxarifado_principal_id', dependent: :destroy
	has_many :unidades_orcamentarias_do_almoxarifado, dependent: :destroy
	has_many :unidades_orcamentarias, through: :unidades_orcamentarias_do_almoxarifado
	has_many :ordens_de_compra, class_name: 'Licitacao::OrdemDeCompra'
	has_many :recebimento_de_materiais, class_name: 'GestaoDeEstoque::RecebimentoDeMaterial'
	has_many :movimentacoes_do_estoque, class_name: 'GestaoDeEstoque::MovimentacaoDoEstoque'
	has_many :controle_de_extintores, class_name: 'GestaoDeEstoque::ControleDeExtintor'
	has_many :controle_de_pragas, class_name: 'GestaoDeEstoque::ControleDePraga'
	has_many :responsaveis_dos_almoxarifados, class_name: 'GestaoDeEstoque::ResponsavelDoAlmoxarifado'
	has_many :estoques, dependent: :restrict_with_exception, class_name: 'GestaoDeEstoque::Estoque', foreign_key: 'almoxarifado_id'
	# has_many :escolas_por_almoxarifado, class_name: 'GestaoDeEstoque::EscolaPorAlmoxarifado', dependent: :destroy

	accepts_nested_attributes_for :unidades_orcamentarias_do_almoxarifado, reject_if: :all_blank, allow_destroy: true
	accepts_nested_attributes_for :responsaveis_dos_almoxarifados, reject_if: :all_blank, allow_destroy: true
	# accepts_nested_attributes_for :escolas_por_almoxarifado, reject_if: :all_blank, allow_destroy: true

	validate :valida_obrigatoriedade_unidades_orcamentarias_do_almoxarifado

	validates :codigo, presence: true, length: {maximum: 3}
	validates :nome, presence: true, length: {maximum: 100}
	validates :email, presence: false, length: {maximum: 120}
	validates :tipo_de_almoxarifado , presence:true

	validates_length_of :numero, maximum: 8
	validates_length_of :logradouro, maximum: 120
	validates_length_of :complemento, maximum: 80
	validates_length_of :bairro, maximum: 60

	validates_length_of :cep, is: 8, allow_blank: true

	validates_format_of :email, :with => /\A[^@\s]+@([^@\s]+\.)+[^@\s]+\z/, allow_blank: true

	scope :principais, -> { where(almoxarifado_principal_id: nil) }
	scope :almoxarifados, -> { where.not(almoxarifado_principal_id: nil) }

	enum tipo_de_almoxarifado: {
		almoxarifado_central: 0,
		almoxarifado_local: 1,
		centro_de_distribuicao: 2,
		farmacia_central: 3,
		farmacia_local: 4,
		patio_de_material_de_construcao: 5,
		banco_de_alimentos_central: 6,
		banco_de_alimentos_local: 7,
		outros: 8,
		patrimonio: 9
	}

	def valida_obrigatoriedade_unidades_orcamentarias_do_almoxarifado
		errors.add(:unidades_orcamentarias_do_almoxarifado, "É obrigatório informar pelo menos uma Unidade Orçamentária.") if self.unidades_orcamentarias_do_almoxarifado.empty?
	end

	def atribui_codigo_disponivel
		self.codigo = gerar_sugestao_codigo(:codigo, 3, nil)
	end

	def endereco_completo
		(self.logradouro.blank? and self.numero.blank? and self.bairro.blank?) ? 'Sem Endereço' : "#{self.logradouro}, #{self.numero.blank? ? 'S/N' : self.numero }, #{self.bairro}"
	end

	def email_do_setor
		self.email.blank? ? 'Nenhum e-mail informado' : self.email
	end

	def codigo_e_nome
		"#{self.codigo} - #{self.nome}"
	end

	def responsavel_atual
		self.responsaveis_dos_almoxarifados.where('data_de_entrada <= ? and (data_de_saida >= ? or data_de_saida is null)', Date.today, Date.today).first
	end

	def existe_responsavel_periodo?(data_de_entrada, data_de_saida)
		existe_responsavel = self.responsaveis_dos_almoxarifados.where('(data_de_entrada <= ? and data_de_saida >= ?) or (data_de_entrada <= ? and data_de_saida >= ?) or (data_de_entrada < ? and data_de_saida is null)', data_de_entrada, data_de_entrada, data_de_saida, data_de_saida, data_de_saida).first
		return existe_responsavel
	end

	def nome_escola
		if self.escola.present?
			"#{self.escola.nome}"
		else
			return nil
		end
  end

	def programas_por_escola
		if self.escola.present?
			self.escola.programa_por_escolas.map{|programa| [programa.nome_programa_e_acao_completa, programa.id]}
		else
			return nil
		end
  end
end
