#!/usr/bin/env python3
import argparse
from collections import Counter


def extract_object(line: str):
    """
    Extract object from a simple N-Triples line:
    <subject> <predicate> <object> .

    Keeps URI objects and literal objects as raw N-Triples terms.
    """
    line = line.strip()

    if not line or line.startswith("#"):
        return None

    if not line.endswith("."):
        return None

    # Remove final dot
    line = line[:-1].strip()

    # Split into subject, predicate, object
    parts = line.split(maxsplit=2)

    if len(parts) != 3:
        return None

    return parts[2].strip()


def main():
    parser = argparse.ArgumentParser(
        description="Count unique objects in an N-Triples file."
    )
    parser.add_argument("input_file", help="Input .nt file")
    parser.add_argument("output_file", help="Output file with object counts")

    args = parser.parse_args()

    object_counts = Counter()

    with open(args.input_file, "r", encoding="utf-8") as infile:
        for line in infile:
            obj = extract_object(line)

            if obj is not None:
                object_counts[obj] += 1

    with open(args.output_file, "w", encoding="utf-8") as outfile:
        for obj, count in object_counts.most_common():
            outfile.write(f"{obj}\t{count}\n")

    print(f"Written {len(object_counts)} unique objects to {args.output_file}")


if __name__ == "__main__":
    main()
