export function generateRealisticEmail(
    firstNames: string[],
    lastNames: string[],
    domains: string[]
): string {
    // Функция для выборки случайного элемента массива
    const getRandomElement = <T>(arr: T[]): T =>
        arr[Math.floor(Math.random() * arr.length)];

    // Берём случайные имя и фамилию (сразу приводим к нижнему регистру)
    // и подрезаем до 3-4 символов, чтобы результат был короче
    const rawFirstName = getRandomElement(firstNames).toLowerCase().slice(0, 4);
    const rawLastName = getRandomElement(lastNames).toLowerCase().slice(0, 4);

    // Случайно решаем, включать ли «осмысленные» цифры (примерно в 40% случаев)
    const includeDigits = Math.random() < 0.4;

    // Генерируем «реалистичное» число (часто год рождения или возраст)
    function getRealisticNumber(): string {
        // 50% – год рождения (1970–2010), 50% – «возраст» (10–80).
        const isYear = Math.random() < 0.5;
        if (isYear) {
            const year = Math.floor(Math.random() * (2010 - 1970 + 1)) + 1970; // 1970–2010
            return String(year);
        } else {
            const age = Math.floor(Math.random() * (80 - 10 + 1)) + 10; // 10–80
            return String(age);
        }
    }

    // Цифровая часть (если решено, что будет)
    const numberPart = includeDigits ? getRealisticNumber() : '';

    // Несколько укороченных паттернов (чтобы адреса были не слишком длинными).
    // Используем уже подрезанные кусочки имён.
    // {fn} = имя (уже укороченное), {ln} = фамилия (уже укороченная),
    // {f} = первая буква имени, {num} = сгенерированное «реалистичное» число.
    const patterns = [
        '{f}{ln}',        // Пример: cgom
        '{ln}{f}',        // Пример: gomc
        '{fn}.{ln}',      // Пример: carl.gome
        '{fn}{ln}',       // Пример: carlgome
        '{fn}{num}',      // Пример: carl1979
        '{ln}{num}',      // Пример: gome1979
        '{fn}{ln}{num}'   // Пример: carlgome1979
    ];

    // Выбираем шаблон
    const randomPattern = getRandomElement(patterns);

    // Подготовим первую букву имени
    const f = rawFirstName.slice(0, 1);

    // Формируем локальную часть по выбранному шаблону
    let localPart = randomPattern
        .replace('{fn}', rawFirstName)
        .replace('{ln}', rawLastName)
        .replace('{f}', f)
        .replace('{num}', numberPart);

    // Чтобы адреса были «чуть короче», ограничим длину локальной части до 6 символов.
    // (Не считая маски, которую сейчас добавим)
    if (localPart.length > 6) {
        localPart = localPart.slice(0, 6);
    }

    // Функция для добавления маски *** или **** в середину
    function addMaskInTheMiddle(str: string): string {
        // Случайная маска
        const mask = Math.random() < 0.5 ? '***' : '****';
        // Если строка совсем короткая (например, 1-2 символа),
        // то проще добавить маску в конец или начало.
        if (str.length < 3) {
            return str + mask;
        }
        // Находим «середину» строки
        const middleIndex = Math.floor(str.length / 2);
        // Вставляем маску примерно в середину
        return str.slice(0, middleIndex) + mask + str.slice(middleIndex);
    }

    // Добавляем маску
    localPart = addMaskInTheMiddle(localPart);

    // Выбираем домен
    const domain = getRandomElement(domains);

    // Итоговый email
    return `${localPart}@${domain}`;
}

// // Пример использования
// const firstNames = ["Carlos", "Luis", "Maria", "Ana", "Juan", "Pedro", "Jose"];
// const lastNames = ["Gomez", "Lopez", "Martinez", "Rodriguez", "Fernandez", "Perez"];
// const domains = ["gmail.com", "yahoo.com", "outlook.com", "hotmail.com"];

// // Генерируем несколько адресов
// for (let i = 0; i < 10; i++) {
//     console.log(generateRealisticEmail(firstNames, lastNames, domains));
// }
