<?php
namespace App\Http\Controllers\Mobile\Active;

use Aix\Sms\Contracts\Smser;
use App\Http\Controllers\Mobile\MobileBaseController;
use App\Models\Resume;
use App\Repositories\MemberRepository;
use App\Services\Auth\AuthService;
use App\Services\Auth\RegisterService;
use App\Services\Common\CategoryService;
use App\Services\Person\ResumeEducationService;
use App\Services\Person\MemberInfoService;
use App\Services\Person\ResumeService;
use App\Validators\PersonValidatorRequest;
use App\Validators\RegisterValidatorRequest;
use Illuminate\Http\Request;
use App\Services\Common\SmsService;
use App\Services\Person\ResumeWorkService;
use App\Services\Content\PolicyService;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Cache;


class RcgController extends MobileBaseController
{
    protected $categoryService;
    private $smsService;
    private $registerService;
    private $authService;
    protected $memberRepository;
    protected $memberInfoService;
    protected $educationService;
    protected $resumeWorkService;
    protected $articleCategoryService;
    protected $httpClient;

    public function __construct(ResumeWorkService $resumeWorkService,ResumeEducationService $educationService,ResumeService $resumeService,AuthService $authService,CategoryService $categoryService,SmsService $smsService,RegisterService $registerService,MemberRepository $memberRepository,MemberInfoService $memberInfoService,PolicyService $articleCategoryService)
    {
        $this->categoryService = $categoryService;
        $this->smsService = $smsService;
        $this->registerService = $registerService;
        $this->authService = $authService;
        $this->memberRepository = $memberRepository;
        $this->memberInfoService = $memberInfoService;
        $this->resumeService = $resumeService;
        $this->educationService = $educationService;
        $this->resumeWorkService = $resumeWorkService;
        $this->articleCategoryService = $articleCategoryService;
        $this->httpClient=new Client([
            'http_errors' => false
        ]);

    }

