import crypto = require('crypto');
import { GuestDetails, Passport } from '@support-user/index';
import { faker } from '@faker-js/faker';
import { TripTileType } from '@utility-lib/index';

function randomString(length = 6): string {
  return crypto.randomBytes(length).toString('hex');
}

export function createGuestEmail(): string {
  return `guest_${randomString()}@guest.staging.tripactions.xyz`;
}

export function createName(length: number) {
  let result = '';
  const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
  const charactersLength = characters.length;
  for (let i = 0; i < length; i++) {
    result += characters.charAt(Math.floor(Math.random() * charactersLength));
  }

  return result;
}

function createPhoneNumber(): string {
  return faker.phone.phoneNumber('+43############');
}

export function createPassport(): Passport {
  const issueDate = new Date();
  issueDate.setFullYear(issueDate.getFullYear() - 2);

  const expireDate = new Date();
  expireDate.setFullYear(issueDate.getFullYear() + 5);

  return {
    countryOfCitizenship: 'IL',
    countryOfIssue: 'IL',
    expiresOn: expireDate.toISOString().split('T')[0],
    issuedOn: issueDate.toISOString().split('T')[0],
    number: faker.phone.phoneNumber('###########')
  };
}

export function createGuestUserRequest(guestDetails: GuestDetails) {
  const { age, email, gender, travelerType, passport } = guestDetails;
  let { familyName, givenName, phoneNumber } = guestDetails;

  const birthday = new Date();
  birthday.setUTCFullYear(birthday.getUTCFullYear() - age);

  givenName = givenName || createName(8);
  familyName = familyName || createName(8);
  phoneNumber = phoneNumber || faker.phone.phoneNumber('+43############');

  return {
    travelerType: travelerType.toUpperCase(),
    guestSignup: {
      givenName,
      familyName,
      phone: phoneNumber,
      email,
      passenger: {
        givenName,
        familyName,
        gender,
        contact: {
          phone: {
            number: phoneNumber,
            type: 'CELL'
          },
          email
        },
        birthdate: birthday.toISOString().split('T')[0],
        passport
      }
    }
  };
}

export function createGuestDetails(
  age: number,
  gender: 'MALE' | 'FEMALE',
  travelerType: TripTileType
): GuestDetails {
  const email = createGuestEmail();
  const givenName = createName(8);
  const familyName = createName(8);
  const phoneNumber = createPhoneNumber();
  const passport = createPassport();

  return {
    email,
    givenName,
    familyName,
    phoneNumber,
    age,
    gender,
    travelerType,
    passport
  };
}
