import fs from 'fs';
import { authTokens } from './auth-tokens.js';
import avrop from './avrop.js';
import currentUser from './current-user.js';
import userinfo from './userinfo.js';
import deltagare from './deltagare.js';
import deltagareHandelser from './deltagare-handelser.js';
import employees from './employees.js';
import handledare from './handledare.js';
import languages from './languages.js';
import participants from './participants.js';
import tjanster from './tjanster.js';
import chooseRandom from './utils/choose-random.util.js';
import organizations from './organizations.js';
import orsaksKoderFranvaro from './avvikelse-alternative/orsaks-koder-franvaro.js';
import orsaksKoderAvvikelse from './avvikelse-alternative/orsaks-koder-avvikelse.js';
import kandaAvvikelseKoder from './avvikelse-alternative/kanda-avvikelse-koder.js';
import fragorForAvvikelser from './avvikelse-alternative/fragor-for-avvikelser.js';

const ORGANIZATIONS = organizations.generate();
const AUTHORIZATIONS = ['Hantera användare', 'Hantera origisation', 'Hantera ekonomi'];

const generatedEmployees = employees.generate(50);
const generatedDeltagare = deltagare.generate(50);
const generatedDeltagareHandelser = deltagareHandelser.generate(10);
const generatedHandledare = handledare.generate(generatedEmployees.slice(0, 6));
const generatedAvrop = avrop.generate(10, generatedDeltagare.slice(0, 25), generatedHandledare);
const generatedTjanster = tjanster.generate();
const generatedCurrentUser = currentUser.generate();
const generatedOrganizations = chooseRandom(ORGANIZATIONS, ORGANIZATIONS.length);
const generatedUserinfo = {
  ...userinfo.generate(),
  firstName: generatedCurrentUser.firstName,
  lastName: generatedCurrentUser.lastName,
};
const avropTjanster = [];
const utforandeVerksamheter = [];
const avropKommuner = [];
const generateOrsaksKoderFranvaro = orsaksKoderFranvaro.generate();
const generateOrsaksKoderAvvikelse = orsaksKoderAvvikelse.generate();
const generateKandaAvvikelseKoder = kandaAvvikelseKoder.generate();
const generateFragorForAvvikelser = fragorForAvvikelser.generate();

generatedAvrop.forEach(({ tjanstekod, tjansteNamn, utforandeVerksamhetId, utforandeverksamhet, kommunKod, kommun }) => {
  const tjanstExists = avropTjanster.find(tjanst => tjanst.id === tjanstekod);
  const utforandeVerksamhetExists = utforandeVerksamheter.find(
    utforandeVerksamhet => utforandeVerksamhet.id === utforandeVerksamhetId
  );
  const kommunExists = avropKommuner.find(kommun => kommun.id === kommunKod);

  if (tjanstExists) {
    tjanstExists.count = tjanstExists.count + 1;

    if (!tjanstExists.related_utforandeverksamhetIds.includes(utforandeVerksamhetId)) {
      tjanstExists.related_utforandeverksamhetIds.push(utforandeVerksamhetId);
    }
    if (!tjanstExists.related_kommunKoder.includes(kommunKod)) {
      tjanstExists.related_kommunKoder.push(kommunKod);
    }
  } else {
    avropTjanster.push({
      id: tjanstekod,
      label: tjansteNamn,
      count: 1,
      related_utforandeverksamhetIds: [utforandeVerksamhetId],
      related_kommunKoder: [kommunKod],
    });
  }
  if (utforandeVerksamhetExists) {
    utforandeVerksamhetExists.count = utforandeVerksamhetExists.count + 1;

    if (!utforandeVerksamhetExists.related_tjanstKoder.includes(tjanstekod)) {
      utforandeVerksamhetExists.related_tjanstKoder.push(tjanstekod);
    }
    if (!utforandeVerksamhetExists.related_kommunKoder.includes(kommunKod)) {
      utforandeVerksamhetExists.related_kommunKoder.push(kommunKod);
    }
  } else {
    utforandeVerksamheter.push({
      id: utforandeVerksamhetId,
      label: utforandeverksamhet,
      count: 1,
      related_tjanstKoder: [tjanstekod],
      related_kommunKoder: [kommunKod],
    });
  }
  if (kommunExists) {
    kommunExists.count = kommunExists.count + 1;

    if (!kommunExists.related_tjanstKoder.includes(tjanstekod)) {
      kommunExists.related_tjanstKoder.push(tjanstekod);
    }
    if (!kommunExists.related_utforandeverksamhetIds.includes(utforandeVerksamhetId)) {
      kommunExists.related_utforandeverksamhetIds.push(utforandeVerksamhetId);
    }
  } else {
    avropKommuner.push({
      id: kommunKod,
      label: kommun,
      count: 1,
      related_tjanstKoder: [tjanstekod],
      related_utforandeverksamhetIds: [utforandeVerksamhetId],
    });
  }
});

const apiData = {
  languages: languages.generate(),
  employees: generatedEmployees,
  avrop: generatedAvrop,
  avropTjanster,
  tjanster: generatedTjanster,
  utforandeVerksamheter,
  kommuner: avropKommuner,
  deltagare: generatedDeltagare,
  deltagareHandelser: generatedDeltagareHandelser,
  handledare: generatedHandledare,
  participants: participants.generate(50).map(participant => ({
    ...participant,
    employeeId: generatedEmployees[Math.floor(Math.random() * generatedEmployees.length)].id,
  })),
  currentUser: generatedCurrentUser,
  organizations: generatedOrganizations,
  userinfo: generatedUserinfo,
  getTokenFullAccess: authTokens.auth_code_from_CIAM_with_all_permissions,
  invites: [],
  orsakskoderfranvaro: generateOrsaksKoderFranvaro,
  orsakskoderavvikelse: generateOrsaksKoderAvvikelse,
  kandaavvikelsekoder: generateKandaAvvikelseKoder,
  fragorforavvikelser: generateFragorForAvvikelser,
  minaDeltagare: chooseRandom(generatedAvrop, 3),
};

fs.writeFileSync('api.json', JSON.stringify(apiData, null, '\t'));
