<?php
namespace app\adminVue\controller;

use app\BaseController;
use think\facade\Db;
use think\facade\Cache;
use wx\wxMsg;

class HrUpdate extends TokenCheck
{   
    public function previewExamQuestions()
    {
        return $this->examQuestionResponse(function () {
            return \app\adminVue\service\ExamQuestionBank::preview(input('post.rows'));
        });
    }

    public function importExamQuestions()
    {
        return $this->examQuestionResponse(function () {
            $data = input('post.');
            $result = \app\adminVue\service\ExamQuestionBank::import($data['rows'] ?? null, $data['stamp'] ?? null, $data['overwrite'] ?? false);
            return $result;
        }, '试题上传成功');
    }

    public function updateExamQuestion()
    {
        return $this->examQuestionResponse(function () {
            $data = input('post.');
            \app\adminVue\service\ExamQuestionBank::change($data['id'] ?? 0, $data['version'] ?? null, $data);
        }, '试题修改成功');
    }

    public function deleteExamQuestion()
    {
        return $this->examQuestionResponse(function () {
            $data = input('post.');
            \app\adminVue\service\ExamQuestionBank::change($data['id'] ?? 0, $data['version'] ?? null);
        }, '试题删除成功');
    }

    private function examQuestionResponse($action, $message = null)
    {
        try {
            $result = ['code'=>0, 'data'=>$action()];
            if ($message !== null) $result['msg'] = $message;
            return json($result);
        } catch (\InvalidArgumentException $error) {
            // The shared frontend notification renders HTML; skill names originate in uploaded files.
            return json(['code'=>1, 'msg'=>htmlspecialchars($error->getMessage(), ENT_QUOTES, 'UTF-8')], 440);
        } catch (\Throwable $error) {
            \think\facade\Log::error((string)$error);
            return json(['code'=>1, 'msg'=>get_class($error) === \RuntimeException::class ? $error->getMessage() : '题库操作失败，请稍后重试或联系管理员'], 440);
        }
    }

