<?php

namespace app\api\controller;

use app\common\controller\Api;
use app\common\library\Sms;
use app\common\model\User as UserModel;
use app\common\model\UserAddress;
use app\common\model\UserSize;
use app\common\model\Area;
use app\common\controller\Wechat;
use think\Validate;

/**
 * 会员接口
 */
class User extends Api
{
    protected $noNeedLogin = ['index','login','measure'];
    protected $noNeedRight = '*';

    public function _initialize()
    {
        parent::_initialize();
        $this->model = model('app\common\model\User');
        $this->user = $this->auth->getUser();
    }

    /**
     * 我的-首页
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function index()
    {
        // 当前用户信息
        $user = $this->user;
        $coupon_count = \app\common\model\UserCoupon::alias('uc')
            ->join('coupon c','c.id = uc.coupon_id')
            ->where('uc.user_id',$this->user['id'])
            ->where('uc.status','1')
            ->where('c.expiretime','>',time())
            ->count();
        return $this->success('成功',compact('user','coupon_count'));
    }

    /**
     * 我的-授权登录
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="code", type="string", required=true, description="重定向code")
     * @ApiParams   (name="user_info", type="object", required=true, description="用户信息", sample="{'user_id':'int','user_name':'string','profile':{'email':'string','age':'integer'}}")
     * @ApiParams   (name="testopenid", type="string", description="测试openid")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function login()
    {
        $code = $this->request->post('code');
        $user_info = $this->request->post('user_info');
        $testopenid = $this->request->post('testopenid');
        $session = Wechat::miniProgram()->auth->session($code);
        // 自动注册用户
        $userInfo = json_decode(htmlspecialchars_decode($user_info), true);
        if (!$user = $this->model->get(['openid' => $session['openid']])) {
            $user = $this->model;
            $userInfo['openid'] = $session['openid'];
        }
        $userInfo['nickname'] = preg_replace('/[\xf0-\xf7].{3}/', '', $userInfo['nickName']);
        $userInfo['avatar'] = $userInfo['avatarUrl'];
        if (!$user->allowField(true)->save($userInfo)) {
            $this->error('用户登录失败');
        }
        // $session = [
        //     'openid' => $testopenid ?: 'test',
        // ];
        // $user = $this->model->get(['openid' => $session['openid']]);
        // 生成token (session3rd)
        $guid = guidv4();// 生成一个不会重复的随机字符串
        $timeStamp = microtime(true);// 当前时间戳 (精确到毫秒)
        $salt = 'token_salt';// 自定义一个盐
        $token = md5("{$timeStamp}_{$session['openid']}_{$guid}_{$salt}");
        $this->auth->direct($user['id'],$token);
        $this->success(__('登录成功'),[
            'token' => $token,
            'avatar' => $user['avatar']
        ]);
    }

    /**
     * 我的-成为会员(会员介绍)
     * @ApiMethod   (GET)
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function memberIntro()
    {
        $member_intro = str_replace('src="/uploads/', 'src="'.cdnurl('/uploads/',true), config('site.member_intro'));
        $this->success(__('成功'),compact('member_intro'));
    }

    /**
     * 我的-成为会员(绑定手机号)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="mobile", type="string", required=true, description="手机号")
     * @ApiParams   (name="captcha", type="string", required=true, description="验证码")
     * @ApiParams   (name="area", type="string", required=true, description="所在地区", sample="广东省,广州市,海珠区")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function bindMobile()
    {
        $mobile = $this->request->post('mobile');
        $captcha = $this->request->post('captcha');
        $area = $this->request->post('area');
        if (!empty($this->user['mobile'])) {
            $this->error(__('您已经成为会员,请勿重复操作'));
        }
        if (!$mobile || !$captcha || !$area) {
            $this->error(__('Invalid parameters'));
        }
        if (!Validate::regex($mobile, "^1\d{10}$")) {
            $this->error(__('Mobile is incorrect'));
        }
        if ($this->model->where('mobile', $mobile)->where('id', '<>', $this->user['id'])->find()) {
            $this->error(__('Mobile already exists'));
        }
        // $result = Sms::check($mobile, $captcha, 'changemobile');
        $result = \app\api\controller\Sms::check($mobile, $captcha, 'changemobile');
        if (!$result) {
            $this->error(__('Captcha is incorrect'));
        }
        $area = explode(',', $area);
        $province_id = Area::getIdByName($area[0], 1);
        $city_id = Area::getIdByName($area[1], 2, $province_id);
        $district_id = Area::getIdByName($area[2], 3, $city_id);
        $this->user->allowField(true)->save(compact('mobile','province_id', 'city_id', 'district_id'));

        Sms::flush($mobile, 'changemobile');
        $this->success(__('注册成功'));
    }

    /**
     * 我的-积分记录
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="rows", type="integer", required=true, description="每页条数")
     * @ApiParams   (name="page", type="integer", required=true, description="页码")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function scoreLog(){
        $rows = $this->request->get('rows',null);// 每页条数
        $page = $this->request->get('page',1);// 页码
        $list = $this->model->scoreLog($this->user['id'],$page,$rows);
        $this->success(__('成功'),array_merge([
            'score' => $this->user['score']
        ],$list));
    }

    /**
     * 我的-优惠券
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="status", type="string", required=true, description="优惠券状态:all=全部,normal=正常,soon_expire=即将到期,expired=已到期,used=已使用")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", sample="0", sample="返回成功", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function couponList(){
        $status = $this->request->get('status');
        $list = \app\common\model\UserCoupon::couponList($this->user, $status);
        $this->success(__('成功'),compact('list'));
    }

    /**
     * 我的地址-列表
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function addressList()
    {
        $list = UserAddress::addressList($this->user['id']);
        $this->success(__('成功'),compact('list'));
    }

    /**
     * @ApiTitle    (我的地址-添加)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="name", type="string", required=true, description="收货人")
     * @ApiParams   (name="phone", type="string", required=true, description="手机号码")
     * @ApiParams   (name="area", type="string", required=true, description="所在地区", sample="广东省,广州市,海珠区")
     * @ApiParams   (name="detail", type="string", description="详细地址")
     * @ApiParams   (name="isdefault", type="string", description="是否默认:0=否,1=是")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function addressAdd()
    {
        $post = $this->request->post();
        empty($post['name']) && $this->error(__('请填写收货人'));
        empty($post['phone']) && $this->error(__('请填写手机号码'));
        empty($post['area']) && $this->error(__('请选择所在地区'));
        empty($post['detail']) && $this->error(__('请填写详细地址'));
        if ((new UserAddress)->add($this->user, $post)) {
            $this->success(__('添加成功'));
        }
        $this->error(__('添加失败'));
    }

    /**
     * 我的地址-详情
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="user_address_id", type="integer", required=true, description="地址ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function addressDetail()
    {
        $user_address_id = $this->request->get('user_address_id');
        $detail = UserAddress::detail($this->user['id'],$user_address_id);
        $this->success(__('成功'),compact('detail'));
    }

    /**
     * 我的地址-编辑
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="user_address_id", type="integer", required=true, description="地址ID")
     * @ApiParams   (name="name", type="string", required=true, description="收货人")
     * @ApiParams   (name="phone", type="string", required=true, description="手机号码")
     * @ApiParams   (name="area", type="object", required=true, description="所在地区", sample="{'user_id':'int','user_name':'string','profile':{'email':'string','age':'integer'}}")
     * @ApiParams   (name="detail", type="string", description="详细地址")
     * @ApiParams   (name="isdefault", type="string", description="是否默认:0=否,1=是")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function addressEdit()
    {
        $post = $this->request->post();
        $model = UserAddress::detail($this->user['id'], $post['user_address_id']);
        if(empty($model)){
            $this->error(__('地址不存在'));
        }
        empty($post['name']) && $this->error(__('请填写收货人'));
        empty($post['phone']) && $this->error(__('请填写手机号码'));
        empty($post['area']) && $this->error(__('请选择所在地区'));
        empty($post['detail']) && $this->error(__('请填写详细地址'));
        if ($model->edit($post)) {
            $this->success(__('更新成功'));
        }
        $this->error(__('更新失败'));
    }

    /**
     * 我的地址-删除
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="user_address_id", type="integer", required=true, description="地址ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function addressDelete()
    {
        $user_address_id = $this->request->get('user_address_id');
        $model = UserAddress::detail($this->user['id'], $user_address_id);
        if ($model->remove($this->user)) {
            $this->success(__('删除成功'));
        }
        $this->error(__('删除失败'));
    }

    /**
     * 我的地址-设为默认
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="user_address_id", type="integer", required=true, description="尺寸ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function addressDefault()
    {
        $user_address_id = $this->request->get('user_address_id');
        $model = UserAddress::detail($this->user['id'], $user_address_id);
        if ($model->setDefault()) {
            $this->success(__('设置成功'));
        }
        $this->error(__('设置失败'));
    }

    /**
     * 我的尺寸-列表
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function sizeList()
    {
        $list = UserSize::sizeList($this->user['id']);
        $this->success(__('成功'),compact('list'));
    }

    /**
     * 我的尺寸-身体信息
     * @ApiMethod   (GET)
     * @ApiParams   (name="gender", type="string", required=true, description="性别:1=男,2=女")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function bodyInfo()
    {
        $gender = $this->request->get('gender','1');
        $list = \app\common\model\Style::styleList($gender);
        $this->success(__('成功'),compact('list'));
    }

    /**
     * 我的尺寸-身材特征
     * @ApiMethod   (GET)
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function bodyFeatures()
    {
        $list = \app\common\model\Style::styleList(3);
        $this->success(__('成功'),compact('list'));
    }

    /**
     * 我的尺寸-全身照或半身照
     * @ApiMethod   (GET)
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function bodyImage()
    {
        $list = \app\common\model\Style::styleList(4);
        $this->success(__('成功'),compact('list'));
    }

    /**
     * @ApiTitle    (我的尺寸-添加)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="name", type="string", required=true, description="尺寸名称")
     * @ApiParams   (name="height", type="integer", required=true, description="身高(厘米)")
     * @ApiParams   (name="weight", type="integer", required=true, description="体重(公斤)")
     * @ApiParams   (name="collar", type="integer", description="领围(厘米)")
     * @ApiParams   (name="hipline", type="integer", description="臀围(厘米)")
     * @ApiParams   (name="arm_length", type="integer", description="臂长(厘米)")
     * @ApiParams   (name="bust", type="integer", description="胸围(厘米)")
     * @ApiParams   (name="shoulder_width", type="integer", description="肩宽(厘米)")
     * @ApiParams   (name="gender", type="string", required=true, description="性别:1=男,2=女")
     * @ApiParams   (name="body_info", type="object", required=true, description="身体信息")
     * @ApiParams   (name="body_features", type="string", description="身体特征,多个值用英文逗号分隔")
     * @ApiParams   (name="remark", type="string", description="备注")
     * @ApiParams   (name="body_images", type="file", description="身材照片,多文件")
     * @ApiParams   (name="isdefault", type="string", description="是否默认:0=否,1=是")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function sizeAdd()
    {
        $post = $this->request->post();
        empty($post['name']) && $this->error(__('请填写尺寸名称'));
        empty($post['height']) && $this->error(__('请填写身高'));
        empty($post['weight']) && $this->error(__('请填写体重'));
        empty($post['gender']) && $this->error(__('请选择性别'));
        empty($post['body_info']) && $this->error(__('请选择身体信息'));
        if ((new UserSize)->add($this->user, $post)) {
            $this->success(__('添加成功'));
        }
        $this->error(__('添加失败'));
    }

    /**
     * 我的尺寸-详情
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="user_size_id", type="integer", required=true, description="尺寸ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function sizeDetail()
    {
        $user_size_id = $this->request->get('user_size_id');
        $detail = UserSize::detail($this->user['id'],$user_size_id);
        $this->success(__('成功'),compact('detail'));
    }

    /**
     * 我的尺寸-编辑
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="user_size_id", type="integer", required=true, description="尺寸ID")
     * @ApiParams   (name="name", type="string", required=true, description="尺寸名称")
     * @ApiParams   (name="height", type="integer", required=true, description="身高(厘米)")
     * @ApiParams   (name="weight", type="integer", required=true, description="体重(公斤)")
     * @ApiParams   (name="collar", type="integer", description="领围(厘米)")
     * @ApiParams   (name="hipline", type="integer", description="臀围(厘米)")
     * @ApiParams   (name="arm_length", type="integer", description="臂长(厘米)")
     * @ApiParams   (name="bust", type="integer", description="胸围(厘米)")
     * @ApiParams   (name="shoulder_width", type="integer", description="肩宽(厘米)")
     * @ApiParams   (name="gender", type="string", required=true, description="性别:1=男,2=女")
     * @ApiParams   (name="body_info", type="object", required=true, description="身体信息")
     * @ApiParams   (name="body_features", type="string", description="身体特征,多个值用英文逗号分隔")
     * @ApiParams   (name="remark", type="string", description="备注")
     * @ApiParams   (name="body_images", type="file", description="身材照片,多文件")
     * @ApiParams   (name="isdefault", type="string", description="是否默认:0=否,1=是")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function sizeEdit()
    {
        $post = $this->request->post();
        $this->success(json_encode($post));
        $model = UserSize::detail($this->user['id'], $post['user_size_id']);
        if(empty($model)){
            $this->error(__('尺寸信息不存在'));
        }
        empty($post['name']) && $this->error(__('请填写尺寸名称'));
        empty($post['height']) && $this->error(__('请填写身高'));
        empty($post['weight']) && $this->error(__('请填写体重'));
        empty($post['gender']) && $this->error(__('请选择性别'));
        empty($post['body_info']) && $this->error(__('请选择身体信息'));
        if ($model->edit($post)) {
            $this->success(__('更新成功'));
        }
        $this->error(__('更新失败'));
    }

    /**
     * 我的尺寸-删除
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="user_size_id", type="integer", required=true, description="尺寸ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function sizeDelete()
    {
        $user_size_id = $this->request->get('user_size_id');
        $model = UserSize::detail($this->user['id'], $user_size_id);
        if ($model->remove($this->user)) {
            $this->success(__('删除成功'));
        }
        $this->error(__('删除失败'));
    }

    /**
     * 我的尺寸-设为默认
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="user_size_id", type="integer", required=true, description="尺寸ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function sizeDefault()
    {
        $user_size_id = $this->request->get('user_size_id');
        $model = UserSize::detail($this->user['id'], $user_size_id);
        if ($model->setDefault()) {
            $this->success(__('设置成功'));
        }
        $this->error(__('设置失败'));
    }

    /**
     * 我的尺寸-量体教程
     * @ApiMethod   (GET)
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function measure()
    {
        $measure = str_replace('src="/uploads/', 'src="'.cdnurl('/uploads/',true), config('site.measure'));
        $this->success(__('成功'),compact('measure'));
    }
}