<?php

namespace App\Http\Controllers;

use App\Models\Review;
use App\Models\Order;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;

class ReviewController extends Controller
{
    /**
     * Menampilkan daftar review.
     * Admin bisa melihat semua, Customer hanya miliknya sendiri.
     */
    public function index()
    {
        $user = Auth::user();

        if ($user->role === 'admin') {
            // Admin melihat semua review untuk moderasi
            $reviews = Review::with(['user', 'product'])->latest()->paginate(20);
        } else {
            // Customer HANYA melihat review yang pernah dia tulis sendiri
            // Ini mencegah User 2 mengintip riwayat review User 1
            $reviews = Review::where('user_id', $user->id)
                ->with('product')
                ->latest()
                ->paginate(10);
        }

        return view('reviews.index', compact('reviews'));
    }

    /**
     * Menyimpan ulasan produk baru.
     */
    public function store(Request $request, $productId)
    {
        // 1. Cek Login
        if (!Auth::check()) {
            return back()->with('error', 'Silakan login terlebih dahulu.');
        }

        // 2. Validasi Input
        $request->validate([
            'rating'   => 'required|integer|min:1|max:5',
            'review'   => 'nullable|string|max:1000',
            'photos'   => 'nullable|array|max:5',
            'photos.*' => 'image|mimes:jpeg,png,jpg|max:2048',
        ]);

        $userId = Auth::id();

        // 3. KEAMANAN: Cek apakah user benar-benar pernah membeli barang ini dan sudah sampai
        // Menggunakan status 'completed' atau 'delivered' sesuai sistem kamu
        $hasPurchased = Order::where('user_id', $userId)
            ->whereIn('status', ['delivered', 'completed']) 
            ->whereHas('items', function ($query) use ($productId) {
                $query->where('product_id', $productId);
            })->exists();

        if (!$hasPurchased) {
            return back()->with('error', 'Anda tidak bisa memberi ulasan untuk barang yang belum dibeli/diterima.');
        }

        // 4. KEAMANAN: Cegah Double Review (Satu produk satu ulasan per user)
        $alreadyReviewed = Review::where('user_id', $userId)
            ->where('product_id', $productId)
            ->exists();

        if ($alreadyReviewed) {
            return back()->with('error', 'Anda sudah memberikan ulasan untuk produk ini sebelumnya.');
        }

        // 5. PROSES UPLOAD FOTO (Folder Terisolasi per User)
        $photoPaths = [];
        if ($request->hasFile('photos')) {
            foreach ($request->file('photos') as $photo) {
                // Disimpan ke folder: storage/app/public/reviews/{user_id}/nama_file.jpg
                // Ini mencegah file tercampur atau gampang ditebak URL-nya secara massal
                $path = $photo->store('reviews/' . $userId, 'public');
                $photoPaths[] = $path;
            }
        }

        // 6. Simpan ke Database
        Review::create([
            'product_id' => $productId,
            'user_id'    => $userId,
            'rating'     => $request->rating,
            'comment'    => $request->review, 
            'photos'     => $photoPaths, 
            'approved'   => true, // Otomatis aktif, atau false jika butuh approve admin
        ]);

        return back()->with('success', 'Ulasan Anda berhasil dikirim! Terima kasih.');
    }

    /**
     * Menghapus review (Hanya pemilik atau Admin)
     */
    public function destroy(Review $review)
    {
        $user = Auth::user();

        // KEAMANAN: User 2 tidak bisa hapus review User 1 via URL
        if ($user->id !== $review->user_id && $user->role !== 'admin') {
            abort(403, 'Anda tidak diizinkan menghapus ulasan ini.');
        }

        // Hapus foto dari storage jika ada
        if (!empty($review->photos)) {
            foreach ($review->photos as $photo) {
                Storage::disk('public')->delete($photo);
            }
        }

        $review->delete();

        return back()->with('success', 'Ulasan berhasil dihapus.');
    }
}