using LambertzPortal.Data;
using Microsoft.EntityFrameworkCore;

namespace LambertzPortal.Services
{
    public class AuthService
    {
        private readonly LambertzDbContext _db;

        public AuthService(LambertzDbContext db)
        {
            _db = db;
        }

        public async Task<(bool ok, int userId, string userName, List<string> rechte)> ValidateAsync(string benutzername, string passwort)
        {
            benutzername = benutzername.Trim();

            var user = await _db.BlazorUser
                .Include(u => u.BenutzerBerechtigungen)
                    .ThenInclude(ub => ub.Berechtigung)
                .SingleOrDefaultAsync(u => u.Benutzername == benutzername && u.Aktiv);

            if (user is null)
            {
                Console.WriteLine($"[LOGIN] ❌ Benutzer '{benutzername}' nicht gefunden oder inaktiv");
                return (false, 0, "", new List<string>());
            }

            // Klartext-Vergleich (nur Test!)
            if (!string.Equals(user.PasswortHash, passwort, StringComparison.Ordinal))
            {
                Console.WriteLine($"[LOGIN] ❌ Passwort falsch für '{benutzername}'");
                return (false, 0, "", new List<string>());
            }

            // Rechte sammeln
            var rechte = user.BenutzerBerechtigungen
                .Select(x => x.Berechtigung.Name)
                .Where(x => !string.IsNullOrWhiteSpace(x))
                .Distinct()
                .ToList();

            Console.WriteLine($"[LOGIN] ✅ OK: {user.Benutzername} (ID {user.BenutzerId})");
            Console.WriteLine($"[LOGIN] ✅ Rechte: {string.Join(", ", rechte)}");

            // Optional: LetzterLogin speichern
            user.LetzterLogin = DateTime.Now;
            await _db.SaveChangesAsync();

            return (true, user.BenutzerId, user.Benutzername, rechte);
        }
    }
}
