<?php

namespace App\Controllers;

use App\Core\Controller;
use App\Models\Product;
use App\Models\Category;
use App\Models\Review;

class ProductController extends Controller
{
    private Product $productModel;
    private Category $categoryModel;
    private Review $reviewModel;

    public function __construct()
    {
        $this->productModel = new Product();
        $this->categoryModel = new Category();
        $this->reviewModel = new Review();
    }

    public function catalog(): void
    {
        $this->requireAuth();

        $user = $this->getCurrentUser();
        $isAdmin = $this->isAdmin();

        $filters = [
            'category_id' => (int) $this->getQuery('category', 0),
            'search' => $this->getQuery('search', ''),
            'min_price' => (int) $this->getQuery('min_price', 0),
            'max_price' => (int) $this->getQuery('max_price', 1000000),
            'colors' => $this->getQuery('colors', []),
            'materials' => $this->getQuery('materials', [])
        ];

        // Для админа по умолчанию показываем все товары (включая недоступные)
        // Для обычных пользователей - только доступные
        $showAll = $isAdmin && $this->getQuery('show_all') !== '0';

        $categories = $this->categoryModel->getActive();
        $products = ($isAdmin && $showAll)
            ? $this->productModel->getAllForAdmin(true)
            : $this->productModel->getAvailable($filters);
        
        $availableColors = $this->productModel->getAvailableColors();
        $availableMaterials = $this->productModel->getAvailableMaterials();

        $subcategories = [];
        if ($filters['category_id'] > 0) {
            $subcategories = $this->categoryModel->getChildren($filters['category_id']);
        }

        $this->view('products/catalog', [
            'user' => $user,
            'isLoggedIn' => true,
            'isAdmin' => $isAdmin,
            'categories' => $categories,
            'subcategories' => $subcategories,
            'products' => $products,
            'filters' => $filters,
            'showAll' => $showAll,
            'availableColors' => $availableColors,
            'availableMaterials' => $availableMaterials,
            'success' => $this->getQuery('success'),
            'error' => $this->getQuery('error')
        ]);
    }

    public function show(int $id): void
    {
        $this->requireAuth();

        $product = $this->productModel->findWithCategory($id);

        if (!$product || (!$product['is_available'] && !$this->isAdmin())) {
            $this->redirect('/catalog?error=product_not_found');
            return;
        }

        $similarProducts = $this->productModel->getSimilar(
            $id,
            $product['category_id']
        );

        // Load reviews
        $reviews = $this->reviewModel->getByProduct($id, true);
        
        // Check if current user has already reviewed
        $user = $this->getCurrentUser();
        $userReview = null;
        if ($user && !$this->isAdmin()) {
            $userReview = $this->reviewModel->getByUser($user['id'], $id);
        }

        $this->view('products/show', [
            'product' => $product,
            'similarProducts' => $similarProducts,
            'reviews' => $reviews,
            'userReview' => $userReview,
            'user' => $user,
            'isLoggedIn' => true,
            'isAdmin' => $this->isAdmin()
        ]);
    }
}
