import net from 'net';
import { db, SystemSettings } from '../../database/db';

export class SettingsService {
  public static getSettings(): SystemSettings {
    return db.settings;
  }

  public static updateSettings(data: Partial<SystemSettings>): SystemSettings {
    db.settings = {
      ...db.settings,
      ...data
    };
    db.logAudit('SUPER_ADMIN', 'SETTINGS', 'SYSTEM_SETTINGS_UPDATED', data);
    db.persist();
    return db.settings;
  }

  /**
   * Tests real TCP Socket connectivity to MikroTik RouterOS API port (8728)
   */
  public static async testMikrotikConnection(host: string, port: number, timeoutMs = 3000): Promise<{ success: boolean; message: string; latencyMs?: number }> {
    const startTime = Date.now();
    return new Promise((resolve) => {
      const socket = new net.Socket();
      socket.setTimeout(timeoutMs);

      socket.on('connect', () => {
        const latencyMs = Date.now() - startTime;
        socket.destroy();
        resolve({
          success: true,
          message: `Successfully established TCP socket with MikroTik RouterOS API at ${host}:${port}`,
          latencyMs
        });
      });

      socket.on('timeout', () => {
        socket.destroy();
        resolve({
          success: false,
          message: `Connection timed out after ${timeoutMs}ms while connecting to ${host}:${port}. Verify router IP, API service is enabled (/ip service enable api), and firewall rules allow TCP ${port}.`
        });
      });

      socket.on('error', (err: any) => {
        socket.destroy();
        resolve({
          success: false,
          message: `Socket error connecting to ${host}:${port}: ${err.message || 'Connection refused'}. Ensure MikroTik API service (/ip service) is active.`
        });
      });

      socket.connect(port, host);
    });
  }
}
