<?php
namespace app\common\model;
use think\Model;
use think\Db;
/**
 * 货币模型
 */
class Wallet extends Model
{
    /**
     * 获取交易类型配置
     * @return mixed
     */
    public function getlogtype($type = '')
    {
        $conf = config('wallet.logtype');
        if($type){
            return $conf[$type] ?: $type;
        }
        return $conf;
    }

    //获取钱包名称
    public function getwalletname($name = ''){
        $conf = config('wallet.moneyname');
        if($name){
            return $conf[$name] ?: $name;
        }
        return $conf;
    }

    /**
     * 获取钱包余额
     * @param string $username 用户编号
     * @param string $wallet_name 指定钱包名
     * @return array|float
     */
    public function getWallet($user_id = '', $wallet_name = '')
    {
        //所有钱包余额
        $wallet = Db::name('user_wallet')->lock(true)->where(['user_id' => $user_id])->find();
        if(!$wallet) {
            abort(500,'钱包余额获取失败');
        }

        if($wallet_name) { //返回指定钱包
            return isset($wallet[$wallet_name]) ? $wallet[$wallet_name] : 0;
        } else { //返回所有钱包
            return $wallet;
        }
    }


    /**
     *
     * @param floatval $number 金额(正数进账,负数出账)
     * @param $accountType 货币类型,money,score
     * @param $logtype 日志的类型
     * @param $remark  备注
     * @param $user_id  用户id
     * @param $other_user_id  对方用户id
     * @param $table  来源表
     * @param $table_id  表id
     * @param $is_pay_get  1累计消费金额  2累计获得金额
     * @param $request_id 请求标识
     * @return array
     * @return array[status]
     * @return array[msg]
     * @return array[log_table]
     * @return array[log_id]
     */
    public function lockChangeAccountRemain($user_id, $other_user_id = 0,$accountType='money',$number,$logtype='',$remark='',$table='',$table_id=0,$is_pay_get=0,$request_id='')
    {
        //初始化
        $result = array(
            'status'=>false,
            'code' => 0, //报错时候采用
            'msg'=>'',
            'log_table' => '',
            'log_id' => '',
        );

        //获取小数点
        $point = in_array($accountType,['money']) ? 2 : 0;
        bcscale($point);

        //钱包名称
        $wallet_name = $this->getwalletname($accountType);

        //检测
        $number = floatval( $number );
        if( $number == 0 )
        {
            $result['msg'] = '交易金额:0';
            return $result;
        }
        if(0 === bccomp($number, 0)){
            $result['msg'] = '交易金额:0';
            return $result;
        }


        //检测
        $wallet = Db::name('user_wallet')->lock(true)->where(['user_id'=>$user_id])->find();
        if(!$wallet)
        {
            $result['msg'] = '不存在的用户';
            return $result;
        }

        if(bccomp(bcadd($wallet[$accountType], $number), 0) === -1)
        {
            $result['code'] = 10;
            $result['msg'] = $wallet_name.'余额不足!';
            return $result;
        }

        if(0 !== bccomp($number, 0))
        {
            $log_table = 'user_'.$accountType.'_log';
            //查询是否有消费记录
            $user_log_info = [];
            if ($request_id) {
                $user_log_info = Db::name($log_table)->where(['user_id' => $user_id, 'log_type' => $logtype, 'request_id' => $request_id])->find();
            }
            if ($user_log_info) {
                //修改钱币记录
                $data = array();
                $data['change_value'] = bcadd($user_log_info['change_value'], $number);
                $data['remain'] = bcadd($wallet[$accountType], $number);
                $data['remark'] = $remark;
                $data['createtime'] = time();
                $data['updatetime'] = time();

                /////////////
                $rs2_id = Db::name($log_table)->where(['id' => $user_log_info['id'], 'createtime' => $user_log_info['createtime']])->setField($data);
            } else {
                //添加钱币记录
                $data = array();
                $data['user_id'] = $user_id;
                $data['other_user_id'] = $other_user_id;
                $data['log_type'] = $logtype;
                $data['before'] = $wallet[$accountType];
                $data['change_value'] = $number;
                $data['remain'] = bcadd($wallet[$accountType], $number);
                $data['table'] = $table;
                $data['table_id'] = $table_id;
                $data['remark'] = $remark;
                $data['createtime'] = time();
                $data['updatetime'] = time();
                $data['request_id'] = $request_id;

                /////////////
                $rs2_id = Db::name($log_table)->insertGetId($data);
            }

            //新的方式
            $wallet_data[$accountType] = $data['remain'];
            if ($is_pay_get == 1) { //累计消费:后台充值updatemoney,支付充值goldpaysucc
                $wallet_data['pay_money'] = bcadd($wallet['pay_money'], bcdiv($number, config('site.rmb_to_gold'), 2)); //pay_money第1处修改
            } elseif ($is_pay_get == 2) { //累计获得:聊天礼物得收益,动态礼物得收益,私聊+语音+视频得收益,被守护得收益
                $wallet_data['get_money'] = bcadd($wallet['get_money'], $number);  //get_money第1处修改,也是唯一一处
            }
            $rs1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->update($wallet_data);

            if($rs1 === false || $rs2_id === false){
                $result['msg'] = '更新财务记录失败!';
                return $result;
            }

            if( $rs1 !== false && $rs2_id !== false )
            {
                $result['status'] = true;
                $result['msg'] = '账户余额已更新!';
                $result['log_table'] = $accountType.'_log';
                $result['log_id'] = $rs2_id;

                return $result;
            }
            else
            {
                $result['msg'] = '更新财务记录失败!';
                return $result;
            }
        } else {
            $result['msg'] = '金额不足0.01';
            return $result;
        }

    }



}