<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $fillable = [
        'category_id', 'seller_id', 'name', 'slug', 'description', 'short_description',
        'price', 'compare_price', 'cost_price', 'stock', 'quantity', 'sku', 'barcode',
        'weight', 'brand', 'images', 'image', 'thumbnail', 'is_active', 'is_featured', 'is_digital',
        'is_subscription_product', 'is_monthly_purchase', 'is_mlm_eligible', 'mlm_commission_rate',
        'meta_title', 'meta_description', 'tags', 'attributes', 'views_count', 'sales_count',
        'rating', 'reviews_count', 'low_stock_threshold', 'characteristics', 'visibility',
        'is_approved', 'approval_status'
    ];

    protected $casts = [
        'is_active' => 'boolean',
        'is_featured' => 'boolean',
        'is_digital' => 'boolean',
        'is_subscription_product' => 'boolean',
        'is_monthly_purchase' => 'boolean',
        'is_mlm_eligible' => 'boolean',
        'price' => 'decimal:2',
        'compare_price' => 'decimal:2',
        'cost_price' => 'decimal:2',
        'weight' => 'decimal:2',
        'mlm_commission_rate' => 'decimal:2',
        'rating' => 'decimal:2',
        'images' => 'array',
        'tags' => 'array',
        'attributes' => 'array'
    ];

    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    public function seller()
    {
        return $this->belongsTo(Seller::class, 'seller_id');
    }

    /**
     * Relation directe avec l'utilisateur via le seller
     */
    public function sellerUser()
    {
        return $this->hasOneThrough(User::class, Seller::class, 'id', 'id', 'seller_id', 'user_id');
    }

    public function orderItems()
    {
        return $this->hasMany(OrderItem::class);
    }

    public function reviews()
    {
        return $this->hasMany(Review::class);
    }

    /**
     * Relation avec les images du produit (nouvelle table product_images)
     */
    public function productImages()
    {
        return $this->hasMany(ProductImage::class)->orderBy('display_order');
    }

    /**
     * Récupérer l'image principale depuis la table product_images
     */
    public function primaryImage()
    {
        return $this->hasOne(ProductImage::class)->where('is_primary', true);
    }

    /**
     * Accesseur pour récupérer l'image du produit
     * Priorité: image principale de product_images > colonne image > première image de images[]
     */
    public function getImageAttribute()
    {
        // D'abord vérifier la colonne 'image' directement
        $image = $this->attributes['image'] ?? null;
        if ($image && !empty($image)) {
            return $image;
        }
        
        // Sinon, essayer le tableau 'images'
        $images = $this->attributes['images'] ?? null;
        
        if ($images) {
            // Si c'est déjà un tableau
            if (is_array($images) && count($images) > 0) {
                return $images[0];
            }
            
            // Si c'est une chaîne JSON
            if (is_string($images)) {
                $decoded = json_decode($images, true);
                if (is_array($decoded) && count($decoded) > 0) {
                    return $decoded[0];
                }
            }
        }
        
        return null;
    }

    /**
     * Accesseur pour l'URL complète de l'image
     * Gère automatiquement les chemins storage
     */
    public function getImageUrlAttribute()
    {
        $image = $this->image;
        
        if (!$image) {
            return asset('images/no-product.svg'); // Image par défaut
        }

        // Si le chemin contient déjà 'storage/', l'utiliser tel quel
        if (strpos($image, 'storage/') !== false) {
            return asset($image);
        }

        // Si c'est juste un nom de fichier, ajouter le chemin complet
        if (strpos($image, '/') === false) {
            return asset('storage/products/' . $image);
        }

        // Sinon, ajouter 'storage/' au début
        return asset('storage/' . $image);
    }

    /**
     * Accesseur pour toutes les images du produit
     * Retourne un tableau d'URLs complètes
     */
    public function getImageUrlsAttribute()
    {
        $images = $this->images;
        
        if (!$images || !is_array($images)) {
            return [$this->image_url];
        }

        return array_map(function($image) {
            if (strpos($image, 'storage/') !== false) {
                return asset($image);
            }
            return asset('storage/' . $image);
        }, $images);
    }
}

