<?php
/**
 * User.php
 * 用户接口 v2
 * @author Deepseath
 * @version $Id$
 */
namespace deepseath\hris\ApiV2;

class User
{
    /**
     * 基类服务对象
     * @var \deepseath\hris\Hris
     */
    protected $service = null;

    public function __construct(\deepseath\hris\Hris $service)
    {
        $this->service = $service;
    }

    /**
     * 员工基础信息
     * @desc 查询 HRIS 中的员工基础信息,参数为空返回所有成员
     * @param array $params
     * <pre>
     *      nameZH      按中文名模糊查询
     *      email       按邮箱查询
     * </pre>
     * @return array
     * <pre>
     *  list
     *   employeeId
     *   nameZH
     *   nameEN
     *   email
     *   wxUserId
     *   positionId
     *   remark1
     * </pre>
     */
    public function list(array $params = []) : array
    {
        $params = array_merge([
            //'nameZH' => '',
            //'email' => ''
        ], $params);

        $result = $this->service->apiRequest('get', 'employeeList', $params);
        return $result['employeeList'] ?? [];
    }

    /**
     * 新增员工
     * @desc 向HRIS中插入新用户
     * @param array $params
     * @return mixed
     */
    public function add(array $params) : mixed
    {
        if (!empty($params['email']) && preg_match('/@i\-click\.com$/is', $params['email'])) {
            // 如果是 i-click.com 邮箱则不处理
            throw new \Exception('i-click.com mail ignore', 4013);
        }
        $this->_fieldCheck($params);
        // $result;
        return $this->service->apiRequest('post', 'add_employee', $params);
    }

    /**
     * 更新员工
     * @desc 用户修改
     * @param array $params
     * @return mixed
     */
    public function update(array $params) : mixed
    {
        if (!empty($params['email']) && preg_match('/@i\-click\.com$/is', $params['email'])) {
            // 如果是 i-click.com 邮箱则不处理
            throw new \Exception('i-click.com mail ignore', 4013);
        }
        $this->_fieldCheck($params);
        return $this->service->apiRequest('post', 'edit_employee', $params);
    }

    /**
     * 更改邮箱专用接口
     *
     * @param array $params
     * <pre>
     * + employeeId
     * + email
     * + updateEmail
     * </pre>
     * @return mixed
     */
    public function email(array $params) : mixed
    {
        if (!empty($params['email']) && preg_match('/@i\-click\.com$/is', $params['email'])) {
            // 如果是 i-click.com 邮箱则不处理
            throw new \Exception('i-click.com mail ignore', 4013);
        }
        return $this->service->apiRequest('post', 'update_employee_email', $params);
    }

    /**
     * 员工离职
     * @param array $params
     * @param string $newEmail &离职后的 hris 成员邮箱
     * @return mixed
     */
    public function dismiss(array $params, &$newEmail = '') : mixed
    {
        if (!empty($params['email']) && preg_match('/@i\-click\.com$/is', $params['email'])) {
            // 如果是 i-click.com 邮箱则不处理
            throw new \Exception('i-click.com mail ignore', 4013);
        }
        if (isset($params['email']) && !preg_match('/dismiss_\d+_\d+/is', $params['email']) && !preg_match('/delete_\d+_\d+/is', $params['email'])) {
            // 不是离职标识邮箱,则先更改邮箱
            $emailParams = [];
            if (!empty($params['email'])) {
                $emailParams['email'] = $params['email'];
            }
            if (empty($params['email'])) {
                $params['email'] = 'dismiss_'.date('Ymd') .'_' . mt_rand(100000, 999999).'@vchangyi.com';
            } else {
                $params['email'] = $params['email'] . '_' . 'dismiss_'.date('Ymd') .'_' . mt_rand(100000, 999999);
            }
            $newEmail = $params['email'];
            $emailParams['updateEmail'] = $params['email'];
            $this->email($emailParams);
        }

        $params = array_merge($params, [
            'employeeStatus' => self::STATUS_OFFLINE
        ]);
        return $this->service->apiRequest('post', 'edit_employee', $params);
    }

