<?php

namespace App\Models\Admin;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Str;
use Laravel\Sanctum\HasApiTokens;
use DateTimeInterface;

class Theme extends Model
{
    use HasApiTokens;
    use HasFactory;
    use Notifiable;

    protected $connection = 'mysql';

    public $incrementing = false;

    protected $keyType = 'string';

    protected $table = 'temas';

    const CREATED_AT = 'created_at';
    const UPDATED_AT = 'updated_at';

    /**
     * Logo padrão do sistema quando nenhuma logo personalizada é definida.
     */
    public const DEFAULT_LOGO = 'pmar/assets/img/logo-pmar.png';

    /**
     * Slug do tema Modo Noturno do sistema.
     */
    public const DARK_MODE_SLUG = 'modo-noturno';

    /**
     * Logo padrão para modo de acessibilidade (modo escuro).
     */
    public const DEFAULT_ACCESSIBILITY_LOGO = 'pmar/assets/img/logo-angra-branco.svg';

    /**
     * @var array<int, string>
     */
    protected $fillable = [
        'id',
        'created_at',
        'updated_at',
        'nome',
        'slug',
        'is_default',
        'is_active_public',
        'is_active_admin',
        'is_dark_mode',
        'colors',
        'default_colors',
        'logo',
        'accessibility_logo',
    ];

    /**
     * Accessor para 'name' que retorna 'nome' (compatibilidade)
     */
    public function getNameAttribute()
    {
        return $this->attributes['nome'] ?? null;
    }

    /**
     * Mutator para 'name' que atualiza 'nome' (compatibilidade)
     */
    public function setNameAttribute($value)
    {
        $this->attributes['nome'] = $value;
    }

    /**
     * Retorna a logo do tema ou a logo padrão caso não haja uma personalizada.
     *
     * @return string
     */
    public function getLogoUrlAttribute(): string
    {
        if (!empty($this->attributes['logo'])) {
            return asset($this->attributes['logo']);
        }

        return asset(self::DEFAULT_LOGO);
    }

    /**
     * Verifica se o tema possui uma logo personalizada.
     *
     * @return bool
     */
    public function hasCustomLogo(): bool
    {
        return !empty($this->attributes['logo']);
    }

    /**
     * Retorna a logo de acessibilidade do tema ou a logo padrão de acessibilidade.
     * Se não houver logo de acessibilidade personalizada, usa a logo normal do tema.
     * Se não houver logo normal, usa a logo padrão de acessibilidade.
     *
     * @return string
     */
    public function getAccessibilityLogoUrlAttribute(): string
    {
        // Se tem logo de acessibilidade personalizada, usa ela
        if (!empty($this->attributes['accessibility_logo'])) {
            return asset($this->attributes['accessibility_logo']);
        }

        // Se tem logo normal personalizada, usa ela
        if (!empty($this->attributes['logo'])) {
            return asset($this->attributes['logo']);
        }

        // Caso contrário, usa a logo padrão de acessibilidade (branca para modo escuro)
        return asset(self::DEFAULT_ACCESSIBILITY_LOGO);
    }

    /**
     * Verifica se o tema possui uma logo de acessibilidade personalizada.
     *
     * @return bool
     */
    public function hasCustomAccessibilityLogo(): bool
    {
        return !empty($this->attributes['accessibility_logo']);
    }

    /**
     * @var array<string, string>
     */
    protected $casts = [
        'is_default' => 'boolean',
        'is_active_public' => 'boolean',
        'is_active_admin' => 'boolean',
        'is_dark_mode' => 'boolean',
        'colors' => 'array',
        'default_colors' => 'array',
    ];

    /**
     * Verifica se este é o tema de modo noturno do sistema.
     *
     * @return bool
     */
    public function isDarkModeTheme(): bool
    {
        return $this->is_dark_mode === true || $this->slug === self::DARK_MODE_SLUG;
    }

    /**
     * Retorna o tema de modo noturno do sistema.
     *
     * @return Theme|null
     */
    public static function getDarkModeTheme(): ?Theme
    {
        return static::where('is_dark_mode', true)
            ->orWhere('slug', self::DARK_MODE_SLUG)
            ->first();
    }

    public static function boot(): void
    {
        parent::boot();

        static::creating(function (self $model): void {
            if (empty($model->id)) {
                $model->id = Str::uuid()->toString();
            }
        });
    }

    protected function serializeDate(DateTimeInterface $date): string
    {
        return $date->format('Y-m-d H:i:s');
    }
}


