class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
  devise :session_limitable # other devise options

  before_update :warehouse_or_pointsale

  #-- Associations
  belongs_to :pointsale
  belongs_to :warehouse
  has_many :pre_sales
  has_many :product_wastes
  has_many :pre_purchases
  has_many :open_cash_registers
  has_many :credit_payments
  has_many :cash_outs
  has_many :special_prices
  has_many :transfers
  has_many :commissions
  has_many :products_returns

  enum status: [:erased, :active, :inactive]
  ##--- Llevar registro de Actividad del usuario
  audited

  ##--- Validaciones previas de guardar
  attr_accessor :skip_validations_from_pointsale
  attr_accessor :skip_validations_when_edit
  validates_presence_of :userid, message: "Debe especificar el nombre de usuario, es con el que el usuario iniciará sesión."
  validates :password, presence: { message: "Debe especificar la contraseña nueva" },  length: { within: Devise.password_length, too_short: "La contraseña no puede ser menor a %{count}." }, unless: :skip_validations_when_edit
  validates :password_confirmation, presence: { message: "Debe confirmar la contraseña nueva" }, unless: :skip_validations_when_edit
  # validates_presence_of :pointsale_id, message: "Debe seleccionar el punto de venta al que pertenecera el usuario.", on: [:create, :update], unless: :skip_validations_from_pointsale
  validates_presence_of :usertype, message: "Debe seleccionar el tipo de usuario, con este se determinara los permisos que tendrá dentro del sistema.", on: [:create, :update], unless: :skip_validations_from_pointsale

  validates :pointsale_id, presence: { message: "Debe seleccionar un almacén o un punto de venta al que pertenecerá el usuario." }, if: proc { |c| c.warehouse_id.blank? && c.usertype != 'A' }, on: [:create, :update], unless: :skip_validations_from_pointsale
  validates :warehouse_id, presence: { message: "Debe seleccionar un almacén o un punto de venta al que pertenecerá el usuario." }, if: proc { |c| c.pointsale_id.blank? && c.usertype != 'A' }, on: [:create, :update], unless: :skip_validations_from_pointsale

  validates :userid, uniqueness: { message: "El usuario ya fue utilizado, favor de especificar otro." }

  def full_name
    "#{first_name} #{last_name}"
  end

  def get_open_cash_register
    open_cash_registers.where(status: 0).last
  end

  def warehouse_or_pointsale
    if pointsale_id.present?
      self.warehouse_id = nil
    elsif warehouse_id.present?
      self.pointsale_id = nil
    end
  end

  def active_for_authentication?
    super && active?
  end

  def inactive_message
    "Usuario desactivado, contacte al administrador para activar su cuenta"
  end
end
