import { TimezoneRepository } from '../models/repositories/TimezoneRepository';
import { AppError } from '../utils/AppError';
import { isValidTimezone } from '../utils/timezone';

export class TimezoneService {
  constructor(private timezoneRepo = new TimezoneRepository()) {}

  async listGrouped() {
    const timezones = await this.timezoneRepo.findAllActive();
    const groups = new Map<string, typeof timezones>();

    for (const tz of timezones) {
      const list = groups.get(tz.region) ?? [];
      list.push(tz);
      groups.set(tz.region, list);
    }

    return {
      data: timezones.map((tz) => ({
        ianaId: tz.ianaId,
        label: tz.label,
        region: tz.region,
      })),
      groups: Array.from(groups.entries()).map(([region, items]) => ({
        region,
        timezones: items.map((tz) => ({
          ianaId: tz.ianaId,
          label: tz.label,
        })),
      })),
    };
  }

  async assertActiveTimezone(ianaId: string): Promise<void> {
    if (!isValidTimezone(ianaId)) {
      throw new AppError('validation_error', 400, 'Invalid timezone.');
    }
    const tz = await this.timezoneRepo.findActiveByIanaId(ianaId);
    if (!tz) {
      throw new AppError('validation_error', 400, 'Timezone is not supported.');
    }
  }
}
