import { LiteHashDRBG, RandUtil } from '@sammo-ts/common';

import { simpleSerialize } from '../war/utils.js';

export const LEGACY_RANDOM_GENERAL_FIRST_NAMES = [
    '가',
    '간',
    '감',
    '강',
    '고',
    '공',
    '공손',
    '곽',
    '관',
    '괴',
    '교',
    '금',
    '노',
    '뇌',
    '능',
    '도',
    '동',
    '두',
    '등',
    '마',
    '맹',
    '문',
    '미',
    '반',
    '방',
    '부',
    '비',
    '사',
    '사마',
    '서',
    '설',
    '성',
    '소',
    '손',
    '송',
    '순',
    '신',
    '심',
    '악',
    '안',
    '양',
    '엄',
    '여',
    '염',
    '오',
    '왕',
    '요',
    '우',
    '원',
    '위',
    '유',
    '육',
    '윤',
    '이',
    '장',
    '저',
    '전',
    '정',
    '제갈',
    '조',
    '종',
    '주',
    '진',
    '채',
    '태사',
    '하',
    '하후',
    '학',
    '한',
    '향',
    '허',
    '호',
    '화',
    '황',
    '공손',
    '손',
    '왕',
    '유',
    '장',
    '조',
] as const;

export const LEGACY_RANDOM_GENERAL_LAST_NAMES = [
    '가',
    '간',
    '강',
    '거',
    '건',
    '검',
    '견',
    '경',
    '공',
    '광',
    '권',
    '규',
    '녕',
    '단',
    '대',
    '도',
    '등',
    '람',
    '량',
    '례',
    '로',
    '료',
    '모',
    '민',
    '박',
    '범',
    '보',
    '비',
    '사',
    '상',
    '색',
    '서',
    '소',
    '속',
    '송',
    '수',
    '순',
    '습',
    '승',
    '양',
    '연',
    '영',
    '온',
    '옹',
    '완',
    '우',
    '웅',
    '월',
    '위',
    '유',
    '윤',
    '융',
    '이',
    '익',
    '임',
    '정',
    '제',
    '조',
    '주',
    '준',
    '지',
    '찬',
    '책',
    '충',
    '탁',
    '택',
    '통',
    '패',
    '평',
    '포',
    '합',
    '해',
    '혁',
    '현',
    '화',
    '환',
    '회',
    '횡',
    '후',
    '훈',
    '휴',
    '흠',
    '흥',
] as const;

const readNameParts = (value: unknown, fallback: readonly string[]): string[] => {
    if (!Array.isArray(value)) {
        return [...fallback];
    }
    const result = value.filter((entry): entry is string => typeof entry === 'string');
    return result.length > 0 ? result : [...fallback];
};

export const buildAuctionAliasPool = (
    hiddenSeed: string | number,
    configConst: Record<string, unknown> = {}
): string[] => {
    const persistedPool = readNameParts(configConst.obfuscatedNamePool, []);
    if (persistedPool.length > 0) {
        return persistedPool;
    }
    const firstNames = readNameParts(configConst.randGenFirstName, LEGACY_RANDOM_GENERAL_FIRST_NAMES);
    const middleNames = readNameParts(configConst.randGenMiddleName, ['']);
    const lastNames = readNameParts(configConst.randGenLastName, LEGACY_RANDOM_GENERAL_LAST_NAMES);
    const pool: string[] = [];
    for (const first of firstNames) {
        for (const middle of middleNames) {
            for (const last of lastNames) {
                pool.push(`${first}${middle}${last}`);
            }
        }
    }
    return new RandUtil(new LiteHashDRBG(simpleSerialize(hiddenSeed, 'obfuscatedNamePool'))).shuffle(pool);
};

export const buildAuctionAlias = (
    generalId: number,
    hiddenSeed: string | number,
    configConst: Record<string, unknown> = {}
): string => {
    const shuffled = buildAuctionAliasPool(hiddenSeed, configConst);
    const normalizedId = Math.max(0, Math.floor(generalId));
    const duplicateIndex = Math.floor(normalizedId / shuffled.length);
    const name = shuffled[normalizedId % shuffled.length] ?? `익명${normalizedId}`;
    return duplicateIndex === 0 ? name : `${name}${duplicateIndex}`;
};
