# Class Usuario

java.lang.Object
Modelo.Usuario

Direct Known Subclasses:
  `Administrador, Jugador`

public abstract class Usuario extends Object
Clase abstracta que representa un usuario del sistema.

Gestiona las credenciales de acceso almacenando la contraseña como hash SHA-256, nunca en texto plano. Las subclases concretas definen el tipo de usuario (normal, administrador, etc.) y amplían su comportamiento según el rol.

La validación de formato y unicidad del username se delega en `GestorUsuarios`, que tiene acceso al contexto necesario para realizarla.

Version:
  1.1
Author:
  Adrián

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected String`
  `passwordHash`
  Hash SHA-256 de la contraseña del usuario, en representación hexadecimal.
  `protected String`
  `username`
  Identificador único del usuario en el sistema.

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `Usuario(String username, String password)`
  Crea un nuevo usuario a partir de credenciales en texto plano.
  `Usuario(String username, String passwordHash, boolean yaEsHash)`
  Crea un usuario a partir de datos ya almacenados, típicamente al cargar desde fichero.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `String`
  `getUsername()`
  Devuelve el identificador único del usuario.
  `private static String`
  `hashear(String password)`
  Convierte una cadena de texto a su representación SHA-256 en hexadecimal.
  `abstract String`
  `toArchivo()`
  Serializa los datos del usuario en una línea de texto para su almacenamiento en fichero.
  `abstract String`
  `toString()`
  Devuelve una representación legible del usuario para mostrar en pantalla y en logs.
  `boolean`
  `verificarPassword(String introPassword)`
  Verifica si la contraseña proporcionada coincide con la almacenada.

  ### Methods inherited from class Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- ## Field Details

  - ### username

    protected String username
    Identificador único del usuario en el sistema.

  - ### passwordHash

    protected String passwordHash
    Hash SHA-256 de la contraseña del usuario, en representación hexadecimal.

- ## Constructor Details

  - ### Usuario

    public Usuario(String username, String password)
    Crea un nuevo usuario a partir de credenciales en texto plano. La contraseña se hashea con SHA-256 antes de almacenarse.
    Parameters:
      `username` - identificador único del usuario
      `password` - contraseña en texto plano; se convertirá a hash internamente

  - ### Usuario

    public Usuario(String username, String passwordHash, boolean yaEsHash)
    Crea un usuario a partir de datos ya almacenados, típicamente al cargar desde fichero.

    Usar `yaEsHash = true` cuando el segundo parámetro ya es un hash SHA-256 (por ejemplo, al reconstruir el objeto desde `usuarios.txt`). Usar `yaEsHash = false` si se pasa la contraseña en texto plano y debe hashearse.

    Parameters:
      `username` - identificador único del usuario
      `passwordHash` - contraseña en texto plano o hash SHA-256, según `yaEsHash`
      `yaEsHash` - `true` si el segundo parámetro ya es un hash SHA-256; `false` si es texto plano y debe hashearse

- ## Method Details

  - ### hashear

    private static String hashear(String password)
    Convierte una cadena de texto a su representación SHA-256 en hexadecimal.

    SHA-256 está garantizado en toda JVM estándar, por lo que `NoSuchAlgorithmException` no debería lanzarse nunca en la práctica.

    Parameters:
      `password` - texto a hashear
    Returns:
      cadena hexadecimal de 64 caracteres con el hash SHA-256
    Throws:
      `RuntimeException` - si SHA-256 no está disponible en la JVM

  - ### getUsername

    public String getUsername()
    Devuelve el identificador único del usuario.
    Returns:
      el username de este usuario

  - ### verificarPassword

    public boolean verificarPassword(String introPassword)
    Verifica si la contraseña proporcionada coincide con la almacenada.

    La comparación se realiza entre hashes SHA-256, nunca entre textos en claro.

    Parameters:
      `introPassword` - contraseña en texto plano introducida por el usuario
    Returns:
      `true` si la contraseña es correcta; `false` en caso contrario

  - ### toArchivo

    public abstract String toArchivo()
    Serializa los datos del usuario en una línea de texto para su almacenamiento en fichero.

    Formato base: `username;passwordHash;esAdmin`. Las subclases deben respetar el separador `;` y el orden de campos para garantizar compatibilidad con `PersistenciaArchivos`.

    Returns:
      cadena con los datos del usuario listos para escribir en `usuarios.txt`

  - ### toString

    public abstract String toString()
    Devuelve una representación legible del usuario para mostrar en pantalla y en logs. Cada subclase define el formato apropiado a su rol.
    Overrides:
      `toString` in class `Object`
    Returns:
      representación textual del usuario