<?php

namespace App\Http\Controllers;

use App\Models\Review;
use App\Models\Product;
use App\Models\Penjualan;
use App\Models\DetailPenjualan;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class ReviewController extends Controller
{
    // Method untuk mendapatkan produk yang bisa direview
    public function getProductsForReview($penjualanId)
    {
        try {
            // Ambil data penjualan dengan status delivered ATAU shipped
            $penjualan = Penjualan::with(['detailPenjualan.produk'])
                ->where('penjualan_id', $penjualanId)
                ->where('user_id', Auth::id())
                ->whereIn('status', ['delivered', 'shipped'])
                ->first();

            if (!$penjualan) {
                // Cek apakah pesanan ada tapi statusnya bukan
                $penjualanCek = Penjualan::where('penjualan_id', $penjualanId)
                    ->where('user_id', Auth::id())
                    ->first();
                    
                if ($penjualanCek) {
                    return response()->json([
                        'success' => false,
                        'message' => 'Pesanan dengan status "' . $penjualanCek->status . '" belum bisa diulas. Ulasan hanya bisa diberikan setelah pesanan dikirim atau selesai.'
                    ]);
                }
                
                return response()->json([
                    'success' => false,
                    'message' => 'Pesanan tidak ditemukan atau bukan milik Anda.'
                ]);
            }

            $products = [];
            foreach ($penjualan->detailPenjualan as $detail) {
                // Cek apakah sudah ada review
                $existingReview = Review::where('produk_id', $detail->produk_id)
                    ->where('user_id', Auth::id())
                    ->where('penjualan_id', $penjualanId)
                    ->first();

                $products[] = [
                    'produk_id' => $detail->produk->produk_id,
                    'nama_produk' => $detail->produk->nama_produk,
                    'harga' => $detail->harga_satuan,
                    'has_review' => !is_null($existingReview),
                    'review' => $existingReview ? [
                        'review_id' => $existingReview->review_id,
                        'rating' => $existingReview->rating,
                        'komentar' => $existingReview->komentar
                    ] : null
                ];
            }

            if (count($products) == 0) {
                return response()->json([
                    'success' => false,
                    'message' => 'Tidak ada produk dalam pesanan ini.'
                ]);
            }

            return response()->json([
                'success' => true,
                'products' => $products
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Gagal memuat produk: ' . $e->getMessage()
            ]);
        }
    }
    
    // Store review
    public function store(Request $request)
    {
        try {
            $request->validate([
                'produk_id' => 'required|exists:product,produk_id',
                'penjualan_id' => 'required|exists:penjualan,penjualan_id',
                'rating' => 'required|integer|min:1|max:5',
                'komentar' => 'nullable|string|max:500'
            ]);
            
            // Cek apakah user sudah pernah review produk ini dalam transaksi ini
            $existingReview = Review::where('produk_id', $request->produk_id)
                ->where('user_id', Auth::id())
                ->where('penjualan_id', $request->penjualan_id)
                ->first();
                
            if ($existingReview) {
                return response()->json([
                    'success' => false,
                    'message' => 'Anda sudah memberikan ulasan untuk produk ini.'
                ]);
            }
            
            // Cek apakah produk ini benar ada dalam transaksi dan status delivered/shipped
            $penjualan = Penjualan::where('penjualan_id', $request->penjualan_id)
                ->where('user_id', Auth::id())
                ->whereIn('status', ['delivered', 'shipped'])
                ->first();
                
            if (!$penjualan) {
                return response()->json([
                    'success' => false,
                    'message' => 'Transaksi tidak ditemukan atau belum bisa diulas.'
                ]);
            }
            
            $detail = DetailPenjualan::where('penjualan_id', $request->penjualan_id)
                ->where('produk_id', $request->produk_id)
                ->first();
                
            if (!$detail) {
                return response()->json([
                    'success' => false,
                    'message' => 'Produk tidak ditemukan dalam transaksi ini.'
                ]);
            }
            
            // Buat review
            $review = Review::create([
                'produk_id' => $request->produk_id,
                'user_id' => Auth::id(),
                'penjualan_id' => $request->penjualan_id,
                'rating' => $request->rating,
                'komentar' => $request->komentar
            ]);
            
            return response()->json([
                'success' => true,
                'message' => 'Terima kasih atas ulasan Anda!',
                'review' => $review
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Gagal menyimpan ulasan: ' . $e->getMessage()
            ]);
        }
    }
    
    // Update review
    public function update(Request $request, $id)
    {
        try {
            $review = Review::findOrFail($id);
            
            // Cek kepemilikan review
            if ($review->user_id != Auth::id()) {
                return response()->json([
                    'success' => false,
                    'message' => 'Anda tidak memiliki akses untuk mengubah ulasan ini.'
                ]);
            }
            
            $request->validate([
                'rating' => 'required|integer|min:1|max:5',
                'komentar' => 'nullable|string|max:500'
            ]);
            
            $review->update([
                'rating' => $request->rating,
                'komentar' => $request->komentar
            ]);
            
            return response()->json([
                'success' => true,
                'message' => 'Ulasan berhasil diperbarui!',
                'review' => $review
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Gagal memperbarui ulasan: ' . $e->getMessage()
            ]);
        }
    }
    
    // Delete review
    public function destroy($id)
    {
        try {
            $review = Review::findOrFail($id);
            
            // Cek kepemilikan review
            if ($review->user_id != Auth::id() && Auth::user()->role != 'admin') {
                return response()->json([
                    'success' => false,
                    'message' => 'Anda tidak memiliki akses untuk menghapus ulasan ini.'
                ]);
            }
            
            $review->delete();
            
            return response()->json([
                'success' => true,
                'message' => 'Ulasan berhasil dihapus!'
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Gagal menghapus ulasan: ' . $e->getMessage()
            ]);
        }
    }
}