<?php

namespace app\api\logic\order;

use app\common\enum\PayEnum;
use app\common\logic\BaseLogic;
use app\common\model\goods\Goods;
use app\common\model\goods\Unit;
use app\common\model\merchant\Merchant;
use app\common\model\opurchase\Opurchaseclass;
use app\common\model\opurchase\Opurchaseinfo;
use app\common\model\order\Cart;
use app\common\model\retail\Cashierclass;
use app\common\model\retail\Cashierinfo;
use app\common\model\user\UserAddress;
use app\Request;
use think\facade\Db;
use Yansongda\Pay\Event\PayEnd;

/**
 * 订单逻辑
 * Class OrderLogic
 * @package app\api\logic\order
 */
class OrderLogic extends BaseLogic
{
    public static $total;
    /**
     * @notes 获取购物车商品信息
     * @param $params
     * @return array
     */
    static public function cartIdByOrderInfo($cartId, $addressId, $user = null, $params = [])
    {

        $where = ['is_pay' => 0, 'is_fail' => 0];
        $cart_select = Cart::whereIn('cart_id', $cartId)->where($where)->field('goods_id as goods,cart_num')->select()->toArray();
        if (empty($cart_select)) {
            self::setError('购物车为空');
            return false;
        }
        try {
            self::$total = 0;
            /** 计算价格 */
            foreach ($cart_select as $k => $v) {
                $find = Goods::where(['id' => $v['goods']])->field('name,imgs,unit,sell')->find();
                if(!$find){
                    continue;
                }
                $cart_select[$k]['total'] = bcmul($v['cart_num'], $find['sell'], 2);
                $cart_select[$k]['price'] = $find['sell'];
                $cart_select[$k]['name'] = $find['name'];
                $cart_select[$k]['imgs'] = $find['imgs'];
                $cart_select[$k]['unit_name'] = Unit::where(['id' => $find['unit']])->value('name');
                self::$total=bcadd(self::$total, $cart_select[$k]['total'], 2);
            }
            $order = [
                'time' => time(),
                'number' => static::getNewOrderId('PF'),
                'total' => self::$total,
                'pay_type' => $params['pay_type'] ?? 0,
                'cart_id' => implode(',', $cartId),
                'delivery_msg'=>' 预计48小时发货 '
            ];
        } catch (\Exception $e) {
            self::setError($e->getMessage());
            return false;
        }
        return ['order' => $order, 'cart_list' => $cart_select];
    }

    /**
     * 创建新订单
     * @return Object|bool
     */
    static public function createOrder($cartId, $addressId, $user = null, $params = [])
    {
        $orderInfo = self::cartIdByOrderInfo($cartId, $addressId, $user, $params);
        if(!$orderInfo){
            return false;
        }
        $_order = $orderInfo['order'];
        $_order['deduction_price'] = 0;
        $_order['merchant'] = $params['mer_id'];
        $_order['uid'] = request()->userId;
        $_order['money'] = 0;
        $_order['user'] =  request()->userId;
        $_order['account'] = 0;
        $_order['payinfo'] = '';
        $_order['type'] = 0;
        $_order['source'] = 0;
        $_order['actual'] = $_order['total'];
        if($addressId>0){
            $address=UserAddress::where(['address_id'=>$addressId,'uid'=>Request()->userId])->find();
            if($address){
                $_order['real_name'] = $address['real_name'];
                $_order['user_phone'] = $address['phone'];
                $_order['user_address'] = $address['detail'];
                $_order['address_id'] = $addressId;
            }
        }
        if($params['pay_type']==PayEnum::WECHAT_PAY_BARCODE){
            $_order['source']=1;
        }
        Db::startTrans();
        try {
            $order = Cashierclass::create($_order);
            $goods_list = $orderInfo['cart_list'];
            foreach ($goods_list as $k => $v) {
                $goods_list[$k]['pid'] = $order->id;
                $goods_list[$k]['merchant'] = $params['mer_id'];
                $goods_list[$k]['uid'] = request()->userId;
                $goods_list[$k]['room'] = 0;
                $goods_list[$k]['discount'] = 0;
                $goods_list[$k]['warehouse'] = 0;
                $goods_list[$k]['nums'] = $v['cart_num'];
            }
            (new Cashierinfo())->saveAll($goods_list);
            Db::commit();
            return $order;
        } catch (\Exception $e) {
            Db::rollback();
            self::setError($e->getMessage());
            return false;
        }
    }

