import unicodedata

def get_unicode_info(char):
    try:
        name = unicodedata.name(char)
    except ValueError:
        name = "<no name>"

    category = unicodedata.category(char)
    bidi = unicodedata.bidirectional(char)
    mirrored = unicodedata.mirrored(char)
    combining = unicodedata.combining(char)

    try:
        decimal = unicodedata.decimal(char)
    except ValueError:
        decimal = ""

    try:
        digit = unicodedata.digit(char)
    except ValueError:
        digit = ""

    try:
        numeric = unicodedata.numeric(char)
    except ValueError:
        numeric = ""

    return {
        "name": name,
        "category": category,
        "bidi": bidi,
        "mirrored": mirrored,
        "combining": combining,
        "decimal": str(decimal),
        "digit": str(digit),
        "numeric": str(numeric)
    }

def main():
    with open("utf8_characters_detailed.txt", "w", encoding="utf-8") as f:
        # Table header with fixed-width columns
        header = (
            f"{'No.':<6}  {'Codepoint':<10}  {'Char':<3}  {'Name':<45}  {'Cat':<3}  {'Bidi':<4}  "
            f"{'Mir':<3}  {'Comb':<4}  {'Dec':<4}  {'Dig':<4}  {'Num':<5}\n"
            f"{'-'*6}  {'-'*10}  {'-'*3}  {'-'*45}  {'-'*3}  {'-'*4}  "
            f"{'-'*3}  {'-'*4}  {'-'*4}  {'-'*4}  {'-'*5}\n"
        )
        f.write(header)

        counter = 1
        for codepoint in range(0x110000):
            if 0xD800 <= codepoint <= 0xDFFF:
                continue  # Skip surrogates

            char = chr(codepoint)

            try:
                name = unicodedata.name(char)
            except ValueError:
                name = None

            if name is None and not char.isprintable():
                continue  # Skip invisible and unnamed

            info = get_unicode_info(char)

            f.write(
                f"{counter:<6}  "
                f"U+{codepoint:06X}   "
                f" {f"'{char}'":<5} "
                f"{info['name']:<45}  "
                f"{info['category']:<3}  "
                f"{info['bidi']:<4}  "
                f"{info['mirrored']:<3}  "
                f"{info['combining']:<4}  "
                f"{info['decimal']:<4}  "
                f"{info['digit']:<4}  "
                f"{info['numeric']:<5}\n"
            )

            counter += 1

    print("✅ File written: utf8_characters_detailed.txt")

if __name__ == "__main__":
    main()