    /**
     * 删除成员
     * @param array $params
     * @param string $newEmail &删除后 hris 成员的邮箱
     * @return mixed
     */
    public function delete(array $params, &$newEmail = '') : mixed
    {
        if (!empty($params['email']) && preg_match('/@i\-click\.com$/is', $params['email'])) {
            // 如果是 i-click.com 邮箱则不处理
            throw new \Exception('i-click.com mail ignore', 4013);
        }
        if (isset($params['email']) && !preg_match('/delete_\d+_\d+/is', $params['email']) && !preg_match('/dismiss_\d+_\d+/is', $params['email'])) {
            $emailParams = [];
            if (!empty($params['email'])) {
                $emailParams['email'] = $params['email'];
            }

            if (empty($params['email'])) {
                $params['email'] = 'delete_'.date('Ymd') .'_' . mt_rand(100000, 999999).'@vchangyi.com';
            } else {
                $params['email'] = $params['email'] . '_' . 'delete_'.date('Ymd') .'_' . mt_rand(100000, 999999);
            }
            $newEmail = $params['email'];
            $emailParams['updateEmail'] = $params['email'];

            $this->email($emailParams);
        }
        
        $params = array_merge($params, [
            'employeeStatus' => self::STATUS_OFFLINE,
            'deleted' => self::IS_DELETE
        ]);
        return $this->service->apiRequest('post', 'edit_employee', $params);
    }

    /**
     * 员工数据参数检查
     * @param array $params
     * @throws \Exception
     * @return bool
     */
    private function _fieldCheck(array $params) : bool
    {

        return true;
    }

    /**
     * 在职状态:在职
     */
    const STATUS_ON = '1';
    /**
     * 在职状态:离职
     */
    const STATUS_OFFLINE = '3';

    /**
     * 是否删除:确认删除
     */
    const IS_DELETE = 2;
    /**
     * 在职状态描述映射关系
     * @var array
     */
    const MAP_STATUS = [
        self::STATUS_ON => '在职',
        self::STATUS_OFFLINE => '离职'
    ];

    /**
     * 法务实体映射关系
     * @var array
     */
    const MAP_ENTOTY = [
        '157' => '畅移(上海)信息科技有限公司',
        '158' => '西安畅展信息科技有限公司',
    ];

    /**
     * 工作地映射关系
     * @var array
     */
    const MAP_LOCATION = [
        '65' => '上海',
        '116' => '西安',
    ];

    /**
     * 员工类型映射关系
     * @var array
     */
    const MAP_TYPE = [
        '0' => '请选择',
        '1' => 'Full Time Employee',// 全职
        '2' => 'Intern',// 实习生
        '3' => 'Consultant',// 顾问
        '4' => 'Others on Payroll',// 编外
        '5' => 'Temp',// 临时工
        '6' => 'Part Time Employee',// 兼职
        '7' => '其他',
    ];

    /**
     * 职级映射关系
     * @var array
     */
    const MAP_GRADE_ID = [
        '179' => ['E2', 'Sr. Executive'],
        '181' => ['E1', 'Executive'],
        '183' => ['M4', 'GM/VP'],
        '187' => ['M3', 'Director'],
        '189' => ['IC6', 'Director'],
        '191' => ['M2', 'Sr. Manager'],
        '193' => ['IC5', 'Sr. Manager'],
        '195' => ['M1', 'Manager'],
        '197' => ['IC4', 'Manager'],
        '199' => ['IC3', 'Associate Manager'],
        '201' => ['IC2', 'Sr. Specialist'],
        '203' => ['IC1', 'Specialist'],
        '205' => ['S2', 'Coordinator'],
        '207' => ['S1', 'Assistant'],
        '209' => ['E1', 'COO'],
        '213' => ['IC7', 'GM/VP'],
        '315' => ['E1', 'CFO'],
        '316' => ['E3', 'Chairman'],
        '319' => ['M5', 'GM/VP']
    ];

