import { INetworkDriver, SubscriberDTO, DriverResult } from './driver.interface';
import { MikrotikDriver } from './mikrotik.driver';
import { RadiusDriver } from './radius.driver';

export class NetworkDriverFactory {
  private static mikrotikDriver = new MikrotikDriver();
  private static radiusDriver = new RadiusDriver();

  public static getDriver(driverType: 'MIKROTIK_API' | 'RADIUS'): INetworkDriver {
    if (driverType === 'RADIUS') {
      return this.radiusDriver;
    }
    return this.mikrotikDriver;
  }

  public static async executeAction(
    action: 'createUser' | 'suspendUser' | 'activateUser' | 'terminateLiveSession',
    subscriber: SubscriberDTO,
    extraArg?: string
  ): Promise<DriverResult> {
    const driver = this.getDriver(subscriber.driver_type);
    
    switch (action) {
      case 'createUser':
        return await driver.createUser(subscriber);
      case 'suspendUser':
        return await driver.suspendUser(subscriber, extraArg);
      case 'activateUser':
        return await driver.activateUser(subscriber);
      case 'terminateLiveSession':
        return await driver.terminateLiveSession(subscriber.username);
      default:
        throw new Error(`Unsupported network driver action: ${action}`);
    }
  }
}
