import { expect, tap } from '@git.zone/tstest/tapbundle';
import { IppClient, IppMapper, type IIppAttributeRecord, type IIppSnapshot } from '../../ts/integrations/ipp/index.js';

const attributes: IIppAttributeRecord = {
  'printer-name': 'Office Printer',
  'printer-info': 'Office color printer',
  'printer-location': 'Office',
  'printer-make-and-model': 'HP Color LaserJet Pro',
  'printer-device-id': 'MFG:HP;MDL:Color LaserJet Pro;CMD:PCL,POSTSCRIPT;SERIALNUMBER:CN123456;',
  'printer-uuid': 'urn:uuid:printer-1',
  'printer-state': 3,
  'printer-state-message': 'Ready',
  'printer-state-reasons': ['none'],
  'printer-is-accepting-jobs': true,
  'queued-job-count': 2,
  'printer-up-time': 3600,
  'printer-current-time': '2026-01-01T01:00:00.000Z',
  'marker-names': ['Black Toner', 'Cyan Ink'],
  'marker-types': ['toner-cartridge', 'ink-cartridge'],
  'marker-colors': ['black', 'cyan'],
  'marker-levels': [88, 42],
  'marker-low-levels': [5, 10],
  'marker-high-levels': [100, 100],
  'job-id': [12],
  'job-name': ['Test Page'],
  'job-state': [5],
  'job-originating-user-name': ['phil'],
};

tap.test('maps IPP attributes to printer device, marker, status, and job sensors', async () => {
  const snapshot = IppClient.attributesToSnapshot(attributes, { host: 'printer.local', port: 631, basePath: '/ipp/print' }, true);
  expect(snapshot.printer.manufacturer).toEqual('HP');
  expect(snapshot.printer.serialNumber).toEqual('CN123456');
  expect(snapshot.status.printerState).toEqual('idle');
  expect(snapshot.status.bootedAt).toEqual('2026-01-01T00:00:00.000Z');
  expect(snapshot.markers[0].kind).toEqual('toner');
  expect(snapshot.markers[1].kind).toEqual('ink');
  expect(snapshot.jobs[0].state).toEqual('processing');

  const devices = IppMapper.toDevices(snapshot);
  const entities = IppMapper.toEntities(snapshot);
  expect(devices[0].id).toEqual('ipp.printer.urn_uuid_printer_1');
  expect(devices[0].features.some((featureArg) => featureArg.id === 'marker_0')).toBeTrue();
  expect(entities.find((entityArg) => entityArg.id === 'sensor.office_printer_status')?.state).toEqual('idle');
  expect(entities.find((entityArg) => entityArg.id === 'sensor.black_toner')?.attributes?.markerKind).toEqual('toner');
  expect(entities.find((entityArg) => entityArg.id === 'sensor.cyan_ink')?.state).toEqual(42);
  expect(entities.find((entityArg) => entityArg.id === 'sensor.office_printer_queued_jobs')?.state).toEqual(2);
  expect(entities.find((entityArg) => entityArg.id === 'binary_sensor.office_printer_accepting_jobs')?.state).toEqual('on');
  expect(entities.find((entityArg) => entityArg.id === 'sensor.test_page')?.attributes?.owner).toEqual('phil');
});

tap.test('keeps hostless IPP runtime snapshots offline instead of faking live success', async () => {
  const snapshot = await new IppClient({ name: 'Hostless Printer' }).getSnapshot();
  expect(snapshot.online).toBeFalse();
  expect(snapshot.source).toEqual('runtime');
  expect(await new IppClient({ name: 'Hostless Printer' }).ping()).toBeFalse();
});

tap.test('maps offline snapshots without inventing marker or job values', async () => {
  const snapshot: IIppSnapshot = {
    printer: { id: 'offline-printer', name: 'Offline Printer' },
    status: { printerState: 'unknown', stateReasons: [] },
    markers: [],
    jobs: [],
    online: false,
    updatedAt: '2026-01-01T00:00:00.000Z',
  };
  const entities = IppMapper.toEntities(snapshot);
  expect(entities.find((entityArg) => entityArg.id === 'sensor.offline_printer_status')?.available).toBeFalse();
  expect(entities.some((entityArg) => entityArg.id.includes('marker'))).toBeFalse();
  expect(entities.some((entityArg) => entityArg.id.includes('job'))).toBeFalse();
});

export default tap.start();
