<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\StoreRestockRequest;
use App\Http\Requests\Admin\StoreVariantRestockRequest;
use App\Models\Product;
use App\Models\StockMovement;
use App\Models\VariantStockMovement;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;
use Illuminate\Support\Facades\DB;

class RestockController extends Controller
{
    public function index(): View
    {
        $this->authorize('products.restock');
        $products = Product::with('stockMovements')
            ->where('product_type', 'single')
            ->orderBy('name')
            ->get();
        
        // Pre-calculate current stock for each product to avoid N+1 queries
        $products->each(function ($product) {
            $product->calculated_current_stock = $product->stockMovements->sum('quantity');
        });
        
        return view('admin.products.restock', compact('products'));
    }

    public function store(StoreRestockRequest $request): RedirectResponse
    {
        $data = $request->validated();

        try {
            DB::beginTransaction();

            $product = Product::findOrFail($data['product_id']);

            // Create stock movement
            StockMovement::create([
                'product_id' => $product->id,
                'type' => StockMovement::TYPE_RESTOCK,
                'quantity' => $data['quantity'],
                'notes' => $data['notes'] ?? null,
                'created_by' => auth()->id(),
            ]);

            // Recalculate stock
            $product->recalculateStock();
            
            // Get current stock directly from movements to avoid accessor query
            $currentStock = $product->stockMovements()->sum('quantity');

            DB::commit();

            return redirect()->route('admin.products.restock')
                ->with('success', "Stock restocked successfully! Current stock: {$currentStock}");
        } catch (\Exception $e) {
            DB::rollBack();
            
            return redirect()->route('admin.products.restock')
                ->with('error', 'Failed to restock: ' . $e->getMessage());
        }
    }

    /**
     * Restock a product variant (now a Product with parent_id)
     */
    public function storeVariant(StoreVariantRestockRequest $request, Product $variant): RedirectResponse
    {
        if (is_null($variant->parent_id)) {
            return redirect()->route('admin.products.index')
                ->with('error', 'This is not a variant product.');
        }
        
        $data = $request->validated();

        try {
            DB::beginTransaction();

            // Create stock movement (use VariantStockMovement for all products)
            VariantStockMovement::create([
                'product_id' => $variant->id,
                'type' => VariantStockMovement::TYPE_RESTOCK,
                'quantity' => $data['quantity'],
                'notes' => $data['notes'] ?? null,
                'created_by' => auth()->id(),
            ]);

            // Recalculate stock
            $variant->recalculateStock();
            
            // Refresh to get updated stock
            $variant->refresh();

            DB::commit();

            // Check if we should redirect back to products list (from main products page)
            if ($request->has('return_to_list') && $request->return_to_list == '1') {
                $redirectUrl = route('admin.products.index', ['type' => 'variant']);
                if ($request->has('search') && $request->search) {
                $redirectUrl .= '&search=' . urlencode($request->search);
                }
                return redirect($redirectUrl)
                    ->with('success', "Variant stock restocked successfully! Current stock: {$variant->current_stock}");
            }

            return redirect()->route('admin.products.variants.index', $variant->parent_id)
                ->with('success', "Variant stock restocked successfully! Current stock: {$variant->current_stock}");
        } catch (\Exception $e) {
            DB::rollBack();
            
            // Check if we should redirect back to products list (from main products page)
            if ($request->has('return_to_list') && $request->return_to_list == '1') {
                $redirectUrl = route('admin.products.index', ['type' => 'variant']);
                if ($request->has('search') && $request->search) {
                $redirectUrl .= '&search=' . urlencode($request->search);
                }
                return redirect($redirectUrl)
                    ->with('error', 'Failed to restock variant: ' . $e->getMessage());
            }
            
            return redirect()->route('admin.products.variants.index', $variant->parent_id)
                ->with('error', 'Failed to restock variant: ' . $e->getMessage());
        }
    }
}
