const bcrypt = require('bcryptjs');
const JwtService = require('../../services/JwtService');

const jwtService = new JwtService();

/**
 * Login User Command Handler
 * Handles user login authentication
 */
class LoginUserCommandHandler {
  constructor(prisma) {
    this.prisma = prisma;
  }

  /**
   * Execute login command
   * @param {LoginUserCommand} command 
   * @returns {Promise<Object>} { user, token }
   */
  async handle(command) {
    const { email, password } = command;

    // Validáció
    if (!email || !password) {
      throw new Error('Email and password are required');
    }

    // User keresése email alapján
    const user = await this.prisma.user.findUnique({
      where: { email }
    });

    if (!user) {
      throw new Error('Invalid email or password');
    }

    // Jelszó ellenőrzése
    const isPasswordValid = await bcrypt.compare(password, user.password);

    if (!isPasswordValid) {
      throw new Error('Invalid email or password');
    }

    // JWT token generálása
    const token = jwtService.generateToken({
      userId: user.id,
      email: user.email
    });

    // Jelszót ne adjuk vissza
    const { password: _, ...userWithoutPassword } = user;

    return {
      user: userWithoutPassword,
      token
    };
  }
}

module.exports = LoginUserCommandHandler;
