/**
 * Dependency Injection Container
 * Supports singleton, transient, and scoped lifetimes
 */
class Container {
  constructor() {
    // TODO 1: Inicializáld a services Map-et (singleton instance-ok tárolása)
    // TODO 2: Inicializáld a factories Map-et (factory függvények tárolása)
    // TODO 3: Inicializáld a lifetimes Map-et (lifecycle típusok tárolása)
    
    // Példa inicializálás:
    // this.services = new Map();
    // this.factories = new Map();
    // this.lifetimes = new Map();
  }

  register(name, factory, lifetime = 'singleton') {
    // TODO 4: Tárold el a factory függvényt (this.factories.set(name, factory))
    // TODO 5: Tárold el a lifetime típust (this.lifetimes.set(name, lifetime))
    // TODO 6: Ha a lifetime === 'singleton', azonnal példányosítsd:
    //         - Hívd meg a factory-t: const instance = factory();
    //         - Tárold el: this.services.set(name, instance);
  }

  resolve(name, scope = null) {
    // TODO 7: Ha a service regisztrálva van mint 'scoped' ÉS van scope paraméter:
    //         - Ellenőrizd: if (scope && scope.has(name)) return scope.get(name);
    //         - Ha nincs még a scope-ban, példányosítsd és tárold: 
    //           const instance = this.factories.get(name)();
    //           scope.set(name, instance);
    //           return instance;
    
    // TODO 8: Ha singleton, add vissza a services-ből:
    //         if (this.lifetimes.get(name) === 'singleton') {
    //           return this.services.get(name);
    //         }
    
    // TODO 9: Ha transient, minden alkalommal hívj egy új factory-t:
    //         if (this.lifetimes.get(name) === 'transient') {
    //           return this.factories.get(name)();
    //         }
    
    // TODO 10: Ha nem regisztrált a service, dobj hibát:
    //          throw new Error(`Service '${name}' is not registered`);
  }

  createScope() {
    // TODO 11: Hozz létre egy új Map-et az scoped instance-oknak
    // TODO 12: Térj vissza egy objektummal ami tartalmaz egy resolve metódust:
    //          const scopeMap = new Map();
    //          return {
    //            resolve: (name) => this.resolve(name, scopeMap)
    //          };
  }
}

module.exports = Container;
