<?php

namespace app\api\controller\company;

use app\common\controller\Apic;
use app\common\library\Sms;
use fast\Random;
use GuzzleHttp\Client;
use think\Config;
use think\Exception;
use think\Validate;

use think\Db;

/**
 * 会员接口
 */
class User extends Apic
{
    protected $noNeedLogin = ['accountlogin','resetpwd','getUserOpenid'];
    protected $noNeedRight = '*';


    //员工手机+密码登录
    public function accountlogin(){
        $mobile   = $this->request->post('mobile');
        $password = $this->request->post('password');
        $openid = $this->request->post('openid','');
        if (!$mobile || !$password || !$openid) {
            $this->error(__('Invalid parameters'));
        }
        $ret = $this->auth->login($mobile, $password, $openid);
        if ($ret) {
            $data = $this->auth->getUserinfo();
            $this->success(__('Logged in successful'), $data);
        } else {
            $this->error($this->auth->getError());
        }
    }


    /**
     * 退出登录
     * @ApiMethod (POST)
     */
    public function logout()
    {
        if (!$this->request->isPost()) {
            $this->error(__('Invalid parameters'));
        }
        $this->auth->logout();
        $this->success(__('Logout successful'));
    }


    //用户详细资料
    public function getUserinfo($type = 1){
        $info = $this->auth->getUserinfo();
        if($type == 'return'){
            return $info;
        }
        $this->success(__('success'),$info);
    }

    /**
     * 重置密码
     *
     * @ApiMethod (POST)
     * @param string $mobile      手机号
     * @param string $captcha     验证码
     * @param string $newpassword 新密码
     */
    public function resetpwd()
    {
        $mobile      = $this->request->post('mobile');
        $captcha     = $this->request->post('captcha');
        $newpassword = $this->request->post("newpassword");
        if (!$mobile || !$captcha || !$newpassword) {
            $this->error(__('Invalid parameters'));
        }
        //验证Token
        if (!Validate::make()->check(['newpassword' => $newpassword], ['newpassword' => 'require|regex:\S{6,30}'])) {
            $this->error(__('Password must be 6 to 30 characters'));
        }
        if (!Validate::regex($mobile, "^1\d{10}$")) {
            $this->error(__('Mobile is incorrect'));
        }
        $user = \app\common\model\CompanyStaff::getByMobile($mobile);
        if (!$user) {
            $this->error(__('User not found'));
        }
        $ret = Sms::check($mobile, $captcha, 'resetpwd');
        if (!$ret) {
            $this->error(__('Captcha is incorrect'));
        }
        Sms::flush($mobile, 'resetpwd');

        //模拟一次登录
        $this->auth->direct($user->id);
        $ret = $this->auth->resetpwd($newpassword, '', true);
        if ($ret) {
            $this->success(__('Reset password successful'));
        } else {
            $this->error($this->auth->getError());
        }
    }


    /**
     * 修改会员个人信息
     *
     * @ApiMethod (POST)
     * @param string $avatar   头像地址
     * @param string $username 用户名
     * @param string $nickname 昵称
     * @param string $bio      个人简介
     */
    public function profile()
    {
        //验证
        if($this->auth->type != 1){
            $this->error('只有门店老板才能设置');
        }
        $field = [
            'mobile',
            'image',
            'is_open',
            'open_hours',
        ];

        $data = request_post_hub($field);
        $data['updatetime'] = time();

        $update_rs = Db::name('company')->where('id',$this->auth->company_id)->update($data);

        $this->success('资料更新完成');
    }

    /**
     * 设置店铺地址
     */
    public function setaddress()
    {
        //验证
        if($this->auth->type != 1){
            $this->error('只有门店老板才能设置');
        }
        $field = [
            'province_name',
            'city_name',
            'area_name',
            'province_id',
            'city_id',
            'area_id',
            'address',
        ];

        $data = request_post_hub($field);

        $data['full_address'] = $data['province_name'].$data['city_name'].$data['area_name'].$data['address'];
        $data['updatetime'] = time();

        $update_rs = Db::name('company')->where('id',$this->auth->company_id)->update($data);

        $this->success('资料更新完成');
    }

    /**
     * 小程序码
     * @return void
     */
    public function getMiniCode()
    {
        try {
            $companyId = $this->auth->company_id;
            $companyWhere['id'] = $companyId;
            $companyWhere['status'] = 1;
            $company = Db::name('company')->where($companyWhere)->find();
            if (empty($company)) {
                throw new Exception('未找到门店信息');
            }
            $httpStr = $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'];
            if (empty($company['mini_code'])) {
                $client = new Client();
                $tk = getAccessToken();
                $miniCodeConfig = config('param.mini_code');
                $miniCodeConfig['scene'] = 'shopId='.$companyId;
                $res2 = $client->request('POST', 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='.$tk, [
                    'json' => $miniCodeConfig,
                ]);
                $fileName = md5($companyId);
                $fileUrl = '/uploads/company/'.$fileName.'.png';
                $code = $res2->getBody()->getContents();
                file_put_contents(ROOT_PATH.'/public'.$fileUrl,$code);
                $companyData['mini_code'] = $fileUrl;
                $companyRes = Db::name('company')->where($companyWhere)->update($companyData);
                if (!$companyRes) {
                    throw new Exception('更新门店信息失败');
                }
                $miniCode = $httpStr.$fileUrl;
            } else {
                $miniCode = $httpStr.$company['mini_code'];
            }
            $result = [
                'mini_code' => $miniCode,
                'company_name' => $this->auth->company->name,
                'company_image' => one_domain_image($this->auth->company->image),
            ];
            $this->success('获取成功',$result);
        } catch (Exception $e) {
            $this->error($e->getMessage());
        }
    }

    /**
     * 获取用户openid
     */
    public function getUserOpenid() {
        // code值
        $code = $this->request->param('code');
        if (!$code) {
            $this->error(__('Invalid parameters'));
        }

        $config = config('company_wxMiniProgram');
        $getopenid = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$config['appid'].'&secret='.$config['secret'].'&js_code='.$code.'&grant_type=authorization_code';
        $openidInfo = $this->getJson($getopenid);
        if(!isset($openidInfo['openid'])) {
            $this->error('用户openid获取失败',$openidInfo);
        }
        //  获取的结果存入数据库
        /*$find = Db::name('company_sessionkey')->where(['openid'=>$openidInfo['openid']])->find();
        if($find) {
            $update = [];
            $update['sessionkey'] = $openidInfo['session_key'];
            $update['createtime'] = time();
            $res = Db::name('company_sessionkey')->where(['openid'=>$openidInfo['openid']])->update($update);
        } else {
            $insert = [];
            $insert['sessionkey'] = $openidInfo['session_key'];
            $insert['openid'] = $openidInfo['openid'];
            $insert['unionid'] = isset($openidInfo['unionid']) ? $openidInfo['unionid'] : '';
            $insert['createtime'] = time();
            $res = Db::name('company_sessionkey')->insertGetId($insert);
        }*/

        if(!empty($openidInfo)) {
            $this->success('获取成功',$openidInfo);
        } else {
            $this->error('获取失败');
        }

    }

    /**
     * json 请求
     * @param $url
     * @return mixed
     */
    private function getJson($url){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        curl_close($ch);
        return json_decode($output, true);
    }
}
