<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Builder;
use App\Models\Admin\TipoUsuario;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Schema;
use App\Models\Admin\Sede;

class User extends Authenticatable
{
    /** @use HasFactory<\Database\Factories\UserFactory> */
    use HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var list<string>
     */
    protected $fillable = [
        'name',
        'id_sede',
        'email',
        'password',
        'username',
        'dni',
        'nombres',
        'apellido_paterno',
        'apellido_materno',
        'direccion',
        'telefono',
        'foto',
        'id_tipo_usuario',
        'estado',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var list<string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected function casts()
    {
        return [
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
        ];
    }

    public function tipoUsuario()
    {
        return $this->belongsTo(TipoUsuario::class, 'id_tipo_usuario');
    }

    public function sede()
    {
        return $this->belongsTo(Sede::class, 'id_sede');
    }
    /**
     * Nombre completo (util para sidebar y reportes).
     */
    public function getNombreCompletoAttribute()
    {
        $partes = array_filter([
            $this->nombres,
            $this->apellido_paterno,
            $this->apellido_materno,
        ]);

        return trim(implode(' ', $partes)) ?: (isset($this->name) ? $this->name : '');
    }

    /**
     * Regla para Super Administrador.
     *
     * NOTA: Tu proyecto usa el tipo "SUPER" (segun tu captura),
     * por eso aqui se contempla "SUPER" y variantes comunes.
     */
    public function isSuperAdmin()
    {
        $tipo = ($this->tipoUsuario && isset($this->tipoUsuario->tipo_usuario)) ? $this->tipoUsuario->tipo_usuario : null;
        if (!$tipo) {
            return false;
        }

        $tipo = mb_strtoupper(trim($tipo), 'UTF-8');
        $tipo = preg_replace('/\s+/', ' ', $tipo);

        // Valores comunes (ajusta segun tu negocio)
        if (in_array($tipo, [
            'SUPER',
            'SUPER ADMIN',
            'SUPER ADMINISTRADOR',
            'SUPERADMIN',
            'SUPERADMINISTRADOR',
            'SUPERUSUARIO',
        ], true)) {
            return true;
        }

        // Permite variantes tipo "SUPER ..."
        return (bool) preg_match('/^SUPER(\s|$)/', $tipo);
    }

    /**
     * Patrones de ruta permitidos (ej: admin.usuario.*)
     */
    public function allowedRoutePatterns()
    {
        // Si aun no migraste las tablas de menu, no bloquees.
        if (!Schema::hasTable('menus') || !Schema::hasTable('menu_tipo_usuario')) {
            return ['*'];
        }

        if ($this->isSuperAdmin()) {
            return ['*'];
        }

        // Carga relacion si no esta cargada
        if (!$this->relationLoaded('tipoUsuario')) {
            $this->load('tipoUsuario');
        }
        if ($this->tipoUsuario && !$this->tipoUsuario->relationLoaded('menus')) {
            $this->tipoUsuario->load('menus');
        }

        return $this->tipoUsuario
            ? $this->tipoUsuario->menus->pluck('route_pattern')->filter()->values()->all()
            : [];
    }

    /**
     * ¿Puede acceder a una ruta (por nombre de ruta)?
     */
    public function canAccessRoute(string $routeName)
    {
        if ($this->isSuperAdmin()) {
            return true;
        }

        foreach ($this->allowedRoutePatterns() as $pattern) {
            if (Str::is($pattern, $routeName)) {
                return true;
            }
        }
        return false;
    }

    /**
     * ¿Puede ver una opcion de menu (por route_pattern del menu)?
     *
     * IMPORTANTE: Se usa Str::is para soportar comodines (ej: '*'),
     * asi el menu no queda vacio si aun no migraste/sembraste.
     */
    public function canSeeMenu(string $routePattern)
    {
        if ($this->isSuperAdmin()) {
            return true;
        }

        foreach ($this->allowedRoutePatterns() as $pattern) {
            if (Str::is($pattern, $routePattern)) {
                return true;
            }
        }

        return false;
    }

    public function scopeNoEliminados(Builder $q)
    {
        return $q->where('estado', '!=', 'EL');
    }
}
