# -*- coding: utf-8 -*-
## Рабочие смены
class WorkShift < Shift

  has_many :done_employees, :class_name => "DoneEmployee", :finder_sql => 'SELECT e.* FROM done_employees e LEFT JOIN reports r ON e.report_id = r.id WHERE DATE(r.date) = DATE("#{self.shift_date}") AND r.department = "#{self.department}" AND (r.status = 2 OR r.department = "ams" AND e.empl_id = #{self.employee_id})'

  has_many :reports, :class_name => "Report", :finder_sql => 'SELECT reports.* FROM reports WHERE DATE(date) = DATE("#{self.shift_date}")'

  belongs_to :employee
  before_create :check_ident, :check_period
  before_update :check_period
#  def works_count
#    done_employees.size
#  end
  attr_accessor_with_default(:checked_m) {true unless new_record?}

  def self.from_old_format
    shifts = self.soft
    for shift in shifts do
      day_of_week = Russian::strftime(shift.shift_date, '%u')
      reg = RegularShift.find(:first, :conditions =>"day_of_week = #{day_of_week} AND employee_id = #{shift.employee_id}")
      if reg
        shift.update_attributes(:regular_shift => reg)
      end
    end
    
    # welder_complete = Report.find(:all, :conditions =>"reports.department = 'welder' AND global_reasons != 1 AND DATE(date) < DATE('2014/04/26')")
    # Report.update(welder_complete.map{|i| i.id}, [:status => 2]*welder_complete.size)
    # welder_works = Report.find(:all, :conditions =>"reports.department = 'welder' AND global_reasons != 1 AND DATE(date) > DATE('2014/04/26')")
    # shift_works = Report.find(:all, :conditions => "reports.department = 'welder' AND reports.global_reasons = 1 AND DATE(date) > DATE('2014/04/26')")
    # for rep in welder_works do
    #   new_status = shift_works.select{|i| i.date.to_date == rep.date.to_date}.first.status 
    #   rep.update_attribute(:status, new_status) unless rep.status == new_status
    # end

  end

  def self.find_or_create_for_month(s_date, dep)
    reg_shifts = RegularWorkShift.find(:all, :conditions =>"department = '#{dep}'", :include =>"work_shifts")
    if reg_shifts.map{|i| i.work_shifts.select{|i| i.shift_date >= s_date.beginning_of_month && i.shift_date <=s_date.end_of_month}.size}.sum() == 0
      date = s_date.beginning_of_month - 1.day
      Time.days_in_month(s_date.month, s_date.year).times do |t|
        date += 1.day
        regs = reg_shifts.select{|i| i.day_of_week.to_s == date.strftime('%u')}
        for reg in regs do
          reg.work_shifts.create(:shift_date => date)
        end
      end
    end
    shifts = WorkShift.for_calendar(s_date).for_department(dep)
    return shifts
  end


  def self.for_week_rasp(dep, date)
    date_from = date.to_date.beginning_of_week
    date_to = date.to_date.end_of_week
    RegularShift.find_by_sql("SELECT
                              IFNULL(GROUP_CONCAT(IF((WEEKDAY(s.shift_date) = 0), CONCAT(TIME_FORMAT(s.time_from, '%k:%i'), ' - ', TIME_FORMAT(s.time_to, '%k:%i')), null) SEPARATOR ''), 'вых') monday,
                              IFNULL(GROUP_CONCAT(IF((WEEKDAY(s.shift_date) = 1), CONCAT(TIME_FORMAT(s.time_from, '%k:%i'), ' - ', TIME_FORMAT(s.time_to, '%k:%i')), null) SEPARATOR ''), 'вых') tuesday,
                              IFNULL(GROUP_CONCAT(IF((WEEKDAY(s.shift_date) = 2), CONCAT(TIME_FORMAT(s.time_from, '%k:%i'), ' - ', TIME_FORMAT(s.time_to, '%k:%i')), null) SEPARATOR ''), 'вых') wednesday,
                              IFNULL(GROUP_CONCAT(IF((WEEKDAY(s.shift_date) = 3), CONCAT(TIME_FORMAT(s.time_from, '%k:%i'), ' - ', TIME_FORMAT(s.time_to, '%k:%i')), null) SEPARATOR ''), 'вых') thursday,
                              IFNULL(GROUP_CONCAT(IF((WEEKDAY(s.shift_date) = 4), CONCAT(TIME_FORMAT(s.time_from, '%k:%i'), ' - ', TIME_FORMAT(s.time_to, '%k:%i')), null) SEPARATOR ''), 'вых') friday,
                              IFNULL(GROUP_CONCAT(IF((WEEKDAY(s.shift_date) = 5), CONCAT(TIME_FORMAT(s.time_from, '%k:%i'), ' - ', TIME_FORMAT(s.time_to, '%k:%i')), null) SEPARATOR ''), 'вых') saturday,
                              IFNULL(GROUP_CONCAT(IF((WEEKDAY(s.shift_date) = 6), CONCAT(TIME_FORMAT(s.time_from, '%k:%i'), ' - ', TIME_FORMAT(s.time_to, '%k:%i')), null) SEPARATOR ''), 'вых') sunday,
                               e.login nic, e.id employee_id
                               FROM shifts s LEFT JOIN pricelist.pl_people e ON e.id = s.employee_id WHERE s.type = 'WorkShift' AND s.department = '#{dep}' AND shift_date BETWEEN ('#{date_from}') AND ('#{date_to}') GROUP BY e.login ORDER BY e.login ")
  end


  def period 
    if shift_date.to_s != '' && department.to_s != ''
      period = Period.find_by_sql "SELECT * FROM periods WHERE DATE_FORMAT(periods.month, '%m.%Y') = '#{self.shift_date.to_date.strftime("%m.%Y")}' AND periods.department = '#{self.department}' LIMIT 1"
      if period
        return period.first
      else
        return false
      end
    else
      return false
    end
  end

  def self.calculate_shifts(date)
    @reps = Report.find_by_sql("SELECT de.empl_id e_id, DATE(r.date) date, COUNT(sl.id) sh FROM done_employees de LEFT JOIN reports r ON r.id = de.report_id  LEFT JOIN shifts sl ON DATE(sl.shift_date) = DATE(r.date) AND sl.employee_id = de.empl_id AND sl.type = 'WorkShift' WHERE r.closed_at IS NULL AND DATE(r.date) >= DATE('#{date.to_date.beginning_of_month}') AND DATE(r.date) <= DATE('#{date.to_date.end_of_month}') GROUP BY de.empl_id, DATE(r.date) HAVING sh = 0")
     # e = Employee.find e_id
    @reps.each do |d|
      WorkShift.create(:department =>"construction", :employee_id => d.e_id, :status => 1, :shift_date => d.date)
    end
  end



  private

  def check_ident
    if WorkShift.for_department(self.department).for_date(self.shift_date).with_employee(self.employee_id).size != 0
      return false
    end
  end




  def check_period
    if self.period == nil || self.period ==  false
      errors.add_to_base "Период не найден!"
      return false
    elsif self.period.closed == true
      errors.add_to_base "Период закрыт, внесение изменений невозможно!"
      return false      
    end
  end

end
