<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Illuminate\Database\Eloquent\SoftDeletes;

class Artigo extends Model
{
    use HasFactory, SoftDeletes;

    protected $fillable = [
        'user_id',
        'departamento_id',
        'categoria_id',
        'subcategoria_id',
        'titulo',
        'slug',
        'conteudo',
        'status',
        'restrito',
    ];

    protected $casts = [
        'restrito' => 'boolean',
    ];

    public function autor(): BelongsTo
    {
        return $this->belongsTo(User::class, 'user_id');
    }

    public function departamento(): BelongsTo
    {
        return $this->belongsTo(Departamento::class);
    }

    public function categoria(): BelongsTo
    {
        return $this->belongsTo(Categoria::class);
    }

    public function subcategoria(): BelongsTo
    {
        return $this->belongsTo(Subcategoria::class);
    }

    public function anexos(): HasMany
    {
        return $this->hasMany(ArtigoAnexo::class);
    }

    public function versoes(): HasMany
    {
        return $this->hasMany(ArticleVersion::class);
    }

    public function comentarios(): MorphMany
    {
        return $this->morphMany(Comentario::class, 'comentavel')->latest();
    }

    public function favoritos(): MorphMany
    {
        return $this->morphMany(Favorito::class, 'favoritavel');
    }

    public function visualizacoes(): HasMany
    {
        return $this->hasMany(ArtigoVisualizacao::class);
    }

    public function votos(): HasMany
    {
        return $this->hasMany(ArtigoVoto::class);
    }

    public function votoDoUsuario(?int $userId = null): ?ArtigoVoto
    {
        $userId ??= auth()->id();

        if (! $userId) {
            return null;
        }

        return $this->votos->firstWhere('user_id', $userId)
            ?? $this->votos()->where('user_id', $userId)->first();
    }

    public function getPontuacaoUtilidadeAttribute(): int
    {
        if (array_key_exists('votos_sum_valor', $this->attributes)) {
            return (int) $this->attributes['votos_sum_valor'];
        }

        return (int) $this->votos()->sum('valor');
    }
}
