<?php
/**
 * 账户公用服务
 */
namespace app\modules\logic\services;
use app\modules\sys\log\ImLog;
use app\modules\common\Helper;
use app\modules\logic\model\UsersModel;
use app\modules\logic\model\UsersShopInfoModel;
use app\modules\logic\model\ShopRoleModel;
use app\modules\logic\model\AccountModel;
use app\modules\logic\model\AccountLogModel;
use app\modules\logic\model\SysPaySetModel;
use app\modules\logic\model\PayLogModel;
use app\modules\logic\services\UserService;
use app\modules\logic\services\OrderService;
use yii\base\Exception;
use Yii;
use yii\db\Query;
class AccountService
{
	/**
	 * [getAccount 获取账户币金额/余额]
	 * @method  POST
	 * @author JOHN.W
	 */
	public static function getAccount($user_id = 0){
		if(empty($user_id)) return false;
		//获取账户类型
		$account_type = UserService::getShopAccountInfo($user_id);
		switch ($account_type['shop_type']) {
			case '1': //集团账户
				$ret = self::accountMoney($user_id,$account_type['credit_pay_id']);
				break;
			case '2': //门店账户
				//判断是否为集团子账户
				if(!empty($account_type['parent_id'])){
					//判断集团的支付类型
					$account_parent_type = UserService::getShopAccountInfo($account_type['parent_id']);
					if($account_parent_type['pay_type']==1){ //单店支付 显示自己的,其他显示集团的
						$ret = self::accountMoney($user_id,$account_type['credit_pay_id']);
					}else{
						$ret = self::accountMoney($account_type['parent_id'],$account_parent_type['credit_pay_id']);
					}
				}
				$ret = self::accountMoney($user_id,$account_type['credit_pay_id']);
				break;
			case '3': //员工
				$Users = new UsersModel();
				$row = $Users->getWidgetRow(['cols'=>['parent_id'],'user_id'=>$user_id]);
				$ret = self::getAccount($row['parent_id']);	
				break;	
			default:
				$ret = [];
		}
		return $ret;
	}
	/*获取账户余额*/
	public static function accountMoney($user_id = 0,$credit_pay_id = 0){
		$Account = new AccountModel();
		$row = $Account->getWidgetRow(['cols'=>['total_amount','frost_amount','use_amount','total_gold','user_id'],'user_id'=>$user_id]);
		//获取用户授信用额度
		if(!empty($credit_pay_id)){
			$SysPaySet = new SysPaySetModel();
			$row_credit = $SysPaySet->getWidgetRow(['cols'=>['amount','day','total'],'status'=>'allow','id'=>$credit_pay_id]);
			$row_credit['use_amount'] = $row_credit['amount']+$row['use_amount'];
            $row_credit['used_amount'] = $row['use_amount'];
		}
		$ret = [
			'account'=>$row,
			'credit'=>isset($row_credit)?$row_credit:[]
		];
		return $ret;
	}
	/*获取账户性质,并且返回账户下面的用户ID*/
	public static function shopAccout($user_id = 0){
		$Users = new UsersModel();
		//获取账户类型
        $row = $Users->getWidgetRow(['cols'=>['shop_type','parent_id'],'user_id'=>$user_id]);
        $shop_ids = 0;
        switch ($row['shop_type']) {
        	case '1': //集团账号
        		//查找下面所有门店的ID
        		$shop_ids = $Users->find()->select('user_id')->where(['shop_type'=>2,'parent_id'=>$user_id])->column();
        		break;
        	case '2':
        		$shop_ids = [$user_id];
        		break;
        	case '3':
        		$shop_ids = [$row['parent_id']];
        		break;	
        }
        return $shop_ids;
	}
	/**
	 * 操作用户资金
	 */
	public static function addAccountLog($data = []){
		$db = Yii::$app->db;
        $has_tran = $db->getTransaction();
        if ($has_tran) {
            $tran = $has_tran;
        } else {
            $tran = $db->beginTransaction();
        }
        $id = 0;
        try {
            $log_info["user_id"] = $data['user_id'];//操作用户id
            $log_info["nid"] = $data['nid'];//订单号
            $log_info["money"] = $data['money'];//操作金额
            $log_info["money_type"] = $data['money_type'];//资金类型 'money','gold'
            $log_info["op_type"] = $data['op_type'];//操作类型
            $log_info["remark"] = $data['remark'];//备注
            $log_info["created"] = time();
            $command = $db->createCommand('/*FORCE_MASTER*/ select * from {{%account}} where user_id=:account for UPDATE ');
            $command->bindValue(':account', $data['user_id']);
            $account_result = $command->queryOne();
            $log_info['before_extra'] = json_encode($account_result);
            //插入资金记录
            $db->createCommand()->insert('{{%account_log}}',$log_info)->execute();
            $logid = $db->getLastInsertID();
            $id = $logid;
            //更新用户资金总表
            $command = $db->createCommand("/*FORCE_MASTER*/ SELECT * FROM {{%account_log}} WHERE  id={$logid} and user_id={$data['user_id']}");
            //获取用户单条资金记录
            $user_account_result = $command->queryOne();
            if (!empty($user_account_result)) {
            	$acount_info = [];
            	switch ($data['money_type']) {
            		case 'money':
            			$acount_info['total_amount'] = $account_result['total_amount']+$log_info["money"];
            			$acount_info['use_amount'] = $account_result['use_amount']+$log_info["money"];
            			break;
            		case 'gold':
            			$acount_info['total_gold'] = $account_result['total_gold']+$log_info["money"];
            			break;
            		default:
            	}
                //更新个人真实资金
                $db->createCommand()->update('{{%account}}', $acount_info,['user_id'=>$data['user_id']])->execute();
                if (empty($has_tran)) {
                	$db->createCommand()->update('{{%account_log}}', ['after_extra'=>json_encode($acount_info)],['id'=>$logid])->execute();
                    $tran->commit();
                }
            } else {
                Yii::warning("获取个人资金失败");
                $tran->rollBack();
            }
        } catch (Exception $e) {
            $tran->rollBack();
            Yii::warning($e->getMessage());
        }
        return $id;
	}
    /**
     * [updatePayLog 更新支付日志]
     */
    public static function updatePayLog($param = [],$id = 0){
        $db = Yii::$app->db;
        $tran = $db->beginTransaction();
        try {
            $command = $db->createCommand("/*FORCE_MASTER*/ select * from {{%pay_log}} where id=:id and status=0 for UPDATE ");
            $command->bindValue(':id', $id);
            $pay_info = $command->queryOne();
            if (!empty($pay_info)) {
                $db->createCommand()->update("{{%pay_log}}", $param, ['id' => $id,])->execute();
                //支付成功处理相应逻辑
                if ($param['status'] == 1) {
                    switch ($pay_info['order_type']) {
                        case '1'://支付订单
                                OrderService::upOrderPaySuc($pay_info['order_id']);
                            break;
                        case '2'://购买精誉币
                                $data = [
                                    'user_id'=>$pay_info['user_id'],
                                    'nid'=>$pay_info['nid'],
                                    'money'=>$pay_info['pay_money'],
                                    'money_type'=>'gold',
                                    'op_type'=>'buy_gold',
                                    'remark'=>'购买精誉币'
                                ];
                                self::addAccountLog($data);
                        case '3'://支付违约金取消订单
                                OrderService::cancelOrder($pay_info['order_id']);      
                            break;
                    }
                }
            }
            $tran->commit();
            return true;
        } catch (Exception $e) {
            $tran->rollBack();
            Yii::warning($e->getMessage());
            return false;
        }
    }

