'use strict';

const test = require('node:test');
const assert = require('node:assert/strict');

const convert = require('../../src/convert/index.js');

test('convert.possibilities — exported as a top-level function', () => {
    assert.equal(typeof convert.possibilities, 'function');
});

test('convert.possibilities(volumeFlowRate) returns common flow units', () => {
    const units = convert.possibilities('volumeFlowRate');
    assert.ok(Array.isArray(units));
    assert.ok(units.length > 0);
    for (const u of ['m3/s', 'm3/h', 'l/s', 'l/min', 'l/h']) {
        assert.ok(units.includes(u), `expected '${u}' in volumeFlowRate possibilities`);
    }
});

test('convert.possibilities(pressure) returns common pressure units', () => {
    const units = convert.possibilities('pressure');
    for (const u of ['Pa', 'kPa', 'bar', 'mbar', 'psi']) {
        assert.ok(units.includes(u), `expected '${u}' in pressure possibilities`);
    }
});

test('convert.possibilities(power) returns common power units', () => {
    const units = convert.possibilities('power');
    for (const u of ['W', 'kW', 'MW']) {
        assert.ok(units.includes(u), `expected '${u}' in power possibilities`);
    }
});

test('convert.possibilities(temperature) returns K, C, F', () => {
    const units = convert.possibilities('temperature');
    for (const u of ['K', 'C', 'F']) {
        assert.ok(units.includes(u), `expected '${u}' in temperature possibilities`);
    }
});

test('convert.possibilities for length / mass / volume return non-empty', () => {
    assert.ok(convert.possibilities('length').includes('m'));
    assert.ok(convert.possibilities('mass').includes('kg'));
    assert.ok(convert.possibilities('volume').includes('l'));
});

test('convert.possibilities(unknown) returns []', () => {
    assert.deepEqual(convert.possibilities('foo'), []);
    assert.deepEqual(convert.possibilities('bogus-measure'), []);
});

test('convert.possibilities handles invalid input safely', () => {
    assert.deepEqual(convert.possibilities(), []);
    assert.deepEqual(convert.possibilities(null), []);
    assert.deepEqual(convert.possibilities(''), []);
    assert.deepEqual(convert.possibilities(42), []);
});

test('convert.possibilities is sorted and deduplicated', () => {
    const units = convert.possibilities('pressure');
    const sorted = [...units].sort();
    assert.deepEqual(units, sorted, 'result should be alphabetically sorted');
    const set = new Set(units);
    assert.equal(set.size, units.length, 'result should have no duplicates');
});

test('convert.possibilities returns stable / cached results across calls', () => {
    const a = convert.possibilities('volumeFlowRate');
    const b = convert.possibilities('volumeFlowRate');
    assert.deepEqual(a, b, 'two calls must return equal arrays');
    // Mutating the returned array must not poison the cache.
    a.push('SHOULD_NOT_PERSIST');
    const c = convert.possibilities('volumeFlowRate');
    assert.ok(!c.includes('SHOULD_NOT_PERSIST'), 'cached array must be defensively copied');
    assert.deepEqual(c, b);
});

test('convert.measures lists known measure names', () => {
    const m = convert.measures();
    assert.ok(Array.isArray(m));
    for (const name of ['length', 'mass', 'volume', 'pressure', 'power', 'temperature', 'volumeFlowRate']) {
        assert.ok(m.includes(name), `expected measure '${name}'`);
    }
});

test('convert factory still works (regression — no breakage of existing API)', () => {
    const result = convert(1).from('m').to('cm');
    assert.equal(result, 100);
});
