<?php

namespace App\Http\Controllers\Api;

use App\Command\Log;
use App\Handlers\FileUploadHandler;
use App\Models\Carousel;
use App\Models\GoodSku;
use App\Models\Good;
use App\Models\Merchant;
use App\Models\User;
use App\Models\UserAddress;
use App\Models\OrderDivideRecord;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class UserController extends BaseController
{

    //加入购物车
    public function addShoppingCart(Request $request)
    {
        $userObj = $request->user();
        $merchant_id = $userObj->merchant_id;
        $goods_id = $request->goods_id ?? 0;
        $num = $request->num ?? 0;
        $attr_name = $request->attr_name ? trim($request->attr_name) : '';
        //商品信息
        $goodsObj = Good::where("id", $goods_id)->first();
        Log::add('添加购物车商品信息===' . $goods_id, []);
        if (!$goodsObj) {
            return $this->JsonResponse('', '该商品已下架', 500);
        }
        $goods_price = 0;
        //处理规格
        $attr_id = 0;
        $attr_sn = $attr_txt = '';
        if ($attr_name) {
            $attrArr = explode(",", $attr_name);
            utf8_array_asort($attrArr);
            $attrStr = join("、", $attrArr);
            $attr_sn = md5($attrStr);

            $goodsAttrObj = GoodSku::where("goods_id", $goods_id)->where("attr_sn", $attr_sn)->first();
            if (!$goodsAttrObj) {
                return $this->JsonResponse('', '该规格参数有误,选择其它规格', 500);
            }
            Log::add('添加购物车商品规格', $goodsAttrObj->toArray());
            $attr_id = $goodsAttrObj->id;
            $attr_txt = $goodsAttrObj->attr_val;
            $goods_price = $merchant_id ? $goodsAttrObj->cg_price : $goodsAttrObj->market_price;
        }

        $shoppingCart = isset($userObj->shopping_cart) ? json_decode($userObj->shopping_cart, true) : [];

        $key = $goods_id . "_" . $attr_sn;
        if (isset($shoppingCart[$key]) && $shoppingCart[$key]['attr_sn'] == $attr_sn) {
            $count = $shoppingCart[$key]['num'] + $num;
            $shoppingCart[$key] = [
                'goods_id' => $goods_id,
                'attr_id' => $attr_id,
                'num' => $count,
                'attr_sn' => $attr_sn,
                'attr_txt' => $attr_txt,
                'goods_price' => $goods_price,
            ];
        } else {
            $shoppingCart[$key] = [
                'goods_id' => $goods_id,
                'attr_id' => $attr_id,
                'num' => $num,
                'attr_sn' => $attr_sn,
                'attr_txt' => $attr_txt,
                'goods_price' => $goods_price,
            ];
        }
        //
        $resultCart = empty($shoppingCart) ? null : json_encode($shoppingCart, JSON_UNESCAPED_UNICODE);

        $userObj->shopping_cart = $resultCart;
        $userObj->save();

        return  $this->JsonResponse('');
    }

    //购物车详情
    public function showShoppingCart(Request $request)
    {
        $userObj = $request->user();
        $shoppingCart = isset($userObj->shopping_cart) ? json_decode($userObj->shopping_cart, true) : [];

        $data = [];
        if ($shoppingCart) {
            foreach ($shoppingCart as $key => $item) {
                $tmp = [];
                $goodsAttrObj = GoodSku::where("goods_id", $item['goods_id'])->where("attr_sn", $item['attr_sn'])->first();
                $goodsObj = Good::where("id", $item['goods_id'])->where('is_show', 1)->first();
                if (!$goodsAttrObj || !$goodsObj) {
                    unset($shoppingCart[$key]);
                    continue;
                }
                $tmp['catKey'] = $item['goods_id'] . "_" . $item['attr_sn'];
                $tmp['goods_id'] = $item['goods_id'];
                $tmp['goods_name'] = $goodsObj->goods_name;
                $tmp['cover_img'] = isset($goodsObj->cover_img) ? env('IMAGE_URL') . $goodsObj->cover_img  : '';
                $tmp['num'] = $item['num'];
                $tmp['attr_sn'] = $item['attr_sn'];
                $tmp['goods_price'] = $item['goods_price'];
                $tmp['attr_name'] = $item['attr_txt'];

                array_push($data, $tmp);
            }
            $userObj->shopping_cart = empty($shoppingCart) ? null : json_encode($shoppingCart, JSON_UNESCAPED_UNICODE);
            $userObj->save();
        }
        return $this->JsonResponse($data);
    }

    //删减减购物车商品
    public function reduceShoppingCart(Request $request)
    {
        $cartKey = $request->cartKey ?? '';
        $user = $request->user();
        $shoppingCart = isset($user->shopping_cart) ? json_decode($user->shopping_cart, true) : [];
        if (empty($shoppingCart)) {
            return $this->JsonResponse('', '购物车无资源', 500);
        }
        if ($cartKey) {
            $ckeys = explode(',', $cartKey);
            foreach ($ckeys as $kk => $vv) {
                if (isset($shoppingCart[$vv])) unset($shoppingCart[$vv]);
            }
        }
        $user->shopping_cart = empty($shoppingCart) ? null : json_encode($shoppingCart, JSON_UNESCAPED_UNICODE);
        $user->save();
        return $this->JsonResponse('');
    }

    //购物车商品数量更新
    public function numberShoppingCart(Request $request)
    {
        $cart_id = $request->cartKey ?? '';
        $number = $request->num ?? 0;
        $user = $request->user();
        $shoppingCart = $user->shopping_cart ? json_decode($user->shopping_cart, true) : [];
        if (empty($shoppingCart)) {
            return $this->JsonResponse('', '购物车无资源', 201);
        }
        foreach ($shoppingCart as $key => $val) {
            if (isset($shoppingCart[$cart_id])) {
                if ($number) {
                    $shoppingCart[$cart_id]['num'] = $number;
                } else {
                    unset($shoppingCart[$cart_id]);
                }
            }
        }

        $user->shopping_cart = empty($shoppingCart) ? null : json_encode($shoppingCart, JSON_UNESCAPED_UNICODE);
        $user->save();
        return $this->JsonResponse('');
    }

    public function info(Request $request)
    {
        $user = $request->user();
        $balance = $user->balance ?? 0; //余额
        $total_revenue = $user->total_revenue ?? 0; //总金额
        $cashout = $total_revenue - $balance; //已提现
        return $this->JsonResponse([
            'user_id' => $user->id,
            'nickname' => $user->name,
            'avatar' => $user->avatar ? env('IMAGE_URL') . $user->avatar : env('NO_AVATAR_IMAGE_URL'),
            'phone' => $user->phone,
            'phone_sec' => $user->phone ? substr($user->phone, 0, 3) . "****" . substr($user->phone, 7) : '',
            //'status' => $user->status,
            'merchant_id' => $user->merchant_id ?? 0,
            'buycode' => $user->buycode ?? '',
            'balance' => $balance ?? 0,
            'total_revenue' => $total_revenue ?? 0,
            'cashout' => $cashout ?? 0,
        ]);
    }

    public function home(Request $request)
    {
        $carousel = Carousel::where(['status' => 1])->select(['imgUrl', 'linkUrl', 'descr'])->get();
        $user_per = $request->user()->permissions ? json_decode($request->user()->permissions, true) : [];
        $permission_ids = array_intersect([1, 2, 3, 4, 5], $user_per);
        $permission = [];
        if (!empty($permission_ids)) {
            foreach ([1, 2, 3, 4, 5] as $item) {
                if (in_array($item, $user_per)) {
                } else {
                    $permission[] = [
                        'name' => '',
                        'slug' => ''
                    ];
                }
            }
            //            foreach ($permission_ids as $id){
            //                $u_p = UserPermission::find($id);
            //                $permission[] = [
            //                    'name' => $u_p->name,
            //                    'slug' => $u_p->slug
            //                ];
            //            }
        }
        return $this->JsonResponse(['carousel' => $carousel, 'permissions' => $permission]);
    }



    //图片统一上传接口
    public function uploadImg(FileUploadHandler $fileUploadHandler, Request $request)
    {
        $imgFile = $request->img_file ?? null;
        if (empty($imgFile)) {
            return $this->JsonResponse('', '参数异常', 201);
        }
        $imgUrl = $fileUploadHandler->save($imgFile);
        if (!$imgUrl) {
            return $this->JsonResponse('', '上传失败', 201);
        }
        return $this->JsonResponse(['img_url' => $imgUrl]);
    }

    //更新用户
    public function editUser(Request $request)
    {
        $name  = $request->name ?? '';
        $avatar = $request->avatar ?? null;
        $user = $request->user();
        if ($name) {
            $user->name = $name;
        }
        if (stripos($avatar, 'wximg') !== false) {
            $avatar = '';
        }
        if ($avatar) {
            if (is_file(public_path() . '/uploads' . $user->avatar)) {
                unlink(public_path() . '/uploads' . $user->avatar);
            }
            $user->avatar = $avatar ? str_replace(env('IMAGE_URL'), '', $avatar) : '';
        }

        if ($name) {
            $user->save();
        }

        return $this->JsonResponse([
            'id' => $user->id,
            'name' => $user->name,
            'avatar' => ($user->avatar ? env('IMAGE_URL') . $user->avatar : '')
        ]);
    }

    //修改密码
    public function updatePwd(Request $request)
    {
        $phone = $request->phone ?? '';
        $captcha = $request->code ?? '';
        $password = $request->pwd ?? '';
        $event = $request->event ?? 'pwd';

        if (!$phone || !$captcha) {
            return $this->JsonResponse('', '账号或验证码不为空', 500);
        }

        if (!$this->checkcode($phone, $captcha, $event)) {
            return $this->JsonResponse('', '验证码错误或已过期', 500);
        }

        $user = User::where('phone', $phone)->where('status', 1)->first();
        if (!$user) {
            return $this->JsonResponse('', '用户不存在或已被禁用', 500);
        }
        if (strlen($password) < 6) {
            return $this->JsonResponse('', '密码长度不低于6个字符', 500);
        }

        $user->password = Hash::make($password);
        $res = $user->save();
        if ($res) {
            // 删除验证码
            $this->flush($phone, 'login');
        }
        return $this->JsonResponse('');
    }

    //上传文件
    public function uploadFile(FileUploadHandler $fileUploadHandler, Request $request)
    {
        $file = $request->file_obj ?? null;
        $file_path = '';
        if ($file) {
            $file_path = Env('IMAGE_URL') . $fileUploadHandler->save($file);
        }
        return $this->JsonResponse($file_path);
    }

    //获取收货地址列表
    public function getUserAddress(Request $request)
    {
        $list = UserAddress::where(['uid' => $request->user()->id, 'deleted_at' => null])->limit(10)->get();
        foreach ($list as $key => $item) {
            $list[$key]['area'] = $item->province ? $item->province . " " . $item->city . " " . $item->district : "";
        }
        return $this->JsonResponse($list);
    }

    //设置收货地址
    public function setUserAddress(Request $request)
    {
        $address_id = $request->address_id ?? 0;
        $consignee = $request->consignee ?? '';
        $phone = $request->phone ?? '';
        $area = $request->area ?? '';
        $address = $request->address ?? '';
        $is_default = $request->is_default ?? 0;
        $model = UserAddress::find($address_id);
        if (!$model) {
            $model = new UserAddress();
        } elseif ($model->uid != $request->user()->id) {
            return $this->JsonResponse('', '参数错误', 201);
        }
        $model->uid = $request->user()->id;
        $count = UserAddress::where('uid', $model->uid)->get()->count();
        if ($count > 10) {
            return $this->JsonResponse('', '收货地址总数在10条以内', 500);
        }
        if ($consignee) $model->consignee = $consignee;
        if ($phone) $model->phone = $phone;
        if ($area) $model->area = $area;
        if ($address) $model->address = $address;

        if ($is_default !== null) {
            $model->is_default = $is_default;
            if ($is_default == 1) {
                UserAddress::where(['uid' => $request->user()->id])->update(['is_default' => 0]);
            }
        }
        if (!$model->save()) {
            return $this->JsonResponse('', '设置收货地址失败', 201);
        }
        return $this->JsonResponse($model->toArray());
    }

    //删除收货地址
    public function delUserAddress(Request $request)
    {
        $address_id = $request->address_id ?? null;
        if (!$address_id) {
            return $this->JsonResponse('', '参数错误', 201);
        }
        $address_ids = explode(',', $address_id);
        UserAddress::where(['uid' => $request->user()->id])->whereIn('id', $address_ids)->delete();
        return $this->JsonResponse('');
    }


    //用户分享
    public function share(Request $request)
    {
        $shuid = $request->spuid ?? 0;
        $spObj = User::find($shuid);
        if (!$spObj) {
            return $this->JsonResponse('', '参数错误', 201);
        }

        $userObj = $request->user();
        $user_id = $userObj->id;
        $spuid = $userObj->spuid; //是否已有推荐人
        if (!$spuid && $user_id != $shuid) {
            $userObj->spuid = $shuid; //直推
            $userObj->second_spuid = $spObj->spuid; //间推
            $userObj->save();
        }
        return $this->JsonResponse('');
    }

    //我的邀请
    public function getMyShare(Request $request)
    {
        $user_id = $request->user()->id;
        $page = $request->page ?? 1;
        $limit = $request->limit ?? 10;
        $sql = User::where(['spuid' => $user_id, 'deleted_at' => null]);
        $data = [
            'total' => $sql->count(),
            'total_page' => ceil($sql->count() / $limit),
            'list' => []
        ];
        $listData = $sql->offset(($page - 1) * $limit)->limit($limit)->orderBy('created_at', 'DESC')->get();
        if ($listData->toArray()) {
            foreach ($listData as $item) {
                $data['list'][] = [
                    'name' => $item->name,
                    'avatar' => ($item->avatar ? env('IMAGE_URL') . $item->avatar : ''),
                    'addtime' => date('Y-m-d H:i:s', strtotime($item->created_at))
                ];
            }
        }
        return  $this->JsonResponse($data);
    }

    //我的好友
    public function getMyFriend(Request $request)
    {
        $user_id = $request->user()->id;
        $page = $request->page ?? 1;
        $limit = $request->limit ?? 10;
        $type = $request->type ?? 1; //1: 直推 2:间推
        $where = [];
        if ($type == 1) {
            $where['spuid'] = $user_id;
        } else {
            $where['second_spuid'] = $user_id;
        }
        $sql = User::where(['deleted_at' => null])->where($where);
        $data = [
            'total' => $sql->count(),
            'total_page' => ceil($sql->count() / $limit),
            'directAmount' => 0,
            'indirectAmount' => 0,
            'list' => []
        ];
        //直推佣金总额 indirect
        $directAmount = OrderDivideRecord::where(['sh_type' => 1, 'um_id' => $user_id])->sum('divide_price');
        $data['directAmount'] = (float)$directAmount;
        //间推佣金总额 indirect
        $indirectAmount = OrderDivideRecord::where(['sh_type' => 2, 'um_id' => $user_id])->sum('divide_price');
        $data['indirectAmount'] = (float)$indirectAmount;

        $listData = $sql->offset(($page - 1) * $limit)->limit($limit)->orderBy('created_at', 'DESC')->get();
        if ($listData->toArray()) {
            foreach ($listData as $item) {
                //获取会员给我产生的佣金
                $uid = $item->id;
                $divide_price = OrderDivideRecord::where(['sh_type' => $type, 'um_id' => $user_id, 'user_id' => $uid])->sum('divide_price');

                $data['list'][] = [
                    'name' => $item->name,
                    'divide_price' => (float)$divide_price,
                    'avatar' => ($item->avatar ? env('IMAGE_URL') . $item->avatar : env('IMAGE_URL') . '/wximg/my.png'),
                    'addtime' => date('Y-m-d H:i:s', strtotime($item->created_at))
                ];
            }
        }

        return  $this->JsonResponse($data);
    }

    //绑定直购码
    public function bindBuycode(Request $request)
    {
        $code = $request->code ?? '';

        $merObj = Merchant::where("buycode", $code)->first();
        if (!$merObj) {
            return $this->JsonResponse('', '参数有误,没有该商户', 500);
        }
        DB::beginTransaction();
        try {
            $userObj = $request->user();
            $userObj->buycode = $code;
            $userObj->merchant_id = $merObj->id;
            $userObj->save();
            DB::commit();
        } catch (\Exception $exception) {
            Log::add('绑定直购码失败', $exception->getMessage());
            DB::rollBack();
            return $this->JsonResponse('', '绑定直购码失败', 201);
        }

        return  $this->JsonResponse('');
    }
}