<?php

namespace app\api\controller\user;

use app\api\controller\BaseApiController;
use app\api\lists\user_sign\UserSignLists;
use app\api\lists\user_sign_log\UserSignLogLists;
use app\api\logic\user\UserLogic;
use app\api\service\UserTokenService;
use app\api\validate\UserValidate;
use app\common\enum\PayEnum;
use app\common\logic\PaymentLogic;
use app\common\model\store_extract\StoreExtract;
use app\common\model\user\User;
use app\common\model\user\UserAddress;
use app\common\model\user_ship\UserShip;
use app\common\model\user_sign\UserSign;
use support\Cache;
use think\Exception;
use think\facade\Db;

/**
 * 用户控制器
 * Class UserController
 * @package app\api\controller
 */
class UserController extends BaseApiController
{
    public $notNeedLogin = ['login_sms'];
    // #[
    //     ApiDoc\Title('获取小程序手机号'),
    //     ApiDoc\url('/api/user/user/getMobileByMnp'),
    //     ApiDoc\Method('POST'),
    //     ApiDoc\Param(name: "code", type: "string", require: true, desc: "换取手机的code"),
    //     ApiDoc\NotHeaders(),
    //     ApiDoc\Header(name: "token", type: "string", require: true, desc: "token"),
    //     ApiDoc\ResponseSuccess("data", type: "array"),
    // ]
    public function getMobileByMnp()
    {
        $params = (new UserValidate())->post()->goCheck('getMobileByMnp');
        $params['user_id'] = $this->userId;
        $result = UserLogic::getMobileByMnp($params);
        if ($result === false) {
            return $this->fail(UserLogic::getError());
        }
        if ($result && is_numeric($result)) {
            $data = UserLogic::info($result);
            $userInfo = UserTokenService::setToken($result, 1);
            $data['token'] = $userInfo['token'];
        } else {
            $data = UserLogic::info($this->userId);
        }

        return $this->success('绑定成功', $data, 1, 1);
    }


    // #[
    //     ApiDoc\Title('用户个人信息'),
    //     ApiDoc\url('/api/user/user/info'),
    //     ApiDoc\Method('POST'),
    //     ApiDoc\Param(),
    //     ApiDoc\NotHeaders(),
    //     ApiDoc\Header(name: "token", type: "string", require: true, desc: "token"),
    //     ApiDoc\ResponseSuccess("data", type: "array"),
    // ]
    public function info()
    {
        return $this->success('success', UserLogic::info($this->userId));
    }

    // #[
    //     ApiDoc\Title('充值金额'),
    //     ApiDoc\url('/api/user/user/rechange_amount'),
    //     ApiDoc\Method('Get'),
    //     ApiDoc\Param(),
    //     ApiDoc\NotHeaders(),
    //     ApiDoc\Header(name: "token", type: "string", require: true, desc: "token"),
    //     ApiDoc\ResponseSuccess("data", type: "array"),
    // ]
    public function rechange_amount()
    {
        $res = UserLogic::rechange_level();
        return $this->success('ok', $res);
    }

    // #[
    //     ApiDoc\Title('小程序充值'),
    //     ApiDoc\url('/api/user/user/recharge'),
    //     ApiDoc\Method('POST'),
    //     ApiDoc\Param(name: "price", type: "string", require: true, desc: "金额"),
    //     ApiDoc\NotHeaders(),
    //     ApiDoc\Header(name: "token", type: "string", require: true, desc: "token"),
    //     ApiDoc\ResponseSuccess("data", type: "array"),
    // ]
    public function recharge()
    {
        $params = (new UserValidate())->post()->goCheck('rechargeMoney');
        $params['uid'] =  $this->userId;
        $params['channel_type'] =  $this->userInfo['terminal'];
        $order  = UserLogic::recharge($params);
        $redirectUrl = $params['redirect'] ?? '/pages/payment/payment';
        $result = PaymentLogic::pay(PayEnum::WECHAT_PAY_MINI, 'recharge', $order, $this->userInfo['terminal'], $redirectUrl);
        if (PaymentLogic::hasError()) {
            return $this->fail(PaymentLogic::getError(), $params);
        }
        return $this->success('', $result);
    }

