import { Repository } from 'typeorm';
import { AppDataSource } from '../index';
import { AvailabilitySchedule } from '../entities/AvailabilitySchedule.entity';
import { AvailabilityDateOverride } from '../entities/AvailabilityDateOverride.entity';

export class AvailabilityRepository {
  private scheduleRepo: Repository<AvailabilitySchedule>;
  private overrideRepo: Repository<AvailabilityDateOverride>;

  constructor() {
    this.scheduleRepo = AppDataSource.getRepository(AvailabilitySchedule);
    this.overrideRepo = AppDataSource.getRepository(AvailabilityDateOverride);
  }

  findByEventTypeId(eventTypeId: string): Promise<AvailabilitySchedule | null> {
    return this.scheduleRepo.findOne({
      where: { eventTypeId },
      relations: ['dateOverrides'],
    });
  }

  findByEventTypeIdForUser(userId: string, eventTypeId: string): Promise<AvailabilitySchedule | null> {
    return this.scheduleRepo.findOne({
      where: { userId, eventTypeId },
      relations: ['dateOverrides'],
    });
  }

  createSchedule(data: Partial<AvailabilitySchedule>): Promise<AvailabilitySchedule> {
    return this.scheduleRepo.save(this.scheduleRepo.create(data));
  }

  async saveSchedule(schedule: AvailabilitySchedule): Promise<AvailabilitySchedule> {
    return this.scheduleRepo.save(schedule);
  }

  async replaceOverrides(scheduleId: string, overrides: Partial<AvailabilityDateOverride>[]): Promise<void> {
    await this.overrideRepo.delete({ scheduleId });
    if (overrides.length > 0) {
      await this.overrideRepo.save(overrides.map((o) => this.overrideRepo.create(o)));
    }
  }
}