    /**
     * @notes 获取购货订单购物车商品信息
     * @param $params
     * @return array
     */
    static public function cartIdByPurchaseOrderInfo($user, $params)
    {
        if (!$user) {
            self::setError('没有用户信息,请先登录');
            return false;
        }
        $mer_id = $user['merchant']['mer_id'];
        $where1 = ['paid' => 1,'is_opurchase'=>0];
        $where1 = ['pay_type','<>',9];
        $arrs = Cashierclass::where('merchant', $mer_id)->whereDay('create_time')->where($where1)->column('cart_id,id,address_id');

        // $order_id = Cashierclass::where('merchant', $mer_id)->whereDay('create_time')->where($where1)->column('id');
        $cart_arr = [];
        $order_id = [];
        foreach ($arrs as $k => $v) {
            if (empty($v['cart_id'])) {
                self::setError('没有购物车信息');
                return false;
            }
            // if (empty($v['address_id'])) {
            //     self::setError('请先设置配送地址');
            //     return false;
            // }
            $arr = explode(',',$v['cart_id']);
            foreach ($arr as $kk => $vv) {
                $cart_arr[] = $vv;
            }
            $order_id[] = $v['id'];
        }
        $where = ['is_pay' => 1, 'is_fail' => 0];
        $cart_select = Cart::whereIn('cart_id', $cart_arr)->where($where)->field('goods_id as goods,cart_num')->select()->toArray();
        if (empty($cart_select)) {
            self::setError('购物车为空');
            return false;
        }
        /** 计算价格 */
        foreach ($cart_select as $k => $v) {
            $sell = Goods::where(['id' => $v['goods']])->value('sell');
            $cart_select[$k]['total'] = bcmul($v['cart_num'], $sell, 2);
            $cart_select[$k]['price'] = $sell;
        }
        $order = [
            'time' => time(),
            'number' => static::getNewOrderId('CG'),
            'total' => array_sum(array_column($cart_select, 'total')),
            'pay_type' => $params['pay_type'] ?? 0,
            'cart_id' => implode(',', $cart_arr),
            'order_arr' => implode(',', $order_id)
        ];
        return ['order' => $order, 'cart_list' => $cart_select];
    }
    /**
     * 创建购货订单
     * @return Object|bool
     */
    static public function createOpurchaseOrder($user = null, $params = [])
    {

        if (!$user) {
            self::setError('没有用户信息,请先登录');
            return false;
        }
        $mer_id = $user['merchant']['mer_id'];
        // $merchant = Merchant::where('mer_id', $mer_id)->find();
        $orderInfo = self::cartIdByPurchaseOrderInfo($user, $params);
        if (!$orderInfo) {
            return false;
        }
        $_order = $orderInfo['order'];
        // if ($_order['total'] < $merchant['mer_money']) {
        //     self::setError('商户余额不足');
        //     return false;
        // }
        $_order['merchant'] = $mer_id;
        $_order['money'] = $_order['total'];
        $_order['actual'] = $_order['total'];
        $_order['paid'] = 1;
        Db::startTrans();
        try {
            $order = Opurchaseclass::create($_order);

            $goods_list = $orderInfo['cart_list'];
            foreach ($goods_list as $k => $v) {
                $goods_list[$k]['nums'] = $v['cart_num'];
                $goods_list[$k]['pid'] = $order->id;
            }
            (new Opurchaseinfo())->saveAll($goods_list);
            // $merchant->mer_money = bcsub($merchant->mer_money, $_order['total'], 2);
            $order_arr = explode(',', $_order['order_arr']);
            Cashierclass::where('id', 'in', $order_arr)->update(['is_opurchase' => 1]);
            Db::commit();
            return $order;
        } catch (\Exception $e) {
            Db::rollback();
            self::setError($e->getMessage());
            return false;
        }
    }
    /**
     * @notes 获取订单号
     * @param $type
     * @return string
     * @author likeadmin
     * @date 2021/7/28 17:05
     */
    static public function getNewOrderId($type)
    {
        list($msec, $sec) = explode(' ', microtime());
        $msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', '');
        $orderId = $type . $msectime . mt_rand(10000, max(intval($msec * 10000) + 10000, 98369));
        return $orderId;
    }
}