import re
import os
import sys
import json
from tqdm import tqdm
import polars as pl

from suno_utils.utils.text import read_jsonl


if __name__ == "__main__":

    dataset_name = "discogs"
    print(f"Loading {dataset_name} metas...")
    metas_filepath = f"/app/suno/tmp/raw_{dataset_name}_metas.jsonl"
    metas = read_jsonl(metas_filepath)

    # count the number of metas
    print(f"Number of metas: {len(metas)}")

    terms_set = [
        "audiophile",
        "remix",
        "cover",
        "live",
        "instrumental",
        "karaoke",
        "slowed + reverb",
        "official video",
        "official audio",
        "visualizer",
        "lyrics",
        "lyric video",
        "extended",
        "edit",
        "radio edit",
        "club mix",
        "bootleg",
        "rework",
        "re-edit",
        "reimagined",
        "demo",
        "acoustic",
        "unplugged",
        "reaction",
        "performance",
        "session",
        "mix",
        "dj set",
        "set",
        "tribute",
        "reprise",
        "duet",
        "mashup",
        "medley",
        "fan made",
        "fan edit",
        "loop",
        "3d audio",
        "8d audio",
        "360 audio",
        "slowed",
        "reverb",
        "sped up",
        "nightcore",
        "bass boosted",
        "bass-boosted",
        "hq",
        "hd",
        "4k",
        "vinyl",
        "vinyl rip",
        "cassette rip",
        "tape rip",
        "full album",
        "tracklist",
        "snippet",
        "teaser",
        "preview",
        "leak",
        "original mix",
        "alternate version",
        "studio version",
        "live version",
        "bedroom pop",
        "lofi",
        "lo-fi",
        "chill",
        "ambient",
        "synthwave",
        "phonk",
        "trap remix",
        "orchestral",
        "symphonic",
        "string version",
        "piano version",
        "guitar cover",
        "drum cover",
        "bass cover",
        "behind the scenes",
        "making of",
        "audio only",
        "concept video",
        "fancam",
        "practice",
        "dance practice",
        "line distribution",
        "tv performance",
        "award show",
        "web exclusive",
        "home recording",
        "bedroom recording",
        "raw take",
        "one take",
        "studio session",
        "jam session",
        "soundcheck",
        "backstage",
        "fan cam",
        "stage mix",
        "guitar",
        "electric guitar",
        "acoustic guitar",
        "bass",
        "bass guitar",
        "piano",
        "keyboard",
        "synth",
        "synthesizer",
        "drums",
        "percussion",
        "violin",
        "cello",
        "strings",
        "saxophone",
        "trumpet",
        "trombone",
        "flute",
        "clarinet",
        "harmonica",
        "banjo",
        "mandolin",
        "ukulele",
        "harp",
        "organ",
        "vocals",
        "vocal cover",
        "a cappella",
        "voice",
        "beatbox",
        "live performance",
        "remastered",
        "remaster",
        "orchestral version",
        "binaural",
        "unreleased",
        "music video",
        "360 video",
        "surround sound",
        "live from",
        "Tiny Desk",
        "MTV Unplugged",
        "concert version",
        "clean version",
        "explicit",
        "AMV",  # Anime Music Video
        "with lyrics",
        "without vocals",
        "no vocals",
        "trailer",
    ]

    terms_set = set(terms_set)
    print(f"Number of terms: {len(terms_set)}")

    # map from the meta_id to the terms
    terms_map = {}
    # Precompile regex patterns for better performance
    term_patterns = {
        term: re.compile(r"\b" + re.escape(term) + r"\b") for term in terms_set
    }

    pbar = tqdm(metas)
    for meta in pbar:
        if dataset_name == "discogs" or dataset_name == "discogs_subset":
            title_text = meta["title"].lower()  # Convert to lowercase once
        elif dataset_name == "genius":
            title_text = meta["youtube_title"].lower()
        else:
            raise ValueError(f"Dataset name {dataset_name} not supported")
        # Use precompiled patterns for faster matching
        found_terms = [
            term
            for term, pattern in term_patterns.items()
            if pattern.search(title_text)
        ]
        if found_terms:
            terms_map[meta["id"]] = found_terms
            pbar.set_postfix(found_terms=len(terms_map))

    # save the terms_map
    with open(
        f"/home/christian/code/christian/metadata/{dataset_name}_title_terms_map.json",
        "w",
    ) as f:
        json.dump(terms_map, f)