    // #[
    //     ApiDoc\Title('会员账户详情'),
    //     ApiDoc\url('/api/user/user/capital_flow'),
    //     ApiDoc\Method('POST'),
    //     ApiDoc\Param(name: "page_no", type: "int", require: true, desc: "默认1页数"),
    //     ApiDoc\Param(name: "page_size", type: "int", require: false, desc: "条数默认15"),
    //     ApiDoc\NotHeaders(),
    //     ApiDoc\Header(name: "token", type: "string", require: true, desc: "token"),
    //     ApiDoc\ResponseSuccess("data", type: "array"),
    // ]
    public function capital_flow()
    {
        $page_no = (int)$this->request->post('page_no', 1);
        $page_size = (int)$this->request->post('page_size', 15);
        $params['page_no'] =  $page_no;
        $params['page_size'] =  $page_size;
        if (empty($page_no) || empty($page_size)) {
            $params['page_no'] =  1;
            $params['page_size'] =  15;
        }
        $res = UserLogic::capital_list($this->userId, $params);

        $res['page_no'] = $params['page_no'];
        $res['page_size'] = $params['page_size'];
        return $this->success('ok', $res);
    }

    // #[
    //     ApiDoc\Title('会员账户统计'),
    //     ApiDoc\url('/api/user/user/capital_count'),
    //     ApiDoc\Method('POST'),
    //     ApiDoc\Param(),
    //     ApiDoc\NotHeaders(),
    //     ApiDoc\Header(name: "token", type: "string", require: true, desc: "token"),
    //     ApiDoc\ResponseSuccess("data", type: "array"),
    // ]
    public function capital_count()
    {
        $res = UserLogic::capital_count($this->userId);
        return $this->success('ok', $res);
    }

    public function send_sms()
    {
        $res = (new UserLogic())->dealSendSms($this->userId);
        if ($res) {
            return $this->success('发送成功');
        }
        return $this->fail('发送失败');
    }

    //登录
    public function login_sms()
    {
        $params = (new UserValidate())->post()->goCheck('login');
        $res = (new UserLogic())->dealLoginSms($params['account']);
        if ($res) {
            return $this->success('发送成功');
        }
        return $this->fail('发送失败');
    }

    //报备
    public function reporting_sms()
    {
        $params = (new UserValidate())->post()->goCheck('login');
        $res = (new UserLogic())->dealReportingSms($params['account']);
        if ($res) {
            return $this->success('发送成功', [], 1, 1);
        }
        return $this->fail('发送失败');
    }



    public function set_payPassword()
    {
        $params = (new UserValidate())->post()->goCheck('setPayPassword');
        $remark = $this->userId . '_payPassword';
        $code = Cache::get($remark);
        if ($code && isset($params['code']) && $code !== $params['code']) {
            return $this->fail('验证码错误');
        }
        if ($params['rePassword'] !== $params['password'])
            return $this->fail('两次密码不一致');
        $result = UserLogic::dealPayPassword($params, $this->userId);
        if (!$result) {
            return $this->fail('设置失败');
        }
        return $this->success('设置成功');
    }



    //修改
    //    public function withdrawalPassword()
    //    {
    //        $data = $this->request->params(['repassword', 'password', 'sms_code']);
    //        $sms_code = app()->make(SmsService::class)->checkSmsCode($this->user->phone, $data['sms_code'], 'change_pwd');
    //        if (!$data['sms_code'] || !$sms_code) {
    //            return app('json')->fail('验证码不正确');
    //        }
    //        if (!$this->user->phone)
    //            return app('json')->fail('请先绑定手机号');
    //        if (empty($data['repassword']) || empty($data['password']))
    //            return app('json')->fail('请输入提现密码');
    //        if ($data['repassword'] !== $data['password'])
    //            return app('json')->fail('两次密码不一致');
    //        $password = $this->repository->encodePassword($data['password']);
    //        $this->repository->update($this->request->uid(), ['withdrawal_pwd' => $password]);
    //        return app('json')->success('绑定成功');
    //
    //    }