    //技师提现锁定
    public static function addUserCash($data, $remark)
    {
        $connection = Yii::$app->db;
        $tran = $connection->beginTransaction();
        $return_id = 0;//初始化返回值
        //事务异常处理
        try {
            //插入提现记录
            $insert_data = $data;
            $connection->createCommand()->insert('{{%account_cash}}', $insert_data)->execute();
            $return_id = $connection->getLastInsertID();
            $log_info["user_id"] = $data['user_id'];//操作用户id
            $log_info["nid"] = $data['nid'];//订单号
            $log_info["money"] = $data['total']*-1;//操作金额
            $log_info["money_type"] = 'money';//操作资金类型
            //$log_info["frost"] = $data['total'];//冻结金额
            $log_info["op_type"] = "cash";//类型
            $log_info["remark"] = $remark;//备注
            self::addAccountLog($log_info);
            $tran->commit();
        } catch (Exception $e) {
            //事务回滚
            Yii::warning($e->getMessage());
            $tran->rollBack();
        }
        return $return_id;
    }
    /**
     * [ModPayPwd 修改支付密码]
     */
    public static function ModPayPwd($user_id = 0,$pay_pwd = ''){
        $Account = new AccountModel();
        if(empty($user_id) || empty($pay_pwd)){
            return false;
        }
        $res = $Account->saveUs(['pay_password'=>md5($pay_pwd)],$user_id);
        return $res;
    }
}