import { EmailAddress } from '../../domain/value-objects/EmailAddress';
import { UserId } from '../../domain/value-objects/UserId';
import { User } from '../../domain/entities/User';
import { IAuthRepository } from '../../domain/repositories/IAuthRepository';
import { IPasswordHashingService } from '../../domain/services/PasswordHashingService';

/**
 * Application Use Case: SignupUseCase
 *
 * Handles user registration.
 */
export class SignupUseCase {
  constructor(
    private authRepo: IAuthRepository,
    private passwordService: IPasswordHashingService
  ) {}

  async execute(email: string, password: string, displayName: string): Promise<User> {
    const emailVO = EmailAddress.create(email);

    // Check if user already exists
    const existingUser = await this.authRepo.findByEmail(emailVO);
    if (existingUser) {
      throw new Error('User already exists');
    }

    const hashedPassword = await this.passwordService.hash(password);
    const passwordHash = await import('../../domain/value-objects/PasswordHash').then(m => m.PasswordHash.fromHash(hashedPassword));

    const userId = UserId.create();
    const user = User.create({
      id: userId,
      displayName,
      email: emailVO.value,
      passwordHash,
    });

    await this.authRepo.save(user);
    return user;
  }
}