import { SinonStub, stub } from 'sinon';
import { expect } from 'chai';
import * as _ from 'lodash';

import * as apiBinder from '../src/api-binder';
import * as applicationManager from '../src/compose/application-manager';
import * as deviceState from '../src/device-state';
import * as constants from '../src/lib/constants';
import { docker } from '../src/lib/docker-utils';
import { Supervisor } from '../src/supervisor';

describe('Startup', () => {
	let startStub: SinonStub;
	let vpnStatusPathStub: SinonStub;
	let deviceStateStub: SinonStub;
	let dockerStub: SinonStub;

	before(async () => {
		startStub = stub(apiBinder as any, 'start').resolves();
		deviceStateStub = stub(deviceState, 'applyTarget').resolves();
		// @ts-expect-error
		applicationManager.initialized = Promise.resolve();
		vpnStatusPathStub = stub(constants, 'vpnStatusPath').returns('');
		dockerStub = stub(docker, 'listContainers').returns(Promise.resolve([]));
	});

	after(() => {
		startStub.restore();
		vpnStatusPathStub.restore();
		deviceStateStub.restore();
		dockerStub.restore();
	});

	it('should startup correctly', async () => {
		const supervisor = new Supervisor();
		await supervisor.init();

		// Cast as any to access private properties
		const anySupervisor = supervisor as any;
		expect(anySupervisor.db).to.not.be.null;
		expect(anySupervisor.config).to.not.be.null;
		expect(anySupervisor.logger).to.not.be.null;
		expect(anySupervisor.deviceState).to.not.be.null;
		expect(anySupervisor.apiBinder).to.not.be.null;
	});
});
