/home2/mshostin/carnival.ms-hostingladz.com/app/Services/ProductService.php
<?php
// 
// namespace App\Services;
// 
// use App\Models\Product;
// use App\Models\ProductVariant;
// use App\Models\ProductVariantImage;
// use App\Models\ProductMedia;
// use Illuminate\Support\Str;
// use App\Traits\ImageTrait;
// use App\Traits\MultipleImageTrait;
// 
// class ProductService
// {
// use ImageTrait, MultipleImageTrait;
// 
// public function createProduct(array $data)
// {
// $productData = $this->prepareProductData($data);
// 
// $product = Product::create($productData);
// 
// if (isset($data['media'])) {
// foreach ($data['media'] as $mediaImage) {
// $mediaImagePath = $this->uploadImage($mediaImage, 'product_media');
// 
// ProductMedia::create([
// 'product_id' => $product->id,
// 'image' => $mediaImagePath,
// ]);
// }
// }
// 
// if (isset($data['variant_id'])) {
// foreach ($data['variant_id'] as $index => $variantId) {
// $type = $data['type'][$index] . '-' . $index;
// $productVariant = ProductVariant::create([
// 'product_id' => $product->id,
// 'variant_id' => $variantId,
// 'name' => $data['variant_name'][$index],
// 'price' => $data['variant_price'][$index],
// 'type' => $data['type'][$index],
// 'value' => isset($data['value'][$index]) ? $data['value'][$index] : 'default_value', // Adjust this default value as needed
// 'status' => 1
// ]);
// 
// if (isset($data['variant_images'])) {
// foreach ($data['variant_images'][$type] as $images) {
// $additionalImagePaths = $this->uploadImage($images, 'variant_images');
// ProductVariantImage::create([
// 'product_id' => $product->id,
// 'product_variant_id' => $productVariant->id,
// 'image' => $additionalImagePaths,
// ]);
// }
// }
// }
// }
// 
// return $product;
// }
// 
// public function updateProduct(Product $product, array $data)
// {
// $productData = $this->prepareProductData($data);
// 
// $product->update($productData);
// 
// 
// if (isset($data['media'])) {
// $existingMedia = ProductMedia::where('product_id', $product->id)->get();
// foreach ($existingMedia as $media) {
// $this->deleteImage('product_media/' . $media->image);
// $media->delete();
// }
// 
// foreach ($data['media'] as $mediaImage) {
// $mediaImagePath = $this->uploadImage($mediaImage, 'product_media');
// 
// ProductMedia::create([
// 'product_id' => $product->id,
// 'image' => $mediaImagePath,
// ]);
// }
// }
// 
// if (isset($data['variant_id'])) {
// $product->variants()->detach();
// 
// foreach ($data['variant_id'] as $index => $variantId) {
// $product->variants()->attach($variantId, [
// 'value' => $data['value'][$index] ?? null,
// 'status' => 1,
// 'name' => $data['variant_name'][$index] ?? null,
// 'type' => $data['type'][$index] ?? null,
// 'price' => $data['variant_price'][$index] ?? 0,
// ]);
// 
// if (isset($data['variant_images'][$index])) {
// $additionalImagePaths = $this->uploadMultipleImages($data['variant_images'], 'variant_images');
// 
// foreach ($additionalImagePaths as $additionalImage) {
// ProductVariantImage::create([
// 'product_id' => $product->id,
// 'product_variant_id' => $variantId,
// 'image' => $additionalImage['original_name'],
// ]);
// }
// }
// }
// }
// 
// return $product;
// }
// 
// protected function prepareProductData(array $data)
// {
// $productData = [
// 'title' => $data['title'],
// 'category_id' => $data['category_id'],
// 'subcategory_id' => $data['subcategory_id'],
// 'description' => $data['description'],
// 'old_price' => $data['old_price'],
// 'new_price' => $data['new_price'],
// 'sale' => $data['sale'],
// 'condition' => $data['condition'] ?? null,
// 'stock_condition' => $data['stock_condition'] ?? null,
// 'discount' => $data['discount'] ?? null,
// 'tags' => implode(',', $data['tags'] ?? []),
// 'slug' => $this->generateUniqueSlug($data['title']),
// 'user_id' => auth()->id(),
// 'facebook' => $data['facebook'] ?? null,
// 'instagram' => $data['instagram'] ?? null,
// 'youtube' => $data['youtube'] ?? null,
// 'twitter' => $data['twitter'] ?? null,
// 'tiktok' => $data['tiktok'] ?? null,
// 'pinterest' => $data['pinterest'] ?? null,
// 'linkedin' => $data['linkedin'] ?? null,
// 'information' => $data['information'] ?? null,
// 'reviews' => $data['reviews'] ?? null,
// 'extra' => $data['extra'] ?? null,
// 'guarantee' => $data['guarantee'] ?? null,
// 'image' => $data['image'] ?? null,
// 'brand_id' => $data['brand_id'] ?? null,
// 'feature' => isset($data['feature']) ? 1 : 0,
// 'women' => isset($data['women']) ? 1 : 0,
// 'men' => isset($data['men']) ? 1 : 0,
// 'kids' => isset($data['kids']) ? 1 : 0,
// 'accessories' => isset($data['accessories']) ? 1 : 0,
// ];
// 
// return $productData;
// }
// 
// protected function generateUniqueSlug($title)
// {
// $slug = Str::slug($title);
// $uniqueSlug = $slug;
// $counter = 1;
// while (Product::where('slug', $uniqueSlug)->exists()) {
// $uniqueSlug = $slug . '-' . $counter++;
// }
// return $uniqueSlug;
// }
// 
// protected function uploadVariantImages($images)
// {
// $imagePaths = [];
// 
// foreach ($images as $image) {
// $path = $image->store('variant_images');
// $imagePaths[] = $path;
// }
// 
// return $imagePaths;
// }
// }


