<?php

namespace App\Model;

use App\Http\Services\AdminUserService;
use App\Http\Services\DepartmentService;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Redis;

class IntracodeModel extends Model
{
    protected $table = 'lie_intracode';
    protected $primaryKey = 'code_id';

    public function userInfo()
    {
        return $this->hasOne(UserInfoModel::class, 'admin_id', 'userId');
    }

    //默认不包含离职
    public function getEncode($includeResigned = false)
    {
        $redis = new RedisModel();
        $codeList = json_decode($redis->get('EncodedList_supplier_' . $includeResigned), true);
        if (!$codeList) {
            $query = $this->where('admin_id', '>', 0)->join('user_info', 'lie_intracode.admin_id', '=',
                'user_info.userId');
            if (!$includeResigned) {
                $query->where('user_info.status', '!=', 4);
            }
            $codeList = $query->select('code_id', 'admin_id', 'name',
                'email')->get();
            if ($codeList) {
                $codeList = $codeList->toArray();
                foreach ($codeList as $k => &$v) {
                    if (empty($v['name'])) {
                        $v['name'] = $v['email'];
                    }
                }
                $redis->set('EncodedList_supplier_' . $includeResigned, json_encode($codeList));
                $redis->expire('EncodedList_supplier_' . $includeResigned, 60);//缓存1分钟
            }
        }
        return $codeList;
    }

    //包含离职的
    public function getAllEncode()
    {
        $redis = new RedisModel();
        $codeList = json_decode($redis->get('EncodedList_all_supplier'), true);
        if (!$codeList) {
            $codeList = $this->where('admin_id', '>', 0)->join('user_info', 'lie_intracode.admin_id', '=',
                'user_info.userId')
                ->select('code_id', 'admin_id', 'name', 'email')->get();
            if ($codeList) {
                $codeList = $codeList->toArray();
                foreach ($codeList as $k => &$v) {
                    if (empty($v['name'])) {
                        $v['name'] = $v['email'];
                    }
                }
                $redis->set('EncodedList_all_supplier', json_encode($codeList));
                $redis->expire('EncodedList_all_supplier', 60);//缓存1分钟
            }
        }
        return $codeList;
    }

    //获取简单的内部用户数据
    //默认不包含离职的
    public function getSampleEncode($includeResigned = false)
    {
        $codeList = $this->getEncode($includeResigned);
        $result = [];
        foreach ($codeList as $code) {
            $result[$code['code_id']] = $code['name'] . '(' . $code['code_id'] . ')';
        }
        return $result;
    }

    //根据用户内部编码获取
    public function getSampleEncodeByCodeIds($codeIds = [])
    {
        $codeList = $this->getEncode(true);
        $result = [];
        foreach ($codeList as $code) {
            if (in_array($code['code_id'], $codeIds)) {
                $result[$code['code_id']] = $code['name'] . '(' . $code['code_id'] . ')';
            }
            continue;
        }

        return $result;
    }

    //获取简单的内部用户数据
    //默认不包含离职的
    public function getSampleName($includeResigned = false)
    {
        $codeList = $this->getEncode($includeResigned);
        $result = [];
        foreach ($codeList as $code) {
            $result[$code['code_id']] = $code['name'];
        }
        return $result;
    }


    //获取简单的内部用户数据(包含离职)
    public function getAllSampleEncode()
    {
        $codeList = $this->getAllEncode();
        $result = [];
        foreach ($codeList as $code) {
            $result[$code['code_id']] = $code['name'] . '(' . $code['code_id'] . ')';
        }
        return $result;
    }

    //获取采购员和对应的编码
    public function getChannelUsersEncode($includeResign = true)
    {
        $departmentService = new DepartmentService();
        //市场部
        $usersMarket = $departmentService->getUserByDepartmentId(4);
        //运营部
        $usersOperation = $departmentService->getUserByDepartmentId(9);
        //采购部
        $userChannel = $departmentService->getUserByDepartmentId(8);
        $users = array_merge(array_merge($usersMarket, $usersOperation), $userChannel);
        $userIds = array_column($users, 'userId');
        $users = $this->getEncodeByUserIds($userIds, $includeResign);
        $result = [];
        foreach ($users as $code) {
            $result[$code['code_id']] = $code['name'] . '(' . $code['code_id'] . ')';
        }
        return $result;
    }

    //获取admin_id对应user_code的用户数据
    public function getAdminUserAndCode()
    {
        $codeList = $this->getEncode();
        $result = [];
        foreach ($codeList as $code) {
            $result[$code['admin_id']] = $code['name'] . '(' . $code['code_id'] . ')';
        }
        return $result;
    }

    public function getCodeIdByUserName($userName)
    {
        $codeId = $this->where('admin_id', '>', 0)->join('user_info', 'lie_intracode.admin_id', '=', 'user_info.userId')
            ->where('user_info.name', $userName)
            ->value('code_id');
        return $codeId;
    }


    public function getEncodeByUserIds($userIds = [], $includeResign = true)
    {
        $query = $this->where('admin_id', '>', 0)->join('user_info', 'lie_intracode.admin_id', '=', 'user_info.userId')
            ->whereIn('user_info.userId', $userIds)
            ->select('code_id', 'admin_id', 'name', 'email', 'mobile');
        $code = $includeResign ? $query->get() : $query->where('user_info.status', '!=', 4)->get();
        if ($code) {
            $code = $code->toArray();
        }
        return $code;
    }

    //获取渠道开发那边的人员(还是会汇总所有的内部编码的,只是把运营他们那边的人员优先级提高一些)
    public function getPurchaseUserCodes()
    {
        $adminService = new AdminUserService();
        $users = $adminService->getPurchaseUsers();
        $codeIds = array_column($users, 'code_id');
        $codes = $this->getSampleEncode();
        $userCodes = [];
        foreach ($users as $user) {
            $userCodes[$user['code_id']] = $user['name'];
        }
        $temp = [];
        foreach ($codes as $code => $name) {
            if (in_array($code, $codeIds)) {
                unset($codes[$code]);
                $temp[$code] = $name;
            }
        }
        $userCodes = $temp + $codes;
        return $userCodes;
    }

    //获取内部编码相关信息
    public function getEncodedUserByEncoded($encodedList = [])
    {
        $encodedUsers = [];
        $codes = $this->select('code_id', 'admin_id')
            ->whereIn('code_id', $encodedList)
            ->get();
        if (empty($codes)) {
            return [];
        }
        $codes = $codes->toArray();
        $adminIds = array_column($codes, 'admin_id');
        $userModel = new UserInfoModel();
        $users = $userModel->whereIn('userId', $adminIds)->pluck('name', 'userId');
        foreach ($codes as $key => $code) {
            $encodedUsers[$code['code_id']] = array_get($users, $code['admin_id']);
        }
        return $encodedUsers;
    }
}