<?php
/**
 * 项目逻辑类
 *
 * @author qifan
 * @date 2020-12-16
 */

namespace app\work\logic;

use app\work\traits\WorkAuthTrait;
use think\Db;

class WorkLogic
{
    use WorkAuthTrait;
    
    public function index($param)
    {
        # 排序
        $orderField = 'w.work_id';
        $orderSort = 'asc';
        if (!empty($param['sort_type']) && $param['sort_type'] == 1) {
            $orderField = 'w.work_id';
            $orderSort = 'asc';
        }
        if (!empty($param['sort_type']) && $param['sort_type'] == 2) {
            $orderField = 'w.work_id';
            $orderSort = 'desc';
        }
        if (!empty($param['sort_type']) && $param['sort_type'] == 3) {
            $orderField = 'w.update_time';
            $orderSort = 'desc';
        }
        if (!empty($param['sort_type']) && $param['sort_type'] == 4) {
            $orderField = 'o.order';
            $orderSort = 'asc';
        }

        # 搜索
        $searchWhere = '';
        $dateWhere = [];
        $userWhere = [];
        $ownerUserId = !empty($param['owner_user_id']) ? $param['owner_user_id'] : '';
        $search = !empty($param['search']) ? $param['search'] : '';
        $type = !empty($param['type']) ? $param['type'] : 0;
        $startTime = !empty($param['start_time']) ? $param['start_time'] : '';
        $endTime = !empty($param['end_time']) ? $param['end_time'] : '';
        unset($param['search']);
        unset($param['type']);
        unset($param['start_time']);
        unset($param['end_time']);
        unset($param['owner_user_id']);
        
        switch ($type) {
            case 1 :
                # 今天
                $dateWhere['w.update_time'][] = ['egt', strtotime(date('Y-m-d 00:00:00'))];
                $dateWhere['w.update_time'][] = ['elt', strtotime(date('Y-m-d 23:59:59'))];
                break;
            case 2 :
                # 上周
                $dateWhere['w.update_time'][] = ['egt', strtotime('last week monday')];
                $dateWhere['w.update_time'][] = ['elt', strtotime(date('Y-m-d 23:59:59', strtotime('last week sunday')))];
                break;
            case 3 :
                # 上月
                $dateWhere['w.update_time'][] = ['egt', strtotime(date('Y-m-01 00:00:00', strtotime('last month')))];
                $dateWhere['w.update_time'][] = ['elt', strtotime(date('Y-m-d 23:59:59', strtotime('Last day of last month')))];
                break;
            case 4 :
                # 去年
                $dateWhere['w.update_time'][] = ['egt', strtotime(date('Y-01-01 00:00:00', strtotime('last year')))];
                $dateWhere['w.update_time'][] = ['elt', strtotime(date('Y-12-31 23:59:59', strtotime('last year')))];
        }
        
        # 时间区间
        if (!empty($startTime)) $dateWhere['w.update_time'] = ['egt', strtotime($startTime . '00:00:00')];
        if (!empty($endTime)) $dateWhere['w.update_time'] = ['elt', strtotime($endTime . '23:59:59')];
        
        # 搜索内容
        if ($search) $searchWhere = '(w.name like "%' . $search . '%") OR (w.description like "%' . $search . '%")';
        
        # 成员
        if (!empty($ownerUserId)) {
            $userIds = Db::name('work_user')->whereIn('user_id', $ownerUserId)->column('work_id');
            $userWhere['w.work_id'] = ['in', $userIds];
        }
        
        $userModel = new \app\admin\model\User();
        $perUserIds = $userModel->getUserByPer('work', 'work', 'index');
        $authUser = array_unique(array_merge([$param['user_id']], $perUserIds));

        if ($param['sort_type'] == 4 && db('work_order')->where('user_id', $param['user_id'])->count() > 0) {
            # 选择了按手动拖动排序,并且手动排过序。
            $data = Db::name('work')->alias('w')
                    ->field('w.*')
                    ->join('__WORK_ORDER__ o', 'o.work_id = w.work_id', 'left')
                    ->where(function ($query) {
                        $query->where('status', 1);
                        $query->where('ishidden', 0);
                    })
                    ->where(function ($query) use ($param, $authUser) {
                        $query->whereOr(['create_user_id' => ['in', $authUser]]);
                        $query->whereOr('is_open', 1);
                        $query->whereOr(function ($query) use ($param) {
                            $query->where('is_open', 0);
                            $query->where('owner_user_id', 'like', '%' . $param['user_id'] . '%');
                        });
                    })
                    ->where('o.user_id', $param['user_id'])
                    ->where($searchWhere)
                    ->where($dateWhere)
                    ->where($userWhere)
                    ->order($orderField, $orderSort)->select();
        } else {
            # 未手动排过序,如果选择了手动排序选项
            if ($param['sort_type'] == 4) {
                $orderField = 'w.work_id';
                $orderSort = 'asc';
            }

            $data = Db::name('work')->alias('w')
                    ->field('w.*')
                    ->where(function ($query) {
                        $query->where('status', 1);
                        $query->where('ishidden', 0);
                    })
                    ->where(function ($query) use ($param, $authUser) {
                        $query->whereOr(['create_user_id' => ['in', $authUser]]);
                        $query->whereOr('is_open', 1);
                        $query->whereOr(function ($query) use ($param) {
                            $query->where('is_open', 0);
                            $query->where('owner_user_id', 'like', '%' . $param['user_id'] . '%');
                        });
                    })
                    ->where($searchWhere)
                    ->where($dateWhere)
                    ->where($userWhere)
                    ->order($orderField, $orderSort)->select();
        }

        foreach ($data as $key => $value) {
            $data[$key]['authList']['project'] = $this->getRuleList($value['work_id'], $param['user_id'], $value['group_id']);
        }
        
        return $data;
    }

    /**
     * 手动设置项目顺序
     *
     * @param $workIds 项目ID数组
     * @param $userId 当前用户ID
     * @author fanqi
     * @date 2021-03-11
     * @return bool
     */
    public function setWorkOrder($workIds, $userId)
    {
        $data = [];

        foreach ($workIds AS $key => $value) {
            $data[] = [
                'work_id' => $value,
                'user_id' => $userId,
                'order'   => $key + 1
            ];
        }

        if (!empty($data)) {
            if (db('work_order')->where('user_id', $userId)->delete() === false) return false;
            if (db('work_order')->insertAll($data) === false) return false;
        }

        return true;
    }
}