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

namespace App\Http\Controllers;

use App\Models\Carnival;
use App\Models\CarnivalMascamps;
use Illuminate\Http\Request;
use App\Models\Product;
use App\Models\Category;
use App\Models\Variant;
use App\Models\Event;
use App\Models\Ticket;
use App\Models\Package;
use App\Models\Region;
use App\Models\Vendor;
use App\Models\User;
use App\Models\Role;
use Illuminate\Support\Facades\Auth;
use App\Services\ProductService;
use App\Services\EventService;

class VendorController extends Controller
{

    protected $productService, $eventService;

    public function __construct(ProductService $productService, EventService $eventService)
    {
        $this->productService = $productService;
        $this->eventService = $eventService;
    }

    public function index()
    {
        return view('dashboard.vendor.pages.user_management.index');
    }

    public function indexProduct()
    {
        $categories = Category::all();
        $variants = Variant::all();
        $products = Product::where('user_id', Auth::id())->get();
        return view('dashboard.vendor.products.index', compact('products', 'variants', 'categories'));
    }
    public function storeProduct(Request $request)
    {
        $request->validate([
            'title' => 'required',
            'category_id' => 'required',
            'description' => 'required',
            'old_price' => 'required',
            'new_price' => 'required',
            'status' => 'required',
            'variant_id' => 'required|array',
            'variant_id.*' => 'exists:variants,id',
        ]);

        $product = $this->productService->createProduct($request->all());

        if ($product) {
            $products = Product::where('user_id', Auth::id())->get();
            $view = view('dashboard.admin.products.table', compact('products'))->render();

            return response()->json(['message' => 'Product created successfully', 'table_html' => $view], 200);
        } else {
            return response()->json(['error' => 'Failed to create Product'], 500);
        }
    }
    public function editProduct($id)
    {
        $product = Product::with('category', 'variants')->findOrFail($id);
        $categories = Category::all();
        return response()->json(['product' => $product]);
    }

    public function updateProduct(Request $request, $id)
    {
        $request->validate([
            'title' => 'required',
            'category_id' => 'required',
            'description' => 'required',
            'old_price' => 'required',
            'new_price' => 'required',
            'status' => 'required',
            'variant_id' => 'required|array',
            'variant_id.*' => 'exists:variants,id',
        ]);

        $product = Product::findOrFail($id);
        $this->productService->updateProduct($product, $request->all());

        return redirect()->route('products.index')->with('success', 'Product updated successfully.');
    }

    public function indexEvent()
    {
        $packages = Package::all();
        $ticktes = Ticket::all();
        $packageId = Auth::user()->vendor->package->id;
        $categories = Category::with('package')->get();
        $events = Event::where('user_id', Auth::id())->get(['id', 'name', 'start_date', 'end_date']);
        return view('dashboard.vendor.events.index', compact('packages', 'categories', 'events', 'ticktes'));
    }

    public function storeEvent(Request $request)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'package_id' => 'required|exists:packages,id',
            'category_id' => 'required|exists:categories,id',
            'total_no_of_tickets' => 'required|integer|min:1',
            'venue' => 'required|string|max:255',
            'address' => 'required|string|max:255',
            'dress_code' => 'nullable|array',
            'dress_code.*' => 'nullable|string|max:255',
            'ticket_id' => 'required|array',
            'ticket_id.*' => 'exists:tickets,id',
            'description' => 'nullable|string',
            'eventType' => 'required|in:private,public',
            'start_date' => 'nullable|date',
            'start_time' => 'nullable',
            'end_date' => 'nullable|date|after_or_equal:start_date',
            'end_time' => 'nullable|after:start_time',
            'all_day' => 'nullable',
            'status' => 'required|in:active,inactive',
        ]);

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

        if ($request->has('all_day')) {
            $request['all_day'] = $request->all_day ? 1 : 0;

            $event = $this->eventService->createEvent($request->all());

            return response()->json(['success' => 'Event created successfully.', 'event' => $event]);
        }
    }

    public function editEvent(Event $event)
    {
        $packages = Package::all();
        $categories = Category::all();
        return view('dashboard.admin.events.edit', compact('event', 'packages', 'categories'));
    }

    public function updateEvent(Request $request, Event $event)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'package_id' => 'required|exists:packages,id',
            'category_id' => 'required|exists:categories,id',
            'description' => 'nullable|string',
            'status' => 'required|in:active,inactive',
        ]);

        $event = $this->eventService->updateEvent($event, $request->all());

        return redirect()->route('events.index')
            ->with('success', 'Event updated successfully.');
    }

    public function createSubvendor(Request $request, Event $event)
    {
        $continents = Region::all();
        $packages = Package::where('status', 1)->get();

        return view('dashboard.vendor.subvendor.create', compact('packages', 'continents'));
    }

    public function carnivalCommittee(Request $request, Event $event)
    {
        $carnivals = Carnival::where('head', auth()->user()->id)->get();
        // dd($carnivals->toArray());
        // $carnivals = Auth::user()->vendor->carnivals;

        return view('dashboard.vendor.pages.carnival_committee', compact('carnivals'));
    }

    public function myMasbands(Request $request, Event $event)
    {
        // $masbands = Auth::user()->vendor->subvendor;
        $carnivals = Carnival::where('head', auth()->user()->id)->pluck('id');
        $masbands = CarnivalMascamps::with('carnival', 'mascamp')->whereIn('carnival_id', $carnivals)->get();

        return view('dashboard.vendor.pages.my_masbands', compact('masbands'));
    }

    public function queenShow(Request $request, Event $event)
    {
        // $carnivals = Auth::user()->vendor->carnivals;
        // $mascamps = $carnivals->flatMap(function ($carnival) {
        //     return $carnival->mascamps;
        // });
        // $mascamps = $mascamps->unique('id');
        // $mascamps = $mascamps->filter(function ($mascamp) {
        //     return $mascamp->vendor_id !== Auth::user()->vendor->id;
        // });
        $carnivals = Carnival::where('head', auth()->user()->id)->pluck('id');
        $models = CarnivalMascamps::with('carnival', 'mascamp')->where('is_model',1)->whereIn('carnival_id', $carnivals)->get();

        return view('dashboard.vendor.pages.queen_show', compact('models'));
    }

    public function editProfile($id)
    {
        $continents = Region::all();
        $user = User::with('banners')->findOrFail($id);
        $roles = Role::where('status', 1)->get();
        $packages = Package::where('status', 1)->get();
        $vendors = Vendor::with('user')->where('status', 1)->get();

        $layout = match (Auth::user()->role->name) {
            // 'Admin' => 'dashboard.admin.layouts.app',
            'Vendor' => 'dashboard.vendor.layouts.app',
            'SubVendor' => 'dashboard.subvendor.layouts.app',
        };

        return view('dashboard.profile.edit', compact('user', 'roles', 'packages', 'vendors', 'continents', 'layout'));
    }
}