<?php

namespace App\Http\Controllers\Seller;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Order;
use App\Models\OrderItem;
use App\Models\Seller;
use App\Models\Setting;
use App\Services\SellerOrderService;
use Illuminate\Support\Facades\Log;

class OrderController extends Controller
{
    protected SellerOrderService $sellerOrderService;

    public function __construct()
    {
        $this->sellerOrderService = new SellerOrderService();
    }

    /**
     * Liste des commandes contenant des produits du seller
     */
    public function index(Request $request)
    {
        $seller = Seller::where('user_id', auth()->id())->first();
        
        if (!$seller) {
            return redirect()->route('seller.dashboard')->with('error', 'Profil vendeur non trouvé');
        }
        
        // Récupérer les commandes qui ont des items du seller
        $query = Order::whereHas('orderItems', function ($q) use ($seller) {
            $q->where('seller_id', $seller->id);
        })
        ->with(['user', 'orderItems' => function ($q) use ($seller) {
            $q->where('seller_id', $seller->id)->with('product');
        }]);
        
        // Filtres
        if ($request->status && $request->status !== 'all') {
            $query->where('status', $request->status);
        }
        
        if ($request->proof_status && $request->proof_status !== 'all') {
            $query->where('delivery_proof_status', $request->proof_status);
        }

        if ($request->payment_status && $request->payment_status !== 'all') {
            $query->where('payment_status', $request->payment_status);
        }

        if ($request->search) {
            $search = $request->search;
            $query->where(function ($q) use ($search) {
                $q->where('order_number', 'like', "%{$search}%")
                  ->orWhere('customer_name', 'like', "%{$search}%")
                  ->orWhere('customer_email', 'like', "%{$search}%");
            });
        }
        
        $orders = $query->orderBy('created_at', 'desc')->paginate(15)->withQueryString();
        
        // Statistiques
        $stats = $this->sellerOrderService->getSellerStats($seller);
        
        return view('seller.orders.index', compact('orders', 'seller', 'stats'));
    }

    /**
     * Détail d'une commande
     */
    public function show(Order $order)
    {
        $seller = Seller::where('user_id', auth()->id())->first();
        
        if (!$seller) {
            abort(403, 'Profil vendeur non trouvé');
        }

        // Vérifier que la commande contient des produits de ce seller
        $hasSellerItems = $order->orderItems()->where('seller_id', $seller->id)->exists();
        
        if (!$hasSellerItems) {
            abort(403, 'Cette commande ne contient pas vos produits');
        }
        
        // Charger uniquement les items du seller
        $order->load(['user', 'deliveryConfirmedBy']);
        $sellerItems = $order->orderItems()->where('seller_id', $seller->id)->with('product')->get();
        
        // Calculer le total des items du seller
        $sellerTotal = $sellerItems->sum('total_price');
        $sellerCommission = $sellerItems->sum('seller_commission');
        $sellerNetAmount = $sellerItems->sum('seller_amount');
        
        $delayZ = Setting::get('delivery_confirmation_delay', 7);
        
        return view('seller.orders.show', compact('order', 'seller', 'sellerItems', 'sellerTotal', 'sellerCommission', 'sellerNetAmount', 'delayZ'));
    }

    /**
     * Mettre à jour le statut d'une commande
     * IMPORTANT: Le statut ne peut PAS être rétrogradé pour éviter les fraudes
     */
    public function updateStatus(Request $request, Order $order)
    {
        $seller = Seller::where('user_id', auth()->id())->first();
        
        if (!$seller) {
            abort(403);
        }

        // Vérifier que la commande contient des produits de ce seller
        $hasSellerItems = $order->orderItems()->where('seller_id', $seller->id)->exists();
        
        if (!$hasSellerItems) {
            abort(403, 'Cette commande ne contient pas vos produits');
        }

        $request->validate([
            'status' => 'required|in:pending,processing,shipped,delivered,cancelled',
        ]);

        $newStatus = $request->status;
        $currentStatus = $order->status;

        // Définir l'ordre des statuts (du moins avancé au plus avancé)
        $statusOrder = [
            'pending' => 1,
            'processing' => 2,
            'shipped' => 3,
            'delivered' => 4,
            'cancelled' => 0  // Statut spécial
        ];

        $currentOrder = $statusOrder[$currentStatus] ?? 0;
        $newOrder = $statusOrder[$newStatus] ?? 0;

        // Empêcher la rétrogradation de statut
        if ($newOrder < $currentOrder && $newStatus !== 'cancelled') {
            return back()->with('error', 'Impossible de rétrograder le statut de la commande. Le statut ne peut qu\'avancer (pending → processing → shipped → delivered).');
        }

        // Empêcher de modifier une commande déjà livrée ou annulée
        if (in_array($currentStatus, ['delivered', 'cancelled'])) {
            return back()->with('error', 'Cette commande est en statut final (' . ucfirst($currentStatus) . ') et ne peut plus être modifiée.');
        }

        // Empêcher d'annuler une commande déjà livrée
        if ($newStatus === 'cancelled' && $currentStatus === 'delivered') {
            return back()->with('error', 'Impossible d\'annuler une commande déjà livrée.');
        }

        // Empêcher d'annuler une commande avec preuve de livraison approuvée
        if ($newStatus === 'cancelled' && $order->delivery_proof_status === 'approved') {
            return back()->with('error', 'Impossible d\'annuler une commande dont la preuve de livraison a été approuvée.');
        }

        $data = ['status' => $newStatus];
        
        if ($newStatus === 'shipped') {
            $data['shipped_at'] = now();
        } elseif ($newStatus === 'delivered') {
            $data['delivered_at'] = now();
        }

        $order->update($data);

        Log::info('Order status updated by seller', [
            'order_id' => $order->id,
            'seller_id' => $seller->id,
            'old_status' => $currentStatus,
            'new_status' => $newStatus
        ]);

        return back()->with('success', 'Statut de la commande mis à jour : ' . ucfirst($newStatus));
    }

