<?php



namespace app\common\repositories\user;

use app\common\repositories\BaseRepository;
use app\common\dao\user\UserExtractDao as dao;
use app\common\repositories\wechat\WechatUserRepository;
use ln\jobs\SendTemplateMessageJob;
use ln\services\SwooleTaskService;
use ln\services\WechatService;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\Queue;

class UserExtractRepository extends BaseRepository
{

    /**
     * @var dao
     */
    protected $dao;


    /**
     * UserExtractRepository constructor.
     * @param dao $dao
     */
    public function __construct(dao $dao)
    {
        $this->dao = $dao;
    }


    /**
     * TODO
     * @param $id
     * @return bool
     * @author Qinii
     * @day 2020-06-16
     */
    public function getWhereCount($id)
    {
        $where['extract_id'] = $id;
        $where['status'] = 0;
        return $this->dao->getWhereCount($where) > 0;
    }

    /**
     * TODO
     * @param array $where
     * @param $page
     * @param $limit
     * @return array
     * @author Qinii
     * @day 2020-06-16
     */
    public function search(array $where, $page, $limit)
    {
        $query = $this->dao->search($where)->with(['user' => function ($query) {
            $query->field('uid,avatar,nickname');
        }]);
        $count = $query->count();
        $list = $query->page($page, $limit)->select();
        return compact('count', 'list');
    }

    public function getTotalExtractPrice()
    {
        return $this->dao->search(['status' => 1])->sum('extract_price');
    }

    /**
     * @param $uid
     * @return mixed
     * @author xaboy
     * @day 2020/6/22
     */
    public function userTotalExtract($uid)
    {
        return $this->dao->search(['status' => 1, 'uid' => $uid])->sum('extract_price');
    }

    /**
     * TODO
     * @param $user
     * @param $data
     * @author Qinii
     * @day 2020-06-16
     */
    public function create($user,$data)
    {
        $data = Db::transaction(function()use($user,$data){
            if($user['brokerage_price'] < (systemConfig('user_extract_min')))
                throw new ValidateException('可提现金额不足');
            if($data['extract_price'] < (systemConfig('user_extract_min')))
                throw new ValidateException('提现金额不得小于最低额度');
            if($user['brokerage_price'] < $data['extract_price'])
                throw new ValidateException('提现金额不足');
            if($data['extract_type'] == 3) {
                $make = app()->make(WechatUserRepository::class);
                $openid = $make->idByOpenId((int)$user['wechat_user_id']);
                if (!$openid){
                    $openid = $make->idByRoutineId((int)$user['wechat_user_id']);
                    if(!$openid) throw new ValidateException('openID获取失败,请确认是微信用户');
                }
            }
            $brokerage_price = bcsub($user['brokerage_price'],$data['extract_price'],2);
            $user->brokerage_price = $brokerage_price;
            $user->save();

            $data['extract_sn'] = $this->createSn();
            $data['uid'] = $user['uid'];
            $data['balance'] = $brokerage_price;

            return $this->dao->create($data);
        });

        SwooleTaskService::admin('notice', [
            'type' => 'extract',
            'title' => '您有一条新的提醒申请',
            'id' => $data->extract_id
        ]);
    }

    public function switchStatus($id,$data)
    {
        Db::transaction(function()use($id,$data){
            $extract = $this->dao->getWhere(['extract_id' => $id]);
            $user = app()->make(UserRepository::class)->get($extract['uid']);
            if(!$user) throw new ValidateException('用户不存在');
            if($data['status'] == '-1'){
                $user = app()->make(UserRepository::class)->get($extract['uid']);
                $brokerage_price = bcadd($user['brokerage_price'] ,$extract['extract_price'],2);
                $user->brokerage_price = $brokerage_price;
                $user->save();
            }

            if($data['status'] == 1 && $extract['extract_type'] == 3){
                $openid = app()->make(WechatUserRepository::class)->idByOpenId((int)$user['wechat_user_id']);
                if(!$openid) throw new ValidateException('openID获取失败');
                $ret = [
                    'openid' => $openid,
                    'sn' => $extract['extract_sn'],
                    'price' => $extract['extract_price']
                ];
                WechatService::create()->merchantPay($ret);
            }
            $this->dao->update($id,$data);
        });
        Queue::push(SendTemplateMessageJob::class,[
            'tempCode' => 'ORDER_DELIVER_SUCCESS',
            'id' =>$id
        ]);
    }

    public function createSn()
    {
        list($msec, $sec) = explode(' ', microtime());
        $msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', '');
        $sn = 'ue' . $msectime . mt_rand(10000, max(intval($msec * 10000) + 10000, 98369));
        return $sn;
    }
}
