import faker from 'faker';
import disabilities from './disabilities.js';
import educationLevels from './education-levels.js';
import languages from './languages.js';
import sunKoder from './sun-koder.js';
import chooseRandom from './utils/choose-random.util.js';
import workExperiences from './work-experiences.js';

faker.locale = 'sv';

const LANGUAGES = languages.generate();
const DRIVERS_LICENSES = ['AM', 'A1', 'A2', 'A', 'B', 'BE', 'B96', 'C1', 'C', 'C1E', 'CE', 'D1', 'D', 'D1E', 'DE'];
const EDUCATION_LEVELS = educationLevels.generate();
const SUN_KODER = sunKoder.generate();
const DISABILITIES = disabilities.generate();
const WORK_EXPERIENCES = workExperiences.generate();
const EDUCATIONS = [
  {
    utbildning: 'Lingvistik',
    beskrivning: 'Utbildning inom lingvistik',
    anordnare: 'Universidade de brasilia',
    period_from: '201804',
    period_tom: '202003',
  },
  {
    utbildning: 'Pedagogik',
    beskrivning: 'Utbildning inom pedagogik',
    anordnare: 'Faculdade horizonte',
    period_from: '201403',
    period_tom: '201803',
  },
];

function generateDeltagare(amount = 10) {
  const allDeltagare = [];

  for (let id = 1; id <= amount; ++id) {
    const fornamn = faker.name.firstName();
    const efternamn = faker.name.lastName();

    const korkort = Math.random() > 0.2 && {
      behorighet: chooseRandom(DRIVERS_LICENSES, faker.datatype.number(3)).join(''),
    };
    const educationLevel = EDUCATION_LEVELS[Math.floor(Math.random() * EDUCATION_LEVELS.length)];
    const sunKod = SUN_KODER[Math.floor(Math.random() * SUN_KODER.length)];

    const deltagare = {
      id,
      sokandeId: id,
      contact: {
        fornamn,
        efternamn,
        personnummer: `${faker.date
          .between('1950', '2000')
          .toISOString()
          .split('T')[0]
          .replace(/-/g, '')}${faker.datatype.number({
          min: 1000,
          max: 9999,
        })}`,
        epost: faker.internet.email(fornamn.toLowerCase(), efternamn.toLowerCase()),
        telekomadresser: [
          {
            landskod: 46,
            nummer_utan_inledande_nolla: faker.phone.phoneNumber('7########'),
            telekomtyp: 'Mobil',
          },
          {
            landskod: 46,
            nummer_utan_inledande_nolla: faker.phone.phoneNumber('#########'),
            telekomtyp: 'Bostad',
          },
        ],
        adresser: [
          {
            adresstyp: 'FBF',
            gatuadress: `${faker.address.streetName()} ${faker.datatype.number(100)}`,
            postnummer: faker.address.zipCode(),
            postort: faker.address.city(),
            land: 'Sverige',
          },
        ],
      },
      driverlicense: {
        korkort,
        tillgang_till_bil: Math.random() > 0.3 && korkort,
      },
      highestEducation: {
        utbildningsniva: educationLevel.utbildningsniva,
        beskrivning_utbildningsniva: educationLevel.beskrivning,
        sun_kod: sunKod.sun_kod,
        beskrivning_sun_kod: sunKod.beskrivning,
      },
      educations: {
        utbildningar: chooseRandom(EDUCATIONS, faker.datatype.number(EDUCATIONS.length)),
      },
      translator: {
        sprak: Math.random() > 0.3 && {
          beskrivning: LANGUAGES[Math.floor(Math.random() * LANGUAGES.length)].beskrivning,
        },
      },
      workLanguages: {
        sprak:
          Math.random() > 0.5
            ? chooseRandom(LANGUAGES, faker.datatype.number(3)).map(language => ({
                beskrivning: language.beskrivning,
              }))
            : [],
      },
      disabilities: Math.random() > 0.3 ? chooseRandom(DISABILITIES, faker.datatype.number(3)) : [],
      workExperiences: {
        arbetslivserfarenheter: chooseRandom(WORK_EXPERIENCES, faker.datatype.number(WORK_EXPERIENCES.length)),
      },
      hasAvbrott: Math.random() < 0.2,
    };
    if (Math.random() > 0.8) {
      deltagare.contact.adresser.push({
        adresstyp: 'EgenAngiven',
        gatuadress: `${faker.address.streetName()} ${faker.datatype.number(100)}`,
        postnummer: faker.address.zipCode(),
        postort: faker.address.city(),
        land: 'Sverige',
      });
    }
    allDeltagare.push(deltagare);
  }

  console.info('Deltagare generated...');
  return allDeltagare;
}

export default {
  generate: generateDeltagare,
};
