<?php

namespace App\Http\Controllers\Shop;

use Exception;
use App\Models\Product;
use App\Models\Category;
use App\Models\ProductAttr;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Models\ProductVariation;
use App\Models\ProductAttrOption;
use App\Http\Controllers\Controller;
use App\Models\ProductVariationOption;
use Gloudemans\Shoppingcart\Facades\Cart;
use Illuminate\Database\Eloquent\Builder;

class ProductController extends Controller
{
    public function index(Request $request, $slug)
    {
        $product = new Product();

        $prod = $product->getProductBySlug($slug);

        $data = [
            'product' => $prod,
            'mainProducts' => $product->getProductsRelateds($prod->id_category, 4) // Products relateds
        ];
        // dd(Cart::content()['027c91341fd5cf4d2579b49c4b6a90da']);
        return view('template.products.single', $data);
    }

    public function getProductData($id_product)
    {
        $product = new Product();

        try {
            return $product->getProductsById($id_product);
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    public function allProducts(Request $request)
    {
        $filters = $request->query();
        unset($filters['page']);
        $query = Product::where('is_deleted', false);
        if (!$request->get('includeArchived', false)) {
            $query->where('is_archived', false);
        }
        $this->addFilters($query, $filters);
        $perPage = 12;
        $products = $query->paginate($perPage)->appends($filters);
        return view('template.products.all-products', ['products' => $products]);
    }

    private function addFilters(Builder $builder, ?array $filters)
    {
        $term = null;

        if (empty($filters)) {
            return;
        }

        if (isset($filters['term'])) {
            $term = $filters['term'];
            unset($filters['term']);
        }

        $builder->when($term != null, function ($query) use ($term) {
            $query->where('product_title', 'LIKE', '%'.$term.'%');
        });

        foreach ($filters as $filter => $value) {
            $builder->whereHas('variations', function ($query) use ($filter, $value) {
                $query->where('variation_title', $filter)
                    ->whereHas('options', function ($variationQuery) use ($value) {
                        $variationQuery->where('variation_option_title', $value);
                    });
            });
        }
    }
}
