# -*- coding: utf-8 -*-
class WorkShiftsController < ApplicationController
 
  before_filter :isAuthorization
 # around_filter :isAccessRead
  
  before_filter :set_var
  before_filter :can_edit, :only => [:edit, :update]
  before_filter :can_edit_async, :only => [:edit_person, :update_person]
  
  def index
    # view_type ["Отображать отчеты",  1], ["Отображать время работы", 0], ["Отображать общее расписание", 2]
    @reports = []
    @employee_working_without_shifts = []
    if (params[:date])
      @date = params[:date].to_date
      @view_type = params[:view_type]
    else
      @date = (Date.today).beginning_of_month
      @view_type = 1
    end
    WorkShift.find_or_create_for_month(@date, @department) # добавляем регулярное расписание
    WorkShift.calculate_shifts(@date)

    if @view_type.to_i == 2
      @shifts = WorkShift.for_department(@department).for_calendar(@date).with_employee(params[:empl_id])
    else
      @shifts = WorkShift.with_employee(params[:empl_id]).find_or_create_for_month(@date, @department) 
    end
      @empls = @shifts.map{|i| [i.employee_nic, i.employee_id]}.uniq.sort.insert(0, ['---Все сотрудники---', nil])  

     cond = ((params[:empl_id].present? && params[:empl_id] != '0') ? " AND e.empl_id = '#{params[:empl_id]}'" : "")
    ## Также нужно отображать людей, которые работали при этом не указаны в сменах
    @reports = DoneEmployee.find_by_sql("SELECT e.empl_id employee_id, DATE(r.date) shift_date, e.empl_name employee_nic, COUNT(r.id) works_count FROM done_employees e LEFT JOIN reports r on e.report_id = r.id WHERE r.status = '2' AND r.department = 'construction' AND DATE(r.date) BETWEEN DATE('#{@date.beginning_of_month.beginning_of_week}') AND DATE('#{@date.end_of_month.end_of_week}') AND r.closed_at IS NULL #{cond} GROUP BY employee_id, employee_nic, shift_date ORDER BY employee_nic")
    @employee_working_without_shifts = @reports.select{|i| !@shifts.map{|s| [s.employee_id, s.shift_date]}.include?([i.employee_id.to_i, i.shift_date.to_date])}
      render :template => 'work_shifts/index_mod'
  end
  

  def edit # Редактирование расписания на ДАТУ
      @shifts = WorkShift.for_department(@department).for_date(@date)      
      @employees = (Employee.working + @shifts.map{|i| i.employee}).flatten.uniq.sort_by{ |i| i.nic.downcase}
      @reports = DoneEmployee.find_by_sql("SELECT e.empl_id id, e.empl_name login, COUNT(r.id) works_count FROM done_employees e LEFT JOIN reports r on e.report_id = r.id WHERE r.status = '2' AND r.department = '#{@department}' AND r.closed_at IS NULL AND DATE(r.date) = DATE('#{@date}') GROUP BY id, login")    
      @employee_working_without_shifts = Employee.find @reports.map{|i| i.id} - @employees.map{|i| i.id} # UNCOMMENT
  end


  def update  # Редактирование расписания на ДАТУ
    @employees = params[:employees]
