<?php

namespace App\Modules\Mini\Services;

use App\Base\BaseService;
use App\Models\Cart;
use App\Models\Goods\Goods;
use App\Models\Goods\GoodsSku;
use App\Models\Order\Order;
use App\Models\User\User;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;

class CartService extends BaseService
{
    public function paginate(User $user, $params)
    {
        $p = Cart::where("user_id", $user->id)->orderByDesc("id")->paginate($params['page_size']);

        return [
            "total" => $p->total(),
            "page_total" => $p->lastPage(),
            "list" => array_map(function (Cart $model) {
                return [
                    "id" => $model->id,
                    "sn" => $model->sn,
                    "name" => $model->goods_name,
                    "thumb" => $model->thumb,
                    "count" => $model->count,
                ];
            }, $p->items()),
        ];
    }

    public function add(User $user, $params): Cart
    {
        $gid = $params['id'];
        $goods = Goods::findOrFail($gid);
        $sku = GoodsSku::findOrFail($params['sku_id']);
        $cart = new Cart();
        $cart->user_id = $user->id;
        $cart->goods_id = $goods->id;
        $cart->count = 1;
        $sn = $sku->sn;
        if ($skuCustom = Arr::get($params, "sku_custom")) {
            $sn = $sn . "-" . implode("-", Arr::pluck($skuCustom, "spec_attr_custom"));
        }
        $cart->extra = [
            "goods_name" => $goods->name,
            "thumb" => $goods->thumb,
            "sn" => $sn,
            "sku_id" => $sku->id,
        ];
        $cart->save();

        return $cart;
    }

    public function update(User $user, $params)
    {
        $cart = Cart::where("id", $params['id'])->where("user_id", $user->id)->firstOrFail();

        if ($params['count']) {
            $cart->count = $params['count'];
            $cart->save();
        } else {
            $cart->delete();
        }

        return $cart;
    }

    public function ask(User $user, $params)
    {
        $params['source'] = Order::SOURCE_CART;
        return app(OrderService::class)->askByCart($user, $params);
    }
}