    /**
     * 身份证件类型映射关系
     * @var array
     */
    const MP_CERTIFICATE_TYPE = [
        '0' => '请选择',
        '1' => '身份证',
        '2' => '护照',
        '3' => '台胞证',
        '4' => '身份证(香港)',
        '5' => '身份证(新加坡)',
        '6' => '港澳通行证',
    ];

    /**
     * 婚姻状态映射关系
     * @var array
     */
    const MP_MARITAL_STATUS = [
        '0' => '请选择',
        '1' => '未婚',
        '2' => '已婚',
    ];

    /**
     * 最高学历映射关系
     * @var array
     */
    const MAP_HIGHEST_EDUCATION = [
        '0' => ['请选择', ''],
        '95' => ['PhD', '博士'],
        '97' => ['Master', '硕士'],
        '99' => ['Bachelor', '本科'],
        '103' => ['Senior High', '高中'],
        '105' => ['Junior High', '初中'],
        '107' => ['Diploma', '大专'],
        '109' => ['Associate Degree', '大学肆业'],
        '111' => ['Advanced Diploma', '高级文凭'],
        '113' => ['Higher Diploma', '高级文凭'],
        '115' => ['Juris Doctor', '法学博士'],
        '117' => ['Certificate', '证书'],
        '119' => ['Secondary ', '中专'],
        '121' => ['F.5', 'F.5'],
    ];

    /**
     * 民族映射关系
     * @var array
     */
    const NATION = [
        '0' => '请选择',
        '1' => '汉族',
        '10' => '瑶族',
        '11' => '锡伯族',
        '12' => '苗族',
        '2' => '蒙古族',
        '3' => '土家族',
        '4' => '满族',
        '5' => '壮族',
        '6' => '仫佬族',
        '7' => '回族',
        '8' => '英国',
        '9' => '维吾尔族',
    ];

    /**
     * 国籍映射关系
     * @var array
     */
    const MAP_NATION_NALITY = [
        '0' => '请选择',
        '1' => '中国',
        '2' => '美国',
        '3' => '新加坡',
        '5' => '加拿大',
        '7' => '英国',
        '9' => '泰国',
        '11' => '日本',
        '13' => '韩国',
        '15' => '法国',
        '17' => '香港',
        '19' => '台湾',
        '21' => '澳大利亚',
        '23' => '菲律宾',
        '24' => '德国',
        '25' => '意大利',
        '26' => '马来西亚',
        '27' => '新西兰',
        '28' => '西班牙',
        '29' => '其他',
    ];

    /**
     * 角色映射关系
     * @var array
     */
    const MAP_JOB_ROLE = [
        '0' => '请选择',
        '10' => 'Engineering',
        '12' => 'Finance',
        '14' => 'Human Resources',
        '16' => 'Management',
        '17' => 'Marketing',
        '18' => 'Media',
        '19' => 'Optimization',
        '20' => 'Product Management',
        '21' => 'Project Management',
        '23' => 'Sales',
        '28' => 'Creative Design',
        '29' => 'Legal',
        '3' => 'Account Management',
        '30' => 'Product Marketing',
        '31' => 'Product Trainer',
        '32' => 'Sales Operations',
        '37' => 'Solution Planning',
        '4' => 'Accounting',
        '40' => 'Biz Planning & Operations',
        '41' => 'Solution Development',
        '43' => 'Product Operations',
        '44' => 'User Experience Design',
        '45' => 'Public Relations',
        '46' => 'Data Analysis',
        '47' => 'Kol Operations',
        '48' => 'Content Operations',
        '49' => 'Creative',
        '5' => 'Ad. Operations',
        '6' => 'Administration',
        '8' => 'Biz Development',
        '9' => 'Biz Intelligence',
    ];

    /**
     * 性别映射关系
     * @var array
     */
    const MAP_GENDER = [
        '0' => '未填写',
        '1' => '先生',
        '2' => '女士'
    ];
}