    /**
     * 人才港首页
     * @return array|\Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function index()
    {
        return view('mobile.app.active.index');
    }

    public function addInfo()
    {

        $user = auth('web-member')->user();
        if(!$user){
            $is_login = 0;
        }else{
            $is_login = 1;
        }
        $district = $this->categoryService->getDefaultDistrict();
        return view('mobile.app.active.resume_add', [
            'is_login'=>$is_login,
            'user'=>$user,
            'defaultCity'=>$district->defaultCity,
            'disCity'=>$district->disCity,
            'disHan'=>$district->disHan,
            'wap_title'=>'信息登记'
        ]);
    }

    public function rcgCreate(PersonValidatorRequest $request)
    {
        //添加基础信息
        $resume_res = $this->resumeService->activeResumeCreate($request->except(['add_tag','_token']), auth('web-member')->user());
        if($resume_res['code'] == 1){
            $data = request()->all();
            $data['resume_id'] = $resume_res['info'];
            $data['id'] = $resume_res['info'];
            //添加教育信息
            $resume_edu = $this->educationService->activeResumeEducationAdd($data, auth('web-member')->user());
            //添加工作信息
            $resume_work = $this->resumeWorkService->activeResumeWorkAdd($data, auth('web-member')->user());
            //添加标签
            $resume_tag = $this->resumeService->tagSave($data);
            //添加自我描述
            $resume_specialty = $this->resumeService->updateSpecialty($data, auth('web-member')->user());
            if ($resume_res['code']==1) {
                $this->authService->logout();
                return $this->sendSuccessResponse(['id'=>$resume_res['info'],'tag'=>$request->add_tag]);
            } else {
                return $this->sendErrorResponse('更新简历失败', '', 400);
            }
        }else{
            return $this->sendErrorResponse($resume_res['info'], '', 400);
        }

    }

    public function upload()
    {
        $res = $this->memberInfoService->updateHead(request()->pic1, auth('web-member')->user());
        return response()->json($res);
    }

    public function quickReg(RegisterValidatorRequest $registerValidatorRequest)
    {
        if (!$this->smsService->checkAuthSms($registerValidatorRequest->mobile, Smser::TEMPLATE_AUTH_REGISTER, $registerValidatorRequest->mobile_vcode)) {
            return $this->sendErrorResponse("短信验证码不通过,请重新输入");
        }
        $data = $registerValidatorRequest->all();
        $member = $this->memberRepository->getMemberByAccount($data['mobile']);
        if(!$member){
            $member = $this->registerService->registerPerson($data);
        }else{
            $this->authService->login($member);
        }
        return $this->sendSuccessResponse(['msg'=>'注册/登录成功,请继续操作','reg_status'=>1]);

    }

    public function rcg()
    {
        return view('mobile.app.active.rcg');
    }

    public function serviceCode()
    {
        return view('mobile.app.active.service_code');
    }

    private function getPolicyCategory($pid){
        $list = DB::table('policy_category')->where(array('parent_id'=>$pid,'deleted_at'=>null))->orderBy('category_order','desc')->orderBy('id','asc')->select("*")->get()->toArray();
        if($list){
            foreach ($list as $k => $v){
                $subList = DB::table('policy_category')->where(array('parent_id'=>$v->id,'deleted_at'=>null))->orderBy('category_order','desc')->orderBy('id','asc')->select("*")->get()->toArray();
                if($subList){
                    $list[$k]->children = $subList;
                    $this->getPolicyCategory($v->id);
                }
            }
        }
        return $list;

    }

    public function chain(){
        $list = $this->getPolicyCategory(30);

        $res = [
            'status' => 'ok',
            'info'  => '获取成功',
            'data'  =>  $list
        ];

        echo json_encode($res);
    }

    public function getChainList(Request $request){
        $id = $request->input('id');
        $keyword = $request->input('keyword');
        $page = $request->input('page');
        $where = [
            ['type_id', '=', intval($id)]
        ];

        if(!empty($keyword)){
            $map = ['title','like','%'.$keyword.'%'];
            array_push($where,$map);
        }

        $count = DB::table('policy')->where($where)->count();
        $list = DB::table('policy')->where($where)->offset(($page-1)*20)->limit($page*20)->select("*")->get()->toArray();

        $res['status'] = 'ok';
        $res['msg'] = '查询成功';
        $res['data'] = $list;
        $res['count'] = $count;

        echo json_encode($res);
    }

    public function getPolicyContent(Request $request){
        $id = $request->input('id');
        if(intval($id)){
            $info = DB::table('policy')->where(array('id'=>intval($id)))->select("*")->first();

            if($info){
                $res['status'] = 'ok';
                $res['msg'] = '查询成功';
                $res['data'] = [
                    'title' =>  $info->title,
                    'content' => $info->content,
                    'pid' => $info->type_id
                ];
            }else{
                $res['status'] = 'error';
                $res['msg'] = '找不到该文章';
            }
        }else{
            $res['status'] = 'error';
            $res['msg'] = '缺少参数';
        }
        echo json_encode($res);
    }

    public function putAppointment(Request $request)
    {
        $res['status'] = '';
        $res['msg'] = '';
        $data['card'] = $request->input('card');
        if(!$data['card']){
            $res['status'] = 'error';
            $res['msg'] = '身份证不能为空';
            echo json_encode($res);die;
        }
        if (strlen($data['card']) == 18 && !$this->isValid($data['card'])) {
            $res['status'] = 'error';
            $res['msg'] = '身份证格式不正确';
            echo json_encode($res);die;
        }
        $data['username'] = $request->input('username');
        if(!$data['username']){
            $res['status'] = 'error';
            $res['msg'] = '真实姓名不能为空';
            echo json_encode($res);die;
        }
        $data['phone'] = $request->input('phone');
        if(!$data['phone']){
            $res['status'] = 'error';
            $res['msg'] = '手机号码不能为空';
            echo json_encode($res);die;
        }
        $data['service'] = $request->input('picker');
        if(!$data['service']){
            $res['status'] = 'error';
            $res['msg'] = '服务事项不能为空';
            echo json_encode($res);die;
        }
        $data['value'] = $request->input('value');
        if(!$data['value']){
            $res['status'] = 'error';
            $res['msg'] = '服务事项不能为空';
            echo json_encode($res);die;
        }

        $info = DB::table('talent')->where('card',$data['card'])->first();

        if(!$info){
            $ch = curl_init ();
            curl_setopt( $ch, CURLOPT_URL, "http://rc.jucai.gov.cn/api/dataInterface/findTalentArrangeByIdCard?idCard={$data['card']}" );
            curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
                    'Content-Type: application/json; charset=utf-8'   //json版本需要填写  Content-Type: application/json;
                )
            );
            curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); //若果报错 name lookup timed out 报错时添加这一行代码
            curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
            curl_setopt( $ch, CURLOPT_TIMEOUT,60);
            curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0);
            curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0);
            $result = curl_exec ( $ch );
            curl_close ( $ch );
            $ret = json_decode($result,true);
            if($ret['state'] == 1){
                $data['is_talent'] = 1;
                $data['status'] = 1;
            }else{
                $data['is_talent'] = 0;
            }
        }else{
            $data['is_talent'] = 1;
            $data['status'] = 1;
        }
        //增加全民健身季礼包领取
        if($data['value'] == 44){
            $libao = DB::table('lt_apppointment')->where('card',$data['card'])->where('value',44)->first();
            if($libao){
                $res['status'] = 'error';
                $res['msg'] = '您已领取过礼包,谢谢您的关注';
                echo json_encode($res);die;
            }
        }

        $data['createtime'] = date("Y-m-d H:i:s",time());
        $data['number'] = $this->findAvailableNo();
        $data['content'] = $request->input('content');
        DB::table('lt_apppointment')->insert($data);
        if($data['is_talent']){
            if(empty($data['content'])){
                $content = '无';
            }else{
                $content = $data['content'];
            }
            switch ($data['value']){
                case 1:
                    $phone = '13808510338';
                    break;
                case 2:
                    $phone = '13960958777';
                    break;
                case 3:
                    $phone = '15280619456';
                    break;
                case 4:
                    $phone = '15375751022';
                    break;
                case 5:
                    $phone = '15905901858';
                    break;
                case 6:
                    $phone = '15985930919';//行政审批
                    break;
                case 7:
                    $phone = '15159851117';
                    break;
                case 8:
                    $phone = '';
                    break;
                case 9:
                    $phone = '13850726589';
                    break;
                case 10:
                    $phone = '13655931116';
                    break;
                case 11:
                    $phone = '13805919791';
                    break;
                case 12:
                    $phone = '13305057271';
                    break;
                case 13:
                    $phone = '13599248586';
                    break;
                case 14:
                    $phone = '15859592524';
                    break;
                case 15:
                    $phone = '13459587022';
                    break;
                case 16:
                    $phone = '13799592878';
                    break;
                case 17:
                    $phone = '15159778791';
                    break;
                case 18:
                    $phone = '15905900577';
                    break;
                case 19:
                    $phone = '17850958856';
                    break;
                case 20:
                    //$phone = '13788807070';//丁琦娜  13788807070
                    $phone = [
                        '13788807070',
                        '13313837788',
                    ];
                    break;
                case 21:
                    $phone = '13505986964';
                    break;
                case 22:
                    $phone = '15060600938';
                    break;
                case 23:
                    $phone = '13305073366';
                    break;
                case 24:
                    $phone = '15880738158';
                    break;
                case 25:
                    $phone = '13860706099';
                    break;
                case 26:
                    $phone = '17379989114';
                    break;
                case 27:
                    $phone = [
                        '13788807070',
                        '13599716573'
                    ];
                    break;
                case 28:
                    $phone = [
                        '13788807070',
                        '13505023260'
                    ];
                    break;
                case 29:
                    $phone = '18850541454';
                    break;
                case 30:
                    $phone = '18900399886';
                    break;
                case 31:
                    $phone = '13489858833';
                    break;
                case 32:
                    $phone = '13960457968';
                    break;
                case 33:
                    $phone = '18759973633';
                    break;
                case 34:
                    $phone = '15396576970';
                    break;
                case 35:
                    $phone = '15959501620';
                    break;
                case 36:
                    $phone = '13799858905';
                    break;
                case 37:
                    $phone = '13559621092';
                    break;
                case 38:
                    $phone = '13799592878';
                    break;
                case 39:
                    $phone = '13600737303';
                    break;
                case 40:
                    $phone = '15060910357';//姜自元
                    break;
                case 41:
                    $phone = '13489719977';
                    break;
                case 42:
                    $phone = '17750597113';
                    break;
                case 43:
                    $phone = '15959953335';
                    break;
                case 44:
                    $phone = '';
                    break;
                default:
                    $phone = '18060002035';
                    break;
            }
            if(is_array($phone)){
                foreach ($phone as $v){
                    $this->smsService->sendSms($v,'sms_custom',array('username'=>$data['username'],'phone'=>$data['phone'],'content'=>$content));
                }
            }else{
                if(!empty($phone)){
                    $this->smsService->sendSms($phone,'sms_custom',array('username'=>$data['username'],'phone'=>$data['phone'],'content'=>$content));
                }
            }
            $res['status'] = 'ok';
            $res['msg'] = '预约登记成功';
            $this->smsService->sendSms($data['phone'],'sms_order_number',array('number'=>$data['number'],'service'=>$data['service']));
        }else{
            $res['status'] = 'ok';
            $res['msg'] = '服务咨询登记成功';
        }

        echo json_encode($res);die;
    }

    public function getAppointment(Request $request){
        $page = $request->input('page');
        $name = $request->input('name');
        $type = $request->input('type',99);
        $status = $request->input('status',99);
        $number = $request->input('number');
        $where = [];
        if(!empty($name)){
            $where[] = ['username','like',"%{$name}%"];
        }
        if(!empty($number)){
            $where[] = ['number','like',"%{$number}%"];
        }
        if($type != 99 ){
            $where[] = ['is_talent','=',$type];
        }
        if($status != 99){
            $where[] = ['status','=',$status];
        }else{
            $where[] = ['status','<','2'];
        }

        $count = DB::table('lt_apppointment')->where($where)->count();
        $list = DB::table('lt_apppointment')->where($where)->orderBy('id','desc')->orderBy('createtime','desc')->offset(($page-1)*20)->limit($page*20)->select("number","username",'phone','service','content','is_talent','status','evaluate')->get()->toArray();

        $res['status'] = 'ok';
        $res['msg'] = '查询成功';
        $res['list'] = $list;
        $res['total'] = $count;
        echo json_encode($res);die;
    }

    public function putEvaluate(Request $request){
        $number = $request->input('number');
        $message = $request->input('message');
        if(!$number || $number == '' || strlen($number) != 14){
            $res['status'] = 'error';
            $res['msg'] = '预约号不正确SR10-1';
            echo json_encode($res);die;
        }
        $info = DB::table('lt_apppointment')->where('number',$number)->first();
        if(!$info){
            $res['status'] = 'error';
            $res['msg'] = '预约号不存在SR10-2';
            echo json_encode($res);die;
        }
        if($info->evaluate){
            $res['status'] = 'error';
            $res['msg'] = '此服务预约已评价HA10-1';
            echo json_encode($res);die;
        }
        if(!$message || $message == ''){
            $res['status'] = 'error';
            $res['msg'] = '评价内容不能为空';
            echo json_encode($res);die;
        }
        DB::table('lt_apppointment')->where('number',$number)->update(['evaluate'=>$message]);

        $res['status'] = 'ok';
        $res['msg'] = '评价成功';
        echo json_encode($res);die;
    }

    public function putEvaluateMobile(Request $request)
    {
        $mobile = $request->input('mobile');
        $msg = $request->input('msg');
        if($mobile != '' && $msg != ''){
            $info = DB::table('lt_apppointment')->where('phone',$mobile)->orderBy('id','desc')->first();
            if($info){
                switch ($msg){
                    case '1':
                        $evaluate = "非常满意";
                        break;
                    case '2':
                        $evaluate = "基本满意";
                        break;
                    case '3':
                        $evaluate = "不满意";
                        break;
                    default:
                        $evaluate = '短信回复有误,需要回访';
                        break;
                }
                DB::table('lt_apppointment')->where('id',$info->id)->update(['evaluate'=>$evaluate]);
            }
        }
        echo json_encode(['clcode'=>'000000']);
    }

    public function sendSms(){
//        $list = DB::table('lt_apppointment')->where('value',44)->where('is_talent',1)->get();
//        foreach ($list as $k => $v){
//            $this->smsService->sendSms($v->phone,'sms_order_number',array('number'=>$v->number,'service'=>$v->service));
//        }

    }

    protected function findAvailableNo()
    {
        $prefix = date('Ymd');
        // 随机生成 6 位的数字,并创建订单号
        $no = $prefix.random_int(10000, 99999).substr(microtime(true),-2);
        // 判断是否已经存在
        if (!DB::table('lt_apppointment')->where('number', $no)->exists()) {
            return $no;
        }else{
            $this->findAvailableNo();
        }
    }

    public function checkCard(Request $request){
        $card = $request->input('card');
        if(strlen($card) == 18 && !$this->isValid($card)){
            $res['status'] = 'error';
            $res['msg'] = '身份证格式不正确';
            exit(json_encode($res));
        }

        $info = DB::table('talent')->where('card',$card)->first();
        if(!$info){
            $ch = curl_init ();
            curl_setopt( $ch, CURLOPT_URL, "http://rc.jucai.gov.cn/api/dataInterface/findTalentArrangeByIdCard?idCard={$card}" );
            curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
                    'Content-Type: application/json; charset=utf-8'   //json版本需要填写  Content-Type: application/json;
                )
            );
            curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); //若果报错 name lookup timed out 报错时添加这一行代码
            curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
            curl_setopt( $ch, CURLOPT_TIMEOUT,60);
            curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0);
            curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0);
            $result = curl_exec ( $ch );
            curl_close ( $ch );
            $ret = json_decode($result,true);
            $res['status'] = 'ok';
            $res['msg'] = '获取成功';
            $res['data'] = $ret;
        }else{
            $res['status'] = 'ok';
            $res['msg'] = '获取成功';
            $res['data'] = [
                'msg'   =>  '已认定人才',
                'state' =>  1,
                'level' =>  $info->level
            ];
        }
        echo json_encode($res);
    }

    /**
     * 校验身份证号是否合法
     * @param string $num 待校验的身份证号
     * @return bool
     */
    protected function isValid(string $num)
    {
        //老身份证长度15位,新身份证长度18位
        $length = strlen($num);
        if ($length == 15) { //如果是15位身份证

            //15位身份证没有字母
            if (!is_numeric($num)) {
                return false;
            }
            // 省市县(6位)
            $areaNum = substr($num, 0, 6);
            // 出生年月(6位)
            $dateNum = substr($num, 6, 6);

        } else if ($length == 18) { //如果是18位身份证

            //基本格式校验
            if (!preg_match('/^\d{17}[0-9xX]$/', $num)) {
                return false;
            }
            // 省市县(6位)
            $areaNum = substr($num, 0, 6);
            // 出生年月日(8位)
            $dateNum = substr($num, 6, 8);

        } else { //假身份证
            return false;
        }

        //验证地区
        if (!$this->isAreaCodeValid($areaNum)) {
            return false;
        }

        //验证日期
        if (!$this->isDateValid($dateNum)) {
            return false;
        }

        //验证最后一位
        if (!$this->isVerifyCodeValid($num)) {
            return false;
        }

        return true;
    }

