<?php

declare(strict_types=1);

namespace App\Repositories;

use PDO;

class UsuarioRepository
{
    private PDO $db;

    public function __construct(PDO $db)
    {
        $this->db = $db;
    }

    public function buscarPorEmail(string $email): ?array
    {
        $stmt = $this->db->prepare('SELECT * FROM usuarios WHERE email = :email AND activo = 1');
        $stmt->execute(['email' => $email]);
        $usuario = $stmt->fetch();

        return $usuario ?: null;
    }

    public function buscarPorId(int $id): ?array
    {
        $stmt = $this->db->prepare('SELECT * FROM usuarios WHERE id = :id AND activo = 1');
        $stmt->execute(['id' => $id]);
        $usuario = $stmt->fetch();

        return $usuario ?: null;
    }

    public function listarPorRol(string $rol): array
    {
        $stmt = $this->db->prepare('SELECT id, nombre, email FROM usuarios WHERE rol = :rol AND activo = 1 ORDER BY nombre');
        $stmt->execute(['rol' => $rol]);

        return $stmt->fetchAll();
    }

    public function crear(string $nombre, string $email, string $passwordHash, string $rol): int
    {
        $stmt = $this->db->prepare(
            'INSERT INTO usuarios (nombre, email, password_hash, rol, activo, created_at)
             VALUES (:nombre, :email, :password_hash, :rol, 1, NOW())'
        );
        $stmt->execute([
            'nombre' => $nombre,
            'email' => $email,
            'password_hash' => $passwordHash,
            'rol' => $rol,
        ]);

        return (int) $this->db->lastInsertId();
    }

    public function guardarTokenPush(int $usuarioId, string $token, string $plataforma): void
    {
        $stmt = $this->db->prepare(
            'INSERT INTO notificaciones_push_tokens (usuario_id, token, plataforma, created_at)
             VALUES (:usuario_id, :token, :plataforma, NOW())
             ON DUPLICATE KEY UPDATE plataforma = VALUES(plataforma), updated_at = NOW()'
        );
        $stmt->execute(['usuario_id' => $usuarioId, 'token' => $token, 'plataforma' => $plataforma]);
    }

    public function obtenerTokensPush(int $usuarioId): array
    {
        $stmt = $this->db->prepare('SELECT token FROM notificaciones_push_tokens WHERE usuario_id = :usuario_id');
        $stmt->execute(['usuario_id' => $usuarioId]);

        return array_column($stmt->fetchAll(), 'token');
    }
}