err = 0
    period = Period.find_by_sql "SELECT * FROM periods WHERE DATE_FORMAT(periods.month, '%m.%Y') = '#{@date.to_date.strftime("%m.%Y")}' AND periods.department = '#{@department}' LIMIT 1"
    if period && period.first.closed == false    
      @employees.each  do |k, v|
        empl = Employee.find k
        empl.attributes = v
        err += 1 unless empl.save
      end
    # Если понадобится регулярное расписание
    #        if params[:regular] == "1" ### Расписание делаем регулярным
    #          reg_was = RegularWorkShift.find(:all, :conditions => "department = '#{@department}' AND day_of_week = #{@date.strftime('%u')}")
    #          RegularWorkShift.update_regulars(reg_was, @shifts)
    #        end      
    else
      flash[:error] = "Период закрыт, изменение невозможно."
    end
        respond_to do |format|
          if err == 0
            flash[:notice] = 'Запись обновлена'
            format.html { redirect_to work_shifts_path(:date => @date, :view_type => 1)}
          else
            flash.now[:error] = err
            format.html { render :action => "edit" }
          end

        end    
  end


  def edit_person  # Редактирование расписания для СОТРУДНИКА на неделю
      @employee = Employee.find params[:id]
      @week = @date.beginning_of_week..@date.end_of_week
      @shifts = WorkShift.find(:all, :conditions =>"shift_date BETWEEN ('#{@week.first}') AND ('#{@week.last}') AND department = '#{@department}' AND employee_id = '#{@employee.id}'")
      @reports = DoneEmployee.find_by_sql("SELECT DATE(r.date) s_date, COUNT(r.id) works_count FROM done_employees e LEFT JOIN reports r on e.report_id = r.id WHERE r.status = '2' AND r.closed_at IS NULL AND r.department = '#{@department}' AND DATE(r.date) BETWEEN DATE('#{@week.first}') AND DATE('#{@week.last}') AND e.empl_id = '#{@employee.id}' GROUP BY s_date")

      render :update do |page|
        page.show 'window2'
        page.replace_html  'yield2', :partial => 'edit_person_shift'
        page.call "set_time"
        page.call "check_sub"
      end
  end


  def update_person  # Редактирование расписания для СОТРУДНИКА на неделю
    @reports_for_update = []
    @employee = Employee.find(params[:id])
    @week = @date.beginning_of_week .. @date.end_of_week
    @employee.update_attributes(params[:employee])
    if params[:regular] == "1" ### Расписание делаем регулярным
      new_shifts = WorkShift.find(:all, :conditions =>"shift_date BETWEEN ('#{@week.first}') AND ('#{@week.last}') AND department = '#{@department}' AND employee_id = '#{@employee.id}'")
      reg_was = RegularWorkShift.find(:all, :conditions => "department = '#{@department}' AND employee_id = #{@employee.id}")
      RegularWorkShift.update_regulars(reg_was, new_shifts)      
    end
    render :update do |page|
      page.hide 'window2'     
      if @view_type.to_i != 2 
        cond = ((params[:empl_id].present? && params[:empl_id] != '0') ? " AND e.empl_id = '#{params[:empl_id]}'" : "")
        @shifts = WorkShift.for_department(@department).for_week(@week.first)
        @reports = DoneEmployee.find_by_sql("SELECT e.empl_id employee_id, DATE(r.date) shift_date, e.empl_name employee_nic, COUNT(r.id) works_count FROM done_employees e LEFT JOIN reports r on e.report_id = r.id WHERE r.status = '2'  AND r.closed_at IS NULL AND r.department = '#{@department}' AND DATE(r.date) BETWEEN DATE('#{@week.first}') AND DATE('#{@week.last}') #{cond} GROUP BY employee_id, employee_nic, shift_date")                
        @employee_working_without_shifts = @reports.select{|i| !@shifts.map{|s| [s.employee_id, s.shift_date]}.include?([i.employee_id.to_i, i.shift_date.to_date])}        
        @week.each do |date|
          page.replace_html  date, :partial => 'day', :locals =>{:day => date}
        end
      else 
        @week.each do |date|
          page.replace_html  date, :partial => 'day_rasp', :locals =>{:day => date}
        end
      end
    end
  end


  
 def shirking
    @month = (params[:month] || Date.today).to_date
    @shifts = { }
    @wd = { }
    WorkShift.for_department(@department).for_month(@month).map{|i|  (@shifts.include? i.employee_id) ? @shifts[i.employee_id] += [i.shift_date.day] : @shifts[i.employee_id] = [i.shift_date.day]}
   
   DoneEmployee.find_by_sql("SELECT de.empl_id e_id, r.date r_date FROM done_employees de LEFT JOIN reports r on r.id = de.report_id WHERE r.status = '2'  AND r.closed_at IS NULL AND r.department = '#{@department}' AND DATE(r.date) BETWEEN DATE('#{@month.beginning_of_month}') AND DATE('#{@month.end_of_month}')").map{|i|  (@wd.include? i.e_id.to_i) ? @wd[i.e_id.to_i] += [i.r_date.to_date.day] : @wd[i.e_id.to_i] = [i.r_date.to_date.day]}

  #  DoneEmployee.find(:all, :include => "report", :conditions => "status = '2' AND reports.department = '#{@department}' AND DATE(reports.date) BETWEEN DATE('#{@month.beginning_of_month}') AND DATE('#{@month.end_of_month}')").map{|i|  (@wd.include? i.empl_id) ? @wd[i.empl_id] += [i.report.date.to_date.day] : @wd[i.empl_id] = [i.report.date.to_date.day]}
    @employees = Employee.find(@wd.keys+@shifts.keys).uniq.sort_by{|i| i.login}

  end


  private
  
  def set_var
    $menu = {} # Для старых разделов mod corp
    Employee.current_user = Employee.find(session[:user_id]) unless session[:user_id].nil?
    @department = "construction"
    self.class.layout "constr_works"
    @current_user = Employee.find(session[:user_id]) unless session[:user_id].nil?
    @boss = (@current_user.accesses.for_department(@department).size > 0 && (@current_user.position == 'диспетчер' || @current_user.accesses.for_department(@department).first.access_superuser == 1))
  end

  def can_edit
    @date = params[:date].to_date
    @view_type = params[:view_type]
    unless @boss
      @errors = "Недостаточно прав!"
      render(:partial => "/shared/errors")        
    end
  end


  def can_edit_async
    @date = params[:date].to_date
    @view_type = params[:view_type]
    unless @boss
      render :update do |page|
        page.call 'alert', "Недостаточно прав!"
      end
    end
  end



end
