<?php

namespace App\Policies;

use App\Models\ProductReview;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Auth\Access\Response;

class ProductReviewPolicy
{
    /**
     * Determine whether the user can view any models.
     */
    public function viewAny(?User $user): bool
    {
        // Anyone can view approved reviews
        return true;
    }

    /**
     * Determine whether the user can view the model.
     */
    public function view(?User $user, ProductReview $productReview): bool
    {
        // Anyone can view approved reviews
        if ($productReview->is_approved) {
            return true;
        }

        // Only author or admin can view pending reviews
        if (!$user) {
        return false;
        }

        return $productReview->isAuthor($user) || $user->isAdmin() || $user->isStaff();
    }

    /**
     * Determine whether the user can create models.
     */
    public function create(?User $user): bool
    {
        // Check if guest reviews are allowed
        if (!$user && config('reviews.allow_guest_reviews')) {
            return true;
        }

        // Must be authenticated if guest reviews are disabled
        return $user !== null;
    }

    /**
     * Determine whether the user can update the model.
     */
    public function update(?User $user, ProductReview $productReview): bool
    {
        if (!$user) {
            return false;
        }

        // Admin can always update
        if ($user->isAdmin() || $user->isStaff()) {
            return true;
        }

        // Check if user is the author
        if (!$productReview->isAuthor($user)) {
        return false;
        }

        // Check if within edit time limit
        $editTimeLimit = config('reviews.edit_time_limit_hours', 24);
        $timeLimit = $productReview->created_at->addHours($editTimeLimit);

        return now()->lte($timeLimit);
    }

    /**
     * Determine whether the user can delete the model.
     */
    public function delete(?User $user, ProductReview $productReview): bool
    {
        if (!$user) {
        return false;
        }

        // Admin can always delete
        if ($user->isAdmin() || $user->isStaff()) {
            return true;
        }

        // Author can delete their own review
        return $productReview->isAuthor($user);
    }

    /**
     * Determine whether the user can restore the model.
     */
    public function restore(User $user, ProductReview $productReview): bool
    {
        // Only admin can restore
        return $user->isAdmin() || $user->isStaff();
    }

    /**
     * Determine whether the user can permanently delete the model.
     */
    public function forceDelete(User $user, ProductReview $productReview): bool
    {
        // Only admin can permanently delete
        return $user->isAdmin();
    }
}
