require 'digest/sha1'
require 'securerandom'

class User < ActiveRecord::Base
  acts_as_authentic do |c|
    c.logged_in_timeout = 2.hours
    c.merge_validates_length_of_password_field_options(minimum: 6)
    c.validates_uniqueness_of_email_field_options :on => [] #remove email uniqueness
  end

  easy_roles :roles_mask, method: :bitmask

  ROLES_MASK = %w[superadmin editor_admin editor_user provider_admin provider_user photographer deactivated photographer_admin guest]
  ROLES_MASK_PIXTECH = %w[photographer photographer_admin]

  disable_perishable_token_maintenance(true)
  before_create :reset_perishable_token, :create_settings
  after_create :create_first_light_box

  belongs_to  :title
  belongs_to  :country
  has_many    :light_boxes, dependent: :destroy
  has_many    :search_provider_group_names, dependent: :destroy
  has_many    :request_to_providers, dependent: :destroy
  has_many    :statistics
  has_one     :setting, dependent: :destroy
  has_many    :saved_searches, dependent: :destroy
  has_many    :photos, dependent: :destroy
  has_shortened_urls

  validates_presence_of     :login
  validates_length_of       :login,    within: 3..100
  validates_format_of       :login,    with: Authlogic::Regex.login #, :message => Authlogic.bad_login_message
  validates_presence_of     :email
  validates_length_of       :email,    within: 6..100
  validates_uniqueness_of   :email, scope: :title_id
  validates_format_of       :email,    with: Authlogic::Regex.email #, :message => Authlogic.bad_email_message

  before_save :set_password_updated_at

  serialize :permissions

  def logged_in_timeout
    unless self.is_guest?
      2.hours
    else
      self.class.logged_in_timeout
    end
  end

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

  def login=(value)
    write_attribute :login, (value ? value.downcase : nil)
  end

  def email=(value)
    write_attribute :email, (value ? value.downcase : nil)
  end

  def self.current
    UserSession.find.user
  end

  def add_role_to_user
    :add_role_to_user
  end

  def add_role_to_user=(value)
    clear_roles
    add_role(value)
  end

  def passed_settings
    customized_setting = setting.attributes
    ['id', 'user_id', 'updated_at', 'created_at'].each do |attr|
      customized_setting.delete(attr)
    end
    customized_setting
  end

  def providers_group
    title.title_provider_group_name
  end

  def providers
    is_superadmin? ? Provider.order('name ASC') : providers_group.providers.order('name ASC')
  end

  def set_password_updated_at
    self.password_updated_at = Time.now unless password_confirmation.blank?
  end

  def self.create_user(login, first_name, last_name, email, mdp, title, role_mask)
    self.create(login: login, first_name: first_name, last_name: last_name, email: email,
                title_id: title, password: mdp, password_confirmation: mdp, roles_mask: role_mask)
  end

  private

  def create_first_light_box
    if self.light_boxes.count == 0
      self.light_boxes << LightBox.new(name: I18n.t('light_box.name'), title_id: self.title_id)
    end
  end

  def create_settings
    create_setting
  end

end