namespace App\Services;

use App\Models\Product;
use App\Models\ProductVariant;
use App\Models\ProductVariantImage;
use App\Models\ProductMedia;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\DB;
use App\Traits\ImageTrait;
use App\Traits\MultipleImageTrait;

class ProductService
{
    use ImageTrait, MultipleImageTrait;

    public function createProduct(array $data)
    {
        DB::beginTransaction();
        try {
            $productData = $this->prepareProductData($data);
            $product = Product::create($productData);

            // Handle media images
            if (isset($data['media'])) {
                foreach ($data['media'] as $mediaImage) {
                    $mediaImagePath = $this->uploadImage($mediaImage, 'product_media');
                    ProductMedia::create([
                        'product_id' => $product->id,
                        'image' => $mediaImagePath,
                    ]);
                }
            }

            // Handle variants and variant images
            if (isset($data['variant_id'])) {
                foreach ($data['variant_id'] as $index => $variantId) {
                    $productVariant = ProductVariant::create([
                        'product_id' => $product->id,
                        'variant_id' => $variantId,
                        'name' => $data['variant_name'][$index],
                        'price' => $data['variant_price'][$index],
                        'type' => $data['type'][$index],
                        'value' => $data['value'][$index] ?? 'default_value',
                        'status' => 1
                    ]);

                    if (isset($data['variant_images'][$index])) {
                        foreach ($data['variant_images'][$index] as $image) {
                            $imagePath = $this->uploadImage($image, 'variant_images');
                            ProductVariantImage::create([
                                'product_id' => $product->id,
                                'product_variant_id' => $productVariant->id,
                                'image' => $imagePath,
                            ]);
                        }
                    }
                }
            }

            DB::commit();
            return $product;
        } catch (\Exception $e) {
            DB::rollBack();
            throw $e;
        }
    }

