/**
 * Utility functions cho text processing — dedup, normalize, similarity
 * Hoàn toàn FREE, không cần AI
 */
export class TextUtil {
    /**
     * Normalize title để so sánh similarity
     */
    static normalizeTitle(title: string): string {
        return title
            .toLowerCase()
            .replace(/[^a-zA-Z0-9\u00C0-\u024F\u1E00-\u1EFF\s]/g, '') // giữ unicode (tiếng Việt)
            .replace(/\s+/g, ' ')
            .trim();
    }

    /**
     * Jaccard similarity giữa 2 strings (dựa trên words)
     * Return 0–1, >= 0.5 coi như trùng
     */
    static jaccardSimilarity(a: string, b: string): number {
        const setA = new Set(TextUtil.normalizeTitle(a).split(' '));
        const setB = new Set(TextUtil.normalizeTitle(b).split(' '));

        const intersection = new Set([...setA].filter((x) => setB.has(x)));
        const union = new Set([...setA, ...setB]);

        if (union.size === 0) return 0;
        return intersection.size / union.size;
    }

    /**
     * Extract keywords đơn giản (bỏ stopwords)
     */
    static extractKeywords(text: string, maxKeywords = 5): string[] {
        const stopwords = new Set([
            'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been',
            'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will',
            'would', 'could', 'should', 'may', 'might', 'can', 'shall',
            'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from',
            'as', 'into', 'through', 'during', 'before', 'after', 'above',
            'below', 'between', 'out', 'off', 'over', 'under', 'again',
            'further', 'then', 'once', 'here', 'there', 'when', 'where',
            'why', 'how', 'all', 'each', 'every', 'both', 'few', 'more',
            'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only',
            'own', 'same', 'so', 'than', 'too', 'very', 'just', 'because',
            'but', 'and', 'or', 'if', 'while', 'about', 'up', 'it', 'its',
            'this', 'that', 'these', 'those', 'i', 'me', 'my', 'we', 'our',
            'you', 'your', 'he', 'him', 'his', 'she', 'her', 'they', 'them',
            'their', 'what', 'which', 'who', 'whom',
            // Vietnamese stopwords
            'và', 'của', 'là', 'có', 'được', 'cho', 'trong', 'với', 'không',
            'này', 'đã', 'từ', 'một', 'những', 'các', 'để', 'theo', 'về',
            'người', 'năm', 'đến', 'khi', 'còn', 'ra', 'cũng', 'như', 'hay',
            'tại', 'vào', 'lại', 'sẽ', 'bị', 'đó', 'nếu', 'sau', 'trên',
        ]);

        const words = TextUtil.normalizeTitle(text).split(' ');
        return words
            .filter((w) => w.length > 2 && !stopwords.has(w))
            .slice(0, maxKeywords);
    }

    /**
     * Tạo fingerprint cho dedup nhanh
     */
    static fingerprint(title: string): string {
        const keywords = TextUtil.extractKeywords(title, 4);
        return keywords.sort().join('|');
    }

    /**
     * Truncate text an toàn (không cắt giữa từ)
     */
    static truncate(text: string, maxLength: number): string {
        if (text.length <= maxLength) return text;
        const truncated = text.substring(0, maxLength);
        const lastSpace = truncated.lastIndexOf(' ');
        return (lastSpace > 0 ? truncated.substring(0, lastSpace) : truncated) + '...';
    }

    static detectLinkX(text: string) {
        const regex = /(https?:\/\/)?(www\.)?(x\.com|twitter\.com)\/[^\s]+/gi;
        const links = text.match(regex);
        console.log({links});
        return {
            hasLinkX: links && links.length > 0,
            url: links ? links[0] : null,
        }
    }

    static removeAllUrl(text: string) {
        return  text.replace(/(?:https?|ftp):\/\/[\n\S]+/g, '');
    }
}
