/home2/mshostin/carnival.ms-hostingladz.com/app/Http/Controllers/CategoryController.php
<?php

namespace App\Http\Controllers;

use App\Models\Category;
use App\Models\Package;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class CategoryController extends Controller
{
    public function index()
    {
        $categories = Category::all();
        return view('dashboard.admin.categories.index', compact('categories'));
    }

    public function create()
    {
        $packages = Package::all();
        return view('dashboard.admin.categories.create', compact('packages'));
    }

    public function store(Request $request)
    {
        $request->validate([
            'package_id' => 'required',
            'type' => 'required|in:ecommerce,events,music,appointment,ad_space,blogging',
            'title' => 'required',
            'slug' => 'required',
            'description' => 'required',
            'status' => 'required',
        ]);

        $data = $request->all();

        if ($request->hasFile('icon')) {
            $iconPath = 'category_icon/' . time() . '.' . $request->icon->extension();
            $request->icon->move(public_path('category_icon'), $iconPath);
            $data['icon'] = $iconPath;
        }

        $data['user_id'] = Auth::id();

        Category::create($data);

        return redirect()->route('categories.index')->with('success', 'Category created successfully.');
    }

    public function show($id)
    {
        $category = Category::findOrFail($id);
        return view('dashboard.admin.categories.show', compact('category'));
    }

    public function getDeletionDetails($id)
    {
        try {
            $category = Category::findOrFail($id);
            $subcategories = $category->subcategories;
            
            $deletionDetails = [
                'category' => [
                    'id' => $category->id,
                    'title' => $category->title,
                    'type' => $category->type
                ],
                'subcategories_count' => $subcategories->count(),
                'products_count' => 0,
                'costumes_count' => 0,
                'product_variants_count' => 0,
                'product_images_count' => 0,
                'product_media_count' => 0,
                'cart_items_count' => 0,
                'order_items_count' => 0,
                'costume_variants_count' => 0,
                'costume_images_count' => 0,
                'total_items' => 0
            ];
            
            // Count all items in subcategories
            foreach ($subcategories as $subcategory) {
                $products = $subcategory->products;
                $costumes = $subcategory->costumes;
                
                $deletionDetails['products_count'] += $products->count();
                $deletionDetails['costumes_count'] += $costumes->count();
                
                // Count product-related items
                foreach ($products as $product) {
                    $deletionDetails['product_variants_count'] += $product->product_variant()->count();
                    $deletionDetails['product_images_count'] += $product->product_images()->count();
                    $deletionDetails['product_media_count'] += $product->media()->count();
                    $deletionDetails['cart_items_count'] += \App\Models\Cart::where('product_id', $product->id)->count();
                    $deletionDetails['order_items_count'] += \App\Models\OrderItem::where('product_id', $product->id)->count();
                }
                
                // Count costume-related items
                foreach ($costumes as $costume) {
                    $deletionDetails['costume_variants_count'] += \App\Models\CostumeVariant::where('costume_id', $costume->id)->count();
                    $deletionDetails['costume_images_count'] += \App\Models\CostumeVariantImage::where('costume_id', $costume->id)->count();
                }
            }
            
            // Calculate total items
            $deletionDetails['total_items'] = 
                $deletionDetails['subcategories_count'] + 
                $deletionDetails['products_count'] + 
                $deletionDetails['costumes_count'] + 
                $deletionDetails['product_variants_count'] + 
                $deletionDetails['product_images_count'] + 
                $deletionDetails['product_media_count'] + 
                $deletionDetails['cart_items_count'] + 
                $deletionDetails['order_items_count'] + 
                $deletionDetails['costume_variants_count'] + 
                $deletionDetails['costume_images_count'] + 
                1; // +1 for the category itself
            
            return response()->json($deletionDetails);
        } catch (\Exception $e) {
            return response()->json(['error' => 'Error getting deletion details: ' . $e->getMessage()], 500);
        }
    }

    public function edit($id)
    {
        $category = Category::findOrFail($id);
        $packages = Package::all();
        return view('dashboard.admin.categories.edit', compact('category', 'packages'));
    }

    public function update(Request $request, $id)
    {
        try {
            $validatedData = $request->validate([
                'package_id' => 'required',
                'title' => 'required|string|max:255',
                'type' => 'required|in:ecommerce,events,music,appointment,ad_space,blogging',
                'slug' => 'required|string|max:255|unique:categories,slug,' . $id,
                'description' => 'required|string',
                'status' => 'required|boolean',
                'icon' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
            ]);

            $category = Category::findOrFail($id);

            if ($request->hasFile('icon')) {
                $iconPath = 'category_icon/' . time() . '.' . $request->icon->extension();
                $request->icon->move(public_path('category_icon'), $iconPath);
                $validatedData['icon'] = $iconPath;
            }

            $category->update($validatedData);

            return redirect()->route('categories.index')->with('success', 'Category updated successfully.');
        } catch (Exception $ex) {
            return redirect()->back()->with('error', $ex->getMessage());
        }
    }

    public function destroy($id)
    {
        try {
            $category = Category::findOrFail($id);
            
            // Get all subcategories in this category
            $subcategories = $category->subcategories;
            
            // For each subcategory, handle all its dependencies
            foreach ($subcategories as $subcategory) {
                // Get all products and costumes in this subcategory
                $products = $subcategory->products;
                $costumes = $subcategory->costumes;
                
                // Delete all related data for each product
                foreach ($products as $product) {
                    // Delete product variants and their images
                    $product->product_variant()->delete();
                    $product->product_images()->delete();
                    
                    // Delete product media
                    $product->media()->delete();
                    
                    // Delete cart items for this product
                    \App\Models\Cart::where('product_id', $product->id)->delete();
                    
                    // Delete order items for this product
                    \App\Models\OrderItem::where('product_id', $product->id)->delete();
                    
                    // Delete product variant images
                    \App\Models\ProductVariantImage::where('product_id', $product->id)->delete();
                }
                
                // Delete all related data for each costume
                foreach ($costumes as $costume) {
                    // Delete costume variants
                    \App\Models\CostumeVariant::where('costume_id', $costume->id)->delete();
                    
                    // Delete costume variant images
                    \App\Models\CostumeVariantImage::where('costume_id', $costume->id)->delete();
                    
                    // Delete costume variant relationships
                    $costume->variants()->detach();
                }
                
                // Delete all products and costumes in this subcategory
                $subcategory->products()->delete();
                $subcategory->costumes()->delete();
            }
            
            // Delete all subcategories in this category
            $category->subcategories()->delete();
            
            // Then delete the category
            $category->delete();

            return redirect()->route('categories.index')->with('success', 'Category and all related items (subcategories, products, costumes, variants, images, cart items, order items) deleted successfully.');
        } catch (\Exception $e) {
            return redirect()->back()->with('error', 'Error deleting category: ' . $e->getMessage());
        }
    }
}