    public function updateProduct(Product $product, array $data)
    {
        DB::beginTransaction();
        try {
            $productData = $this->prepareProductData($data, $product);
            $product->update($productData);

            // Handle media update
            if (isset($data['media'])) {
                $existingMedia = ProductMedia::where('product_id', $product->id)->get();
                foreach ($existingMedia as $media) {
                    $this->deleteImage('product_media/' . $media->image);
                    $media->delete();
                }

                foreach ($data['media'] as $mediaImage) {
                    $mediaImagePath = $this->uploadImage($mediaImage, 'product_media');
                    ProductMedia::create([
                        'product_id' => $product->id,
                        'image' => $mediaImagePath,
                    ]);
                }
            }

            // Handle variants update
            if (isset($data['variant_id'])) {
                // Delete old variants and images
                $oldVariants = ProductVariant::where('product_id', $product->id)->get();
                foreach ($oldVariants as $variant) {
                    $variantImages = ProductVariantImage::where('product_variant_id', $variant->id)->get();
                    foreach ($variantImages as $variantImage) {
                        $this->deleteImage('variant_images/' . $variantImage->image);
                        $variantImage->delete();
                    }
                    $variant->delete();
                }

                // Create new variants
                foreach ($data['variant_id'] as $index => $variantId) {
                    $productVariant = ProductVariant::create([
                        'product_id' => $product->id,
                        'variant_id' => $variantId,
                        'name' => $data['variant_name'][$index] ?? null,
                        'price' => $data['variant_price'][$index] ?? 0,
                        'type' => $data['type'][$index] ?? null,
                        'value' => $data['value'][$index] ?? null,
                        'status' => 1
                    ]);

                    if (isset($data['variant_images'][$index])) {
                        foreach ($data['variant_images'][$index] as $image) {
                            $imagePath = $this->uploadImage($image, 'variant_images');
                            ProductVariantImage::create([
                                'product_id' => $product->id,
                                'product_variant_id' => $productVariant->id,
                                'image' => $imagePath,
                            ]);
                        }
                    }
                }
            }

            DB::commit();
            return $product;
        } catch (\Exception $e) {
            DB::rollBack();
            throw $e;
        }
    }

    protected function prepareProductData(array $data, ?Product $product = null)
    {
        $userId = $product?->user_id ?? ($data['user_id'] ?? auth()->id());

        return [
            'title' => $data['title'],
            'category_id' => $data['category_id'],
            'subcategory_id' => $data['subcategory_id'],
            'description' => $data['description'],
            'old_price' => $data['old_price'],
            'new_price' => $data['new_price'],
            'sale' => $data['sale'],
            'condition' => $data['condition'] ?? null,
            'stock_condition' => $data['stock_condition'] ?? null,
            'discount' => $data['discount'] ?? null,
            'tags' => implode(',', $data['tags'] ?? []),
            'slug' => $this->generateUniqueSlug($data['title']),
            'user_id' => $userId,
            'facebook' => $data['facebook'] ?? null,
            'instagram' => $data['instagram'] ?? null,
            'youtube' => $data['youtube'] ?? null,
            'twitter' => $data['twitter'] ?? null,
            'tiktok' => $data['tiktok'] ?? null,
            'pinterest' => $data['pinterest'] ?? null,
            'linkedin' => $data['linkedin'] ?? null,
            'information' => $data['information'] ?? null,
            'reviews' => $data['reviews'] ?? null,
            'extra' => $data['extra'] ?? null,
            'guarantee' => $data['guarantee'] ?? null,
            'image' => $data['image'] ?? null,
            'brand_id' => $data['brand_id'] ?? null,
            'feature' => isset($data['feature']) ? 1 : 0,
            'women' => isset($data['women']) ? 1 : 0,
            'men' => isset($data['men']) ? 1 : 0,
            'kids' => isset($data['kids']) ? 1 : 0,
            'accessories' => isset($data['accessories']) ? 1 : 0,
        ];
    }

    protected function generateUniqueSlug($title)
    {
        $slug = Str::slug($title);
        $uniqueSlug = $slug;
        $counter = 1;
        while (Product::where('slug', $uniqueSlug)->exists()) {
            $uniqueSlug = $slug . '-' . $counter++;
        }
        return $uniqueSlug;
    }
}