# -*- coding: utf-8 -*-

class Employee < ActiveRecord::Base
  set_table_name :people
  alias_attribute :login, :nic
  alias_attribute :lastname, :name
  acts_as_authentic do |c|
    c.login_field = "nic"
  end

  validates_uniqueness_of :nic, :allow_nil => false, :allow_blank => false, :message => "Логин должен быть уникальным!" 
  validates_presence_of :nic, :message =>"Введите ник"
  validates_presence_of :email, :message =>"Введите email"
  validates_presence_of :surname, :message =>"Введите Фамилию"
  #validates_format_of :nic, :with => /^\s*[A-Za-z0-9]+(\s*,\s*[A-Za-z0-9]+)*\s*$*_$*-/
  #TODO Проверка ника на отсутствие пробелов
  before_create :generate_auth_token

  
#  def self.table_name() "pricelist.pl_people" end
  cattr_accessor :current_user, :oper_date
  attr_accessor :show_all_divisions

  has_many :rep_employees,  :foreign_key => "report_id", :primary_key => "id"
  has_many :accesses, :foreign_key => 'empl_id'
  accepts_nested_attributes_for :accesses,  :allow_destroy => true
  has_many :done_employees, :foreign_key => :empl_id
  accepts_nested_attributes_for :done_employees, :reject_if => proc { |attributes| attributes['role'] != '1'},  :allow_destroy => true
  has_many :regular_shifts
  has_many :regular_work_shifts
  accepts_nested_attributes_for :regular_shifts, :reject_if => proc { |attributes| attributes['checked'] != '1'},  :allow_destroy => true

  has_many :work_shifts, :dependent => :destroy#, :autosave => :true
  accepts_nested_attributes_for :work_shifts, :reject_if => proc { |attributes| attributes['status'].to_i == 0 && attributes['description'].blank?},  :allow_destroy => true

  has_many :contacts, :foreign_key => "person_id", :order => "sort" do
    def mobile
      find(:first, :conditions =>"contact_type_id = '315'")
    end
  end
  has_one :person, :foreign_key => "login", :primary_key => "login"

#  has_many :reports, :through => :rep_employees
  belongs_to :division
  belongs_to :position
  #  default_scope :conditions => "active = 'Y'", :order => 'login'
  named_scope :with_division, lambda { |div| div.present? ? { :conditions => ['division_id = ?', div.to_i] } : { } }
  named_scope :from_division,  lambda { |div| div.present? ?  { :conditions => ['division_id = ?', div], :order => "login" } : { } }
  named_scope :working, :conditions => "(quitted IS NOT TRUE AND people.show IS NOT FALSE)", :order => 'nic'
  named_scope :masters, :conditions => "position = 'мастер'"

  def mobile
    phone = self.contacts.mobile
    if phone
      number = phone.contact().gsub(/[^0-9\.]/, '')
      if number.length == 10
        number = "7"+number
      end
      return number
    else
      return nil
    end      
  end

  def position_name
    if position
      position.name
    else
      ''
    end
  end
  
  def work_status_name
    if quitted == false
      "Уволен"
    else
      "Работает"
    end
  end
  
  def roles_for_view
    roles = []
    for ac in accesses do
      div_name = ac.division_name
      role_name = []
      if ac.access_admin == 1
        role_name << "админ"
      elsif ac.access_superuser == 1
        role_name << "суперюзер"        
      elsif ac.access_read == 1
        role_name << "мастер"
      elsif ac.access_write == 1
        role_name << "диспетчер"
      elsif ac.access_delete == 1
        role_name << "фаст диспетчер"
      end
      roles << div_name + ": " + role_name.join(", ")
    end
    return roles.join("<br>")
  end

      

  
  def self.wage_for_period_corp(employee, date)
    db_name = Rails.configuration.database_configuration[Rails.env]["database"]

    work_days = WorkingDay.find(:first, :conditions => {:month => date.beginning_of_month})
    if work_days
      @working_days = work_days.working_days.to_i
    else
      @working_days = 1
    end

  sum = DoneEmployee.find_by_sql(
    "SELECT SUM(IFNULL(de.sum, 0)) + IFNULL(s.sum / #{@working_days.to_f} * shifts.shifts, 0) as sum3 
                    FROM pricelist.pl_people e
            LEFT JOIN (
                       SELECT SUM(de.sum) sum, de.empl_id empl2_id 
                                  FROM #{db_name}.done_employees de 
                                           LEFT JOIN reports r ON de.report_id = r.id 
                                             WHERE de.empl_id = '#{employee.id}' AND r.closed_at is NULL AND r.status = '2' AND r.department = 'corp' AND r.dhcp_login = 'new' AND DATE(r.date) BETWEEN '#{date.beginning_of_month}' AND '#{date.end_of_month}' ) 
           de  ON e.id = de.empl2_id
            LEFT JOIN #{db_name}.salaries s ON s.division_id = e.division_id AND e.position = s.position AND s.date_from <= '#{date}'  
            LEFT JOIN (
                       SELECT COUNT(s.id) as shifts, s.employee_id empl_id FROM #{db_name}.shifts s WHERE employee_id = '#{employee.id}' AND type = 'WorkShift' AND department = 'corp' AND shift_date BETWEEN DATE('#{date.beginning_of_month}') AND DATE('#{date.end_of_month}') GROUP BY empl_id) shifts ON shifts.empl_id = e.id                  
                                                          WHERE e.id = '#{employee.id}'     GROUP BY e.id")
    return sum[0].sum3.to_i
  end



  def car_model_name
   if car_number && car_model
      return car_model.to_s +" "+ car_number.to_s
    else
    "(Задайте номер и модель машины в интрaнете!)"
     end
  end

  def car_motor_name
    if car_motor
      return car_motor
    else
      "(Задайте объем двигателя в интрaнете!)"
    end

  end


  

  def division_name
    if division
      division.name
    else
      'не опред.'
    end
  end



  def self.couriers_employees
    Employee.from_division(154).working.find(:all, :conditions =>"position IN ('пеший курьер', 'курьер на машине')")
  end


## new material
# # {
  #      :asset => {
  #        :id => b.asset_id,
  #        :name => b.asset.name,
  #        :group => b.asset.asset_group && b.asset.asset_group.name,
  #        :type => b.asset.asset_type && b.asset.asset_type.name,
  #        :manufacturer => b.asset.manufacturer && b.asset.manufacturer.name,
  #        :bonus => b.asset.bonus,
  #        :price => b.asset.selling_price
  #      },
  #      :count => b.count,
  #    }

  def materials(date_r=Date.today)
    #if  RAILS_ENV == 'production'
    begin
      mats = StoreSoap.employee_materials(self.nic.to_s, date_r)
      return mats

    rescue
      return []
    end
  #  else
  #    []
  #  end
  end


  ## PASSWORD
   def send_password_reset
    generate_token(:password_reset_token)
    self.password_reset_sent_at = Time.zone.now
    self.save
    EmployeeMailer.deliver_password_reset(self)
  end

  def generate_token(column)
    begin
      self[column] = SecureRandom.base64.tr("+/", "-_")
    end while Employee.exists?(column => self[column])
  end
  
  def generate_auth_token
    begin
      self[:auth_token] = SecureRandom.base64.tr("+/", "-_")
    end 
  end
###///PASSWORD
  
end