    /**
     * 省市自治区校验
     * @param string $area 省、直辖市代码
     * @return bool
     */
    private function isAreaCodeValid(string $area) {
        $provinceCode = substr($area, 0, 2);

        // 根据GB/T2260—999,省市代码11到65
        if (11 <= $provinceCode && $provinceCode <= 65) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 验证出生日期合法性
     * @param string $date 日期
     * @return bool
     */
    private function isDateValid(string $date) {
        if (strlen($date) == 6) { //15位身份证号没有年份,这里拼上年份
            $date = '19'.$date;
        }
        $year  = intval(substr($date, 0, 4));
        $month = intval(substr($date, 4, 2));
        $day   = intval(substr($date, 6, 2));

        //日期格式正确,但是逻辑存在问题(如:年份大于当前年)
        $currYear = date('Y');
        if ($year > $currYear) {
            return false;
        }
        return true;
    }

    /**
     * 验证18位身份证最后一位
     * @param string $num 待校验的身份证号
     * @return bool
     */
    private static function isVerifyCodeValid(string $num)
    {
        if (strlen($num) == 18) {
            $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
            $tokens = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

            $checkSum = 0;
            for ($i = 0; $i < 17; $i++) {
                $checkSum += intval($num{$i}) * $factor[$i];
            }

            $mod   = $checkSum % 11;
            $token = $tokens[$mod];

            $lastChar = strtoupper($num{17});

            if ($lastChar != $token) {
                return false;
            }
        }
        return true;
    }


}