import { db } from '../../database/db';
import { NetworkDriverFactory } from '../network/driver.factory';
import { SubscriberDTO } from '../network/driver.interface';

export class GracePeriodService {
  /**
   * Grants a 48-hour emergency grace period / Promise to Pay for expired subscribers
   */
  public static async grantGracePeriod(subscriberUsername: string, hours = 48) {
    const subscriber = db.subscribers.find(s => s.username === subscriberUsername);
    if (!subscriber) {
      throw new Error(`Subscriber '${subscriberUsername}' not found.`);
    }

    const now = new Date();
    const graceUntil = new Date(now.getTime() + hours * 60 * 60 * 1000).toISOString();

    subscriber.status = 'grace_period';
    subscriber.grace_period_until = graceUntil;
    subscriber.updated_at = now.toISOString();

    const pkg = db.packages.find(p => p.id === subscriber.package_id);
    const dto: SubscriberDTO = {
      id: subscriber.id,
      username: subscriber.username,
      driver_type: subscriber.driver_type,
      ip_address: subscriber.ip_address,
      mac_address: subscriber.mac_address,
      speed_mbps: pkg?.speed_mbps || 20,
      mikrotik_profile: pkg?.mikrotik_profile_name,
      radius_group: pkg?.radius_group_name,
      status: 'active'
    };

    // Temporarily unblock on network driver
    const driverResult = await NetworkDriverFactory.executeAction('activateUser', dto);

    db.logAudit('SUPER_ADMIN', subscriber.id, 'GRACE_PERIOD_GRANTED', {
      username: subscriber.username,
      hours,
      graceUntil,
      driverResult
    });

    db.persist();

    return {
      success: true,
      message: `Emergency grace period granted to ${subscriber.username} until ${new Date(graceUntil).toLocaleString()}. Network unblocked.`,
      graceUntil,
      subscriber
    };
  }
}
