import { Zone } from '@prisma/client'
import ZoneRepository from '../repositories/zoneRepository'
import ZoneService from '../services/zoneService'
import logger from '../utilities/logger'
import LoadedZone from '../models/loadedZone'

class ZoneManager {
  private loadedZones: LoadedZone[] = []

  // Method to initialize zoneEditor manager
  public async boot() {
    if (!(await ZoneRepository.getById(1))) {
      const zoneService = new ZoneService()
      await zoneService.createDemoZone()
    }

    const zones = await ZoneRepository.getAll()

    for (const zone of zones) {
      await this.loadZone(zone)
    }

    logger.info('Zone manager loaded')
  }

  // Method to handle individual zoneEditor loading
  public async loadZone(zone: Zone) {
    const loadedZone = new LoadedZone(zone)
    this.loadedZones.push(loadedZone)
    logger.info(`Zone ID ${zone.id} loaded`)
  }

  // Method to handle individual zoneEditor unloading
  public unloadZone(zoneId: number) {
    this.loadedZones = this.loadedZones.filter((loadedZone) => loadedZone.getZone().id !== zoneId)
    logger.info(`Zone ID ${zoneId} unloaded`)
  }

  // Getter for loaded zones
  public getLoadedZones(): LoadedZone[] {
    return this.loadedZones
  }

  // Getter for zone by id
  public getZoneById(zoneId: number): LoadedZone | undefined {
    return this.loadedZones.find((loadedZone) => loadedZone.getZone().id === zoneId)
  }
}

export default new ZoneManager()