    //采购款明细、余额明细、礼品券明细、返还金明细
    public function fundList()
    {
        (new UserValidate())->get()->goCheck('fund');
        $page_no = (int)$this->request->get('page_no', 1);
        $page_size = (int)$this->request->get('page_size', 15);
        $params = $this->request->get();
        $params['page_no'] = $page_no > 0 ? $page_no : 1;
        $params['page_size'] = $page_size > 0 ? $page_size : 15;
        $res = UserLogic::dealDetails($params, $this->userId);
        $integral = User::where('id', $this->userId)->value('integral');
        $number = UserSign::where('id', $this->userId)->where('status', 0)->sum('number');
        $GetNumber = UserSign::where('id', $this->userId)->where('status', 1)->sum('number');
        $res['page_no'] = $params['page_no'];
        $res['page_size'] = $params['page_size'];
        $res['extend'] = [
            'integral' => $integral,
            'number' => $number,
            'get_number' => $GetNumber
        ];
        return $this->success('ok', $res);
    }

    /**
     * 礼品券/冻结券
     */
    public function userSing()
    {
        (new UserValidate())->get()->goCheck('fund');
        $type = (int)$this->request->get('type', 1);
        if ($type == 1) {
            return $this->dataLists(new UserSignLists());
        } else {
            return $this->dataLists(new UserSignLogLists());
        }
    }

    /**
     * 用户信息
     */
    public function other_user_info()
    {
        $mobile = $this->request->get('mobile');
        if ($mobile) {
            $user = User::where('mobile', $mobile)->field('id,avatar,real_name,nickname,mobile,user_ship,purchase_funds,label_id')->find();
            if ($user) {
                $address = UserAddress::where('uid', $user['id'])->where('is_default', 1)->find();
                if ($address) {
                    $city_name = Db::name('geo_city')->where('city_code', $address['city'])->value('city_name');
                    $area_name = Db::name('geo_area')->where('area_code', $address['area'])->value('area_name');
                    $street_name = Db::name('geo_street')->where('street_code', $address['street'])->value('street_name');
                    $village_name = Db::name('geo_village')->where('village_code', $address['village'])->value('village_name');
                    $brigade_name = Db::name('geo_brigade')->where('id', $address['brigade'])->value('brigade_name');
                    $address['address_like'] = $city_name . $area_name . $street_name . $village_name . $brigade_name;
                }
                $user['ship_name'] = $user['user_ship'] > 0 ? UserShip::where('id', $user['user_ship'])->value('title') : '';
                $user['address_info'] = $address;
                return $this->success('ok', $user->toArray());
            } else {
                return $this->fail('用户不存在', [], 0, 0);
            }
        }
        return $this->success('ok', []);
    }

    /**
     * 提现信息
     */
    public function cash_info()
    {
        $info = User::where('id', $this->userId)->field('id,now_money')->find();
        $info['notes'] = '提现金额需大于1元,提现到微信零钱,并财务审核,审核通过后,提现金额将自动到账';
        return $this->data($info);
    }

    /**
     * 提交提现申请
     */
    public function cash_application()
    {
        $money = $this->request->post('money');
        $find = User::where('id', $this->userId)->find();
        if ($find &&$money > $find['now_money']) {
            return $this->fail('提现金额不能大于余额');
        }
        if ($money < 1) {
            return $this->fail('提现金额不能小于1元');
        }
        $data['uid'] = $this->userId;
        $data['create_time'] = time();
        $data['status'] = 0;
        $data['extract_price'] =$money;
        $data['balance'] =bcsub($find['now_money'],$money,2);
        $data['before_balance'] =$find['now_money'];
        $data['extract_type'] = 'wx';
        $res = StoreExtract::create($data);
        if ($res) {
            User::where('id', $this->userId)->dec('now_money', $money)->update();
            return $this->success('申请成功,等待审核');
        } else {
            return $this->success('申请失败');
        }
    }

    /**
     * 提现申请记录
     */
    public function cash_record()
    {
        $list = StoreExtract::where('uid', $this->userId)->order('id desc')
        ->field('id,extract_price price,status,pay_status,create_time')
        ->select()->each(function ($item) {
            if($item->status==-1){
                $item->status_name='未通过';
            }elseif($item->status==0){
                $item->status_name='审核中';
            }elseif($item->status==1){
                $item->status_name='已通过';
            }
            $item->title='申请提现'.$item->price.'元';
            $item->pay_status_name=$item->status==1?'已打款':'未打款';

        })->toArray();
        return $this->data($list);
    }
}