
import { SignupWithEmailUseCase } from '@core/identity/application/use-cases/SignupWithEmailUseCase';
import { CreateAchievementUseCase } from '@core/identity/application/use-cases/achievement/CreateAchievementUseCase';
import type { Logger } from '@core/shared/application/Logger';
import {
  DRIVER_ACHIEVEMENTS,
  STEWARD_ACHIEVEMENTS,
  ADMIN_ACHIEVEMENTS,
  COMMUNITY_ACHIEVEMENTS,
} from '@core/identity/domain/AchievementConstants';

export class EnsureInitialData {
  constructor(
    private readonly signupUseCase: SignupWithEmailUseCase,
    private readonly createAchievementUseCase: CreateAchievementUseCase,
    private readonly logger: Logger,
  ) {}

  async execute(): Promise<void> {
    // Ensure initial admin user exists
    try {
      await this.signupUseCase.execute({
        email: 'admin@gridpilot.local',
        password: 'admin123',
        displayName: 'Admin',
      });
      this.logger.info('[Bootstrap] Initial admin user created');
    } catch (error) {
      if (error instanceof Error && error.message === 'An account with this email already exists') {
        // User already exists, nothing to do
        this.logger.info('[Bootstrap] Admin user already exists');
      } else {
        // Re-throw other errors
        throw error;
      }
    }

    // Ensure initial achievements exist
    const allAchievements = [
      ...DRIVER_ACHIEVEMENTS,
      ...STEWARD_ACHIEVEMENTS,
      ...ADMIN_ACHIEVEMENTS,
      ...COMMUNITY_ACHIEVEMENTS,
    ];

    let createdCount = 0;
    let existingCount = 0;

    for (const achievementProps of allAchievements) {
      try {
        await this.createAchievementUseCase.execute(achievementProps);
        createdCount++;
      } catch {
        // If achievement already exists, that's fine
        existingCount++;
      }
    }

    this.logger.info(`[Bootstrap] Achievements: ${createdCount} created, ${existingCount} already exist`);
  }
}