import { assertDoesNotThrow } from 'backend/database/tests/helpers';
import { DateTime } from 'luxon';
import setupInstance from 'src/setup/setupInstance';
import { SetupWizardOptions } from 'src/setup/types';
import test from 'tape';
import { getValueMapFromList } from 'utils';
import {
  getTestDbPath,
  getTestFyo,
  getTestSetupWizardOptions,
} from './helpers';

const dbPath = getTestDbPath();
const setupOptions = getTestSetupWizardOptions();
const fyo = getTestFyo();

test('setupInstance', async () => {
  await assertDoesNotThrow(async () => {
    await setupInstance(dbPath, setupOptions, fyo);
  }, 'setup instance failed');
});

test('check setup Singles', async (t) => {
  const setupFields = [
    'companyName',
    'country',
    'fullname',
    'email',
    'bankName',
    'fiscalYearStart',
    'fiscalYearEnd',
    'currency',
  ];

  const setupSingles = await fyo.db.getSingleValues(...setupFields);
  const singlesMap = getValueMapFromList(setupSingles, 'fieldname', 'value');

  for (const field of setupFields) {
    let dbValue = singlesMap[field];
    const optionsValue = setupOptions[field as keyof SetupWizardOptions];

    if (dbValue instanceof Date) {
      dbValue = DateTime.fromJSDate(dbValue).toISODate();
    }

    t.equal(
      dbValue as string,
      optionsValue,
      `${field}: (${dbValue}, ${optionsValue})`
    );
  }
});

test('check null singles', async (t) => {
  const nullFields = ['gstin', 'logo', 'phone', 'address'];
  const nullSingles = await fyo.db.getSingleValues(...nullFields);

  t.equal(
    nullSingles.length,
    0,
    `null singles: ${JSON.stringify(nullSingles)}`
  );
});

test.onFinish(async () => {
  await fyo.close();
});