import { tap, expect } from '@push.rocks/tapbundle';
import { NupstSnmp } from '../ts/snmp/manager.js';
import type { ISnmpConfig, IUpsStatus } from '../ts/snmp/types.js';

import * as qenv from '@push.rocks/qenv';
const testQenv = new qenv.Qenv('./', '.nogit/');

// Create an SNMP instance with debug enabled
const snmp = new NupstSnmp(true);

// Load the test configuration from .nogit/env.json 
const testConfigV1 = await testQenv.getEnvVarOnDemandAsObject('testConfigV1');
const testConfigV3 = await testQenv.getEnvVarOnDemandAsObject('testConfigV3');

tap.test('should log config', async () => {
  console.log(testConfigV1);
});

// Test with real UPS using the configuration from .nogit/env.json
tap.test('Real UPS test v1', async () => {
  try {
    console.log('Testing with real UPS configuration...');
    
    // Extract the correct SNMP config from the test configuration
    const snmpConfig = testConfigV1.snmp;
    console.log('SNMP Config:');
    console.log(`  Host: ${snmpConfig.host}:${snmpConfig.port}`);
    console.log(`  Version: SNMPv${snmpConfig.version}`);
    console.log(`  UPS Model: ${snmpConfig.upsModel}`);
    
    // Use a short timeout for testing
    const testSnmpConfig = { 
      ...snmpConfig,
      timeout: Math.min(snmpConfig.timeout, 10000) // Use at most 10 seconds for testing
    };
    
    // Try to get the UPS status
    const status = await snmp.getUpsStatus(testSnmpConfig);
    
    console.log('UPS Status:');
    console.log(`  Power Status: ${status.powerStatus}`);
    console.log(`  Battery Capacity: ${status.batteryCapacity}%`);
    console.log(`  Runtime Remaining: ${status.batteryRuntime} minutes`);
    
    // Just make sure we got valid data types back
    expect(status).toBeTruthy();
    expect(['online', 'onBattery', 'unknown']).toContain(status.powerStatus);
    expect(typeof status.batteryCapacity).toEqual('number');
    expect(typeof status.batteryRuntime).toEqual('number');
  } catch (error) {
    console.log('Real UPS test failed:', error);
    // Skip the test if we can't connect to the real UPS
    console.log('Skipping this test since the UPS might not be available');
  }
});

tap.test('Real UPS test v3', async () => {
  try {
    console.log('Testing with real UPS configuration...');
    
    // Extract the correct SNMP config from the test configuration
    const snmpConfig = testConfigV3.snmp;
    console.log('SNMP Config:');
    console.log(`  Host: ${snmpConfig.host}:${snmpConfig.port}`);
    console.log(`  Version: SNMPv${snmpConfig.version}`);
    console.log(`  UPS Model: ${snmpConfig.upsModel}`);
    
    // Use a short timeout for testing
    const testSnmpConfig = { 
      ...snmpConfig,
      timeout: Math.min(snmpConfig.timeout, 10000) // Use at most 10 seconds for testing
    };
    
    // Try to get the UPS status
    const status = await snmp.getUpsStatus(testSnmpConfig);
    
    console.log('UPS Status:');
    console.log(`  Power Status: ${status.powerStatus}`);
    console.log(`  Battery Capacity: ${status.batteryCapacity}%`);
    console.log(`  Runtime Remaining: ${status.batteryRuntime} minutes`);
    
    // Just make sure we got valid data types back
    expect(status).toBeTruthy();
    expect(['online', 'onBattery', 'unknown']).toContain(status.powerStatus);
    expect(typeof status.batteryCapacity).toEqual('number');
    expect(typeof status.batteryRuntime).toEqual('number');
  } catch (error) {
    console.log('Real UPS test failed:', error);
    // Skip the test if we can't connect to the real UPS
    console.log('Skipping this test since the UPS might not be available');
  }
});

// Export the default tap object
export default tap.start();