    // 员工信息修改
    public function memberInfoUpdate(){
        $list = array_diff_key(input('post.'),['id'=>0,'eid'=>0]);
        Db::name('member_interview')->where('m_id',input('post.id'))->update($list);
        exit(json_encode(array('code'=>0,'msg'=>'修改成功！')));
    }
    //员工信息批量上传
    public function memberInfoUpload(){
        $data =  input('post.');
        $eids = array_column($data,'eid');
        if(count($eids)!==count(array_unique($eids))){
            $eid_intersect = array_diff($eids,array_unique($eids));
            http_response_code(441);
            exit(json_encode(array('code'=>1,'msg'=>'以下提报人员工号重复！','list'=>array_values($eid_intersect))));
        }
        $cost_center = Db::name('team_base')->where('mid',8)->column('id','content');
        $cost_diff = array_diff(array_unique(array_column($data,'cost_center')),array_keys($cost_center));
        if(count($cost_diff)>0){
            http_response_code(441);
            exit(json_encode(array('code'=>1 ,'msg'=>'以下成本中心不存在，请确认！','list'=>array_values($cost_diff))));
        }
        $eid_used = Db::name('member_list')->column('eid');
        $dif = array_intersect($eids,$eid_used);
        if(count($dif)>0){
            http_response_code(441);
            exit(json_encode(array('code'=>1,'msg'=>'提报人员工号已存在！','list'=>array_values($dif))));
        }
        foreach ($data as $k => $v) {
            if(in_array($v['sex'],['男','女'])){
                $data[$k]['sex'] = $v['sex']=='男'?1:0;
            }else{
                http_response_code(440);
                 exit(json_encode(array('code'=>1,'msg'=>$v['ename'].'性别错误！','list'=>'')));
            }
            $data[$k]['cost_center'] = $cost_center[$v['cost_center']];
            switch ($v['edu']) {
                case '小学':
                    $data[$k]['edu'] = 1;
                    break;
                case '初中':
                    $data[$k]['edu'] = 2;
                    break;
                case '高中':
                    $data[$k]['edu'] = 3;
                    break;
                case '大专':
                    $data[$k]['edu'] = 4;
                    break;
                case '本科':
                    $data[$k]['edu'] = 5;
                    break;
                default:
                    http_response_code(440);
                    exit(json_encode(array('code'=>1,'msg'=>$v['ename'].'学历填写错误！','list'=>'')));
            }
            switch ($v['source_type']) {
                case '小时工':
                    $data[$k]['source_type'] = 1;
                    break;
                case '社会工':
                    $data[$k]['source_type'] = 2;
                    break;
                case '学生工':
                    $data[$k]['source_type'] = 3;
                    break;
                default:
                    http_response_code(440);
                    exit(json_encode(array('code'=>1,'msg'=>$v['ename'].'类型填写错误！','list'=>'')));
            }
            $data[$k]['hiredate'] = is_numeric($v['hiredate'])?(($v['hiredate']-70*365-19)*86400-8*3600):strtotime($v['hiredate']);
            $b_y = substr($v['identity'],6,4);
            $b_m = substr($v['identity'],10,2);
            $b_d = substr($v['identity'],12,2);
            $bron = $b_y.'-'.$b_m.'-'.$b_d;
            if((strtotime('today') - strtotime($bron))<(365*18*86400+4*86400)){
                http_response_code(440);
                exit(json_encode(array('code'=>1,'msg'=>$v['ename'].'未满18岁！','list'=>'')));
            }
        }
        foreach ($data as $k => $v) {
            $new = array_intersect_key($v, ['id'=>0,'eid'=>0,'ename'=>0,'sex'=>0,'hiredate'=>0,'cost_center'=>0]);
            $detail = array_intersect_key($v, ['sex'=>0,'edu'=>0,'phone'=>0,'supplier'=>0,'source_type'=>0,'identity'=>0,'address'=>0]);
            $detail['ename'] = $new['ename']; 
            $new['tid'] = 99;
            $new['hc_tid'] = 99;
            Db::name('member_list')->insert($new);
            $detail['m_id'] = $new['id'];
            Db::name('member_interview')->insert($detail);
        }
        exit(json_encode(array('code'=>0,'msg'=>'批量上传成功，共上传新员工'.count($data).'名!')));
    }
    // 新培训员工上传
    public function newComerUpload(){
        $data =  input('post.');
        $phone = Db::name('member_newcomer')->where('create_time','>',strtotime('yesterday'))->whereIn('phone',array_column($data,'phone'))->column('phone');
        if($phone){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'以下手机号最近两天已经上传过！<br>'.join("<br>",$phone))));
        }
        foreach ($data as $k => $v) {
            $v['create_time'] = time();
            $v['creator'] = session('admin')['id'];
            Db::name('member_newcomer')->insert($v);
        }
        exit(json_encode(array('code'=>0,'msg'=>'上传成功！')));
    }
    //新培训员工删除
    public function newComerDelete(){
        $data =  input('post.');
        Db::name('member_newcomer')->where('id',$data['id'])->delete();
        exit(json_encode(array('code'=>0,'msg'=>'删除成功！')));
    }
    // 新人考试记录删除
    public function newComerExamDelete(){
        $id = filter_var(input('post.id'), FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);
        if ($id === false) {
            http_response_code(440);
            exit(json_encode(['code'=>1, 'msg'=>'考试记录ID无效！']));
        }
        Db::name('member_newcomer_score')->where('id', $id)->delete();
        exit(json_encode(['code'=>0, 'msg'=>'删除成功！']));
    }
    // 员工离职状态修改
    public function setLeaveState(){
        $data = input('post.');
        if(session('admin')['dpt']!==6){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'仅限HR可以修改！')));
        }
        $info = Db::name('member_perleave')->where('id',$data['id'])->find();
        Db::name('member_perleave')->where('id',$data['id'])->update(['status'=>2,'leave_date'=>strtotime($data['leaveDate']),'submit_date'=>time()]);
        Db::name('member_list')->where('id',$info['mid'])->update(['status'=>2,'leavedate'=>strtotime($data['leaveDate'])]);
        exit(json_encode(array('code'=>0,'msg'=>'修改成功！')));
    }
    //
    
    public function newKpiAdd(){
        $data = input('post.');
        $data['create_time'] = time();
        $data['update'] = time();
        $data['kpi_date'] = strtotime($data['kpi_date']);
        $data['aid'] = session('admin')['id'];
        $eid = Db::name('member_list')->where('eid',$data['eid'])->find();
        if(!$eid){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'无此工号！')));
        }
        $id = Db::name('kpi_record')->insertGetId($data);
        //发送微信服务号消息
        $template = array(
            'touser'=>$data['eid'],  //用户userId
            'template_id'=>"3Huxw6Ptdx15igJrOWwJ2OhlRmqX15AKwDdI5cK-ZOE", //流程待办提醒模板id
            'data'=>array(
                'keyword1'=>array('value'=>$id,'color'=>'#FF0000'),     //流程编号
                'keyword2'=>array('value'=>'绩效考评确认','color'=>'#FF0000'),      //流程名称
                'keyword3'=>array('value'=>'绩效'.$data['score'].'分，超期将自动确认！','color'=>'#FF0000'),      //流程标题
                'keyword4'=>array('value'=>session('admin')['truename'],'color'=>'#FF0000'),      //申请人
                'keyword5'=>array('value'=>date('Y-m-d,H:i:s',time()),'color'=>'#FF0000'),      //申请时间
            )
        );
        $wx_model = new wxMsg();
        $res = $wx_model->send_msg_eid(json_encode($template));
        // print_r($res);
        //发送微信服务号消息结束
        exit(json_encode(array('code'=>0,'msg'=>'添加成功！')));
    }
    //绩效删除
    public function kpiDelete(){
        $data = input('post.');
        Db::name('kpi_record')->where('id',$data['id'])->delete();
        exit(json_encode(array('code'=>0,'msg'=>'删除成功！')));
    }
    //
    public function newKeyExamAdd(){
        $data = input('post.');
        $eids = array_values(array_filter(array_map('trim', explode("\n", str_replace("\r", '', (string)($data['eids'] ?? ''))))));
        try {
            $sessionActor=session('admin');$actor=$sessionActor?Db::name('admin_user')->where(['id'=>$sessionActor['id'],'status'=>1])->find():null;
            if(!$actor||((int)$actor['dpt']!==6&&(int)$actor['rightid']<99))throw new \RuntimeException('仅HR或系统管理员可安排培训考试');
            $count = (new \app\mobile\service\KeyTraining())->arrangeLegacyExams($eids, (int)($data['item_type'] ?? 0), (int)strtotime($data['exam_date'] ?? ''),(int)$actor['id']);
            exit(json_encode(['code'=>0,'msg'=>'添加成功，共'.$count.'人！']));
        } catch (\Throwable $error) {
            exit(json_encode(['code'=>1,'msg'=>$error instanceof \RuntimeException ? $error->getMessage() : '安排失败，请联系管理员']));
        }
    }
    // 技能考试安排删除
    public function newSkillScoreDelete()
    {
        $data = input('post.');
        if (empty($data['id'])) exit(json_encode(['code'=>1,'msg'=>'参数错误！']));
        $lock = \app\mobile\controller\OmsKeyPositionExam::tableLock();
        try {
            $row = Db::name('quality_newskill_score')->where('id', (int)$data['id'])->find();
            if (!$row) $response=['code'=>1,'msg'=>'记录不存在！'];
            elseif (!empty($row['training_job_id'])) $response=['code'=>2,'msg'=>'培训关联考试保留历史，不可删除；需补考请由HR单独安排！'];
            elseif (($row['answers'] !== null && $row['answers'] !== '') || $row['score'] > 0 || (int)$row['status'] === 2) $response=['code'=>2,'msg'=>'已保存考试成绩，无法删除！'];
            else { Db::name('quality_newskill_score')->where('id', $row['id'])->delete(); $response=['code'=>0,'msg'=>'删除成功！']; }
        } finally { $lock->exec('UNLOCK TABLES'); }
        exit(json_encode($response));
    }
    //
    public function tempNewLeaveUpdate(){
        $data = input('post.');
        $midInfo = Db::name('member_list')->where('eid',$data['eid'])->find();
        if($midInfo['status']==2){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'该员工已离职！')));
        }
        $leaveInfo = Db::name('member_perleave')->where('mid',$midInfo['id'])->where('status',1)->find();
        if($leaveInfo){
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'该员工已申请离职办理！')));
        }
        $midInfo = Db::name('member_list')->where('eid',$data['eid'])->find();
        if($midInfo){
            $res['mid'] = $midInfo['id'];
            $res['aid'] = Db::name('team_list')->where('id',$midInfo['tid'])->value('aid');
            $res['tid'] = $midInfo['tid'];
            $res['perleave_date'] = strtotime($data['leaveDate']);
            $res['reason'] = $data['reason'];
            $res['status'] = 2;
            $res['type'] = $data['type'];
            $res['update'] = time();
            $res['submit_date'] = time();
            $res['leave_date'] = $res['perleave_date'];
            Db::name('member_perleave')->insert($res);
            Db::name('member_list')->where('id',$midInfo['id'])->update(['status'=>2,'leavedate'=>strtotime($data['leaveDate'])]);
            exit(json_encode(array('code'=>0,'msg'=>'新增成功！')));
        }else{
            http_response_code(440);
            exit(json_encode(array('code'=>1,'msg'=>'无此工号！')));
        }   
    }
    //内网信息同步
    public function memberInfoAlign(){
        $data = input('post.');
        $type = $data['type'];
        $result = $data['result'];
        if($type==1){
            if(isset($result[0]['changed'])==false){
                http_response_code(440);
                exit(json_encode(['code'=>1,'msg'=>'上传文件异常，请确认！']));
            }
            $sys = Db::name('member_list')->column('eid','id');
            foreach ($result as $k => $v) {
                if(isset($sys[$v['id']])==false){
                    Db::name('member_list')->insert($v);
                }else{
                    Db::name('member_list')->save($v);
                }
            }
        }else{
            if(isset($result[0]['workday_id'])==false){
                http_response_code(440);
                exit(json_encode(['code'=>1,'msg'=>'上传文件异常，请确认！']));
                // return json(['code'=>1,'msg'=>'上传文件异常，请确认！']);
            }
            $sys = Db::name('member_interview')->column('m_id','id');
            foreach ($result as $k => $v) {
                if(isset($sys[$v['id']])==false){
                    Db::name('member_interview')->insert($v);
                }else{
                    Db::name('member_interview')->save($v);
                }
            }
        }
        return json(array('code'=>0,'msg'=>'同步成功！'));
    }
    // 考题设置更新（单元格编辑保存）
    public function updateExamSet()
    {
        $data = input('post.');
        $field = $data['field'] ?? '';
        $value = $data['value'] ?? '';
        $id    = $data['id'] ?? 0;
        if (!$id || $field === '') {
            exit(json_encode(array('code'=>1,'msg'=>'参数错误！')));
        }
        $allow = ['num1','num2','num3','score1','score2','score3','pass'];
        if (!in_array($field, $allow, true)) {
            exit(json_encode(array('code'=>1,'msg'=>'不允许修改的字段！')));
        }
        $value = in_array($field, ['score1','score2','score3'], true) ? (float)$value : (int)$value;
        if ($value < 0) {
            exit(json_encode(array('code'=>1,'msg'=>'数值不能为负数！')));
        }
        $info = Db::name('quality_exam_set')->where('id', $id)->find();
        if (!$info) {
            exit(json_encode(array('code'=>1,'msg'=>'记录不存在！')));
        }
        if (in_array($field, ['num1','num2','num3'], true)) {
            $exam_type = substr($field, -1);
            $num = Db::name('quality_ppi_exam')->where(array('item_type'=>$info['item_type'],'exam_type'=>$exam_type,'status'=>1))->count();
            if ($num < $value) {
                $label = ['1'=>'单选题','2'=>'多选题','3'=>'判断题'][$exam_type] ?? '';
                http_response_code(440);
                exit(json_encode(array('code'=>2,'msg'=>$label.'仅'.$num.'道，请勿设置超出此数量！')));
            }
        }
        $save = ['id'=>$id, $field=>$value];
        Db::name('quality_exam_set')->save($save);
        $info = Db::name('quality_exam_set')->where('id', $id)->find();
        $total = $info['num1']*$info['score1'] + $info['num2']*$info['score2'] + $info['num3']*$info['score3'];
        exit(json_encode(array('code'=>0,'msg'=>'试题设置修改成功！','total'=>$total)));
    }
}