    /**
     * Upload de la preuve de livraison
     */
    public function uploadDeliveryProof(Request $request, Order $order)
    {
        $seller = Seller::where('user_id', auth()->id())->first();
        
        if (!$seller) {
            abort(403);
        }

        // Vérifier que la commande contient des produits de ce seller
        $hasSellerItems = $order->orderItems()->where('seller_id', $seller->id)->exists();
        
        if (!$hasSellerItems) {
            abort(403, 'Cette commande ne contient pas vos produits');
        }

        $request->validate([
            'delivery_proof' => 'required|file|mimes:jpg,jpeg,png,pdf|max:10240',
            'notes' => 'nullable|string|max:500',
        ]);

        $path = $request->file('delivery_proof')->store('delivery_proofs/' . $order->id, 'public');

        $order->update([
            'delivery_proof' => $path,
            'delivery_proof_status' => 'submitted',
            'delivery_proof_notes' => $request->notes,
            'delivery_proof_submitted_at' => now(),
        ]);

        Log::info('Delivery proof uploaded by seller', [
            'order_id' => $order->id,
            'seller_id' => $seller->id,
            'proof_path' => $path
        ]);

        return back()->with('success', 'Preuve de livraison soumise avec succès. En attente de vérification par l\'admin.');
    }

    /**
     * Mise à jour en masse des statuts par le seller
     */
    public function bulkUpdateStatus(Request $request)
    {
        $seller = Seller::where('user_id', auth()->id())->first();
        
        if (!$seller) {
            return back()->with('error', 'Profil vendeur non trouvé');
        }

        $request->validate([
            'order_ids' => 'required|array',
            'order_ids.*' => 'exists:orders,id',
            'status' => 'required|in:pending,processing,shipped,delivered,cancelled'
        ]);

        $orderIds = $request->order_ids;
        
        // Vérifier que toutes les commandes appartiennent au seller
        $validOrderIds = Order::whereIn('id', $orderIds)
            ->whereHas('orderItems', function ($q) use ($seller) {
                $q->where('seller_id', $seller->id);
            })
            ->pluck('id')
            ->toArray();

        if (count($validOrderIds) !== count($orderIds)) {
            return back()->with('error', 'Certaines commandes ne vous appartiennent pas.');
        }

        $updateData = ['status' => $request->status];
        
        if ($request->status === 'shipped') {
            $updateData['shipped_at'] = now();
        } elseif ($request->status === 'delivered') {
            $updateData['delivered_at'] = now();
        }

        $count = Order::whereIn('id', $validOrderIds)->update($updateData);

        Log::info('Bulk order status updated by seller', [
            'seller_id' => $seller->id,
            'order_count' => $count,
            'new_status' => $request->status
        ]);

        return back()->with('success', "{$count} commande(s) mise(s) à jour avec succès !");
    }

    /**
     * Dashboard des ventes
     */
    public function dashboard()
    {
        $seller = Seller::where('user_id', auth()->id())->first();
        
        if (!$seller) {
            return redirect()->route('seller.dashboard')->with('error', 'Profil vendeur non trouvé');
        }

        $stats = $this->sellerOrderService->getSellerStats($seller);
        
        // Dernières commandes
        $recentOrders = Order::whereHas('orderItems', function ($q) use ($seller) {
            $q->where('seller_id', $seller->id);
        })
        ->with(['orderItems' => function ($q) use ($seller) {
            $q->where('seller_id', $seller->id)->with('product');
        }])
        ->orderBy('created_at', 'desc')
        ->limit(5)
        ->get();

        return view('seller.orders.dashboard', compact('seller', 'stats', 'recentOrders'));
    }
}
