<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Category;
use App\Models\Sector;

class Video extends Model
{
    use HasFactory;
    protected $table = 'videos';
    
    // Campos que podem ser preenchidos
    protected $fillable = [
        'title',
        'description',
        'url',
        'thumbnail',
        'duration',
        'tags',
        'is_active',
        'order',
    ];

    // Ordem dos vídeos
    protected static function booted() {
        static::creating(function ($video) {
            if(!$video->order){
                $video->order = static::max('order') + 1;
            } else {
                // Se definiu uma ordem já ocupada, empurra os outros
                static::where('order', '>=', $video->order)
                    ->increment('order');
            }
        });

        static::updating(function ($video) {
            if ($video->isDirty('order')) { // ← só age se a ordem foi alterada
                $oldOrder = $video->getOriginal('order'); // ← ordem antiga
                $newOrder = $video->order;                // ← ordem nova

                // Se a ordem for menor que 1, define como 1
                if ($newOrder < 1) {
                    $video->order = 1;
                    $newOrder = 1;
                }
    
                if ($newOrder > $oldOrder) {
                    // Moveu para baixo — fecha o espaço antigo
                    static::where('order', '>', $oldOrder)
                        ->where('order', '<=', $newOrder)
                        ->decrement('order');
                } else {
                    // Moveu para cima — abre espaço na nova posição
                    static::where('order', '>=', $newOrder)
                        ->where('order', '<', $oldOrder)
                        ->increment('order');
                }
            }
        });
    }

    // Converte o campo is_active para boolean
    protected $casts = [
        'is_active' => 'boolean',
    ];

    // Um vídeo pode ter várias categorias
    public function categories()
    {
        return $this->belongsToMany(Category::class, 'video_category');
    }

    // Um vídeo pode ter várias visualizações
    public function views()
    {
        return $this->hasMany(VideoView::class);
    }

    // Verifica se um vídeo foi assistido por um utilizador
    public function isWatchedBy(User $user): bool
    {
        return $this->views()->where('user_id', $user->id)->exists();
    }

    public function sectors()
    {
        return $this->belongsToMany(Sector::class, 'video_sector');
    }
}
