#!/usr/bin/env python3
"""Merge multiple BibTeX files, removing duplicate entries (by citation key).\n
When the same citation key appears in multiple files, the first occurrence wins.\n
Usage:
    python scripts/merge_bibtex.py refs1.bib refs2.bib
    python scripts/merge_bibtex.py refs1.bib refs2.bib -o merged.bib
"""

import argparse
import os
import sys

sys.path.insert(0, os.path.dirname(__file__))

from bibtex_lib import (
    merge_bibtex_strings,
    parse_bibtex_to_entries,
    entries_to_bibtex_string,
)

def main() -> None:
    """Parse CLI arguments and merge_bibtex_strings multiple .bib files."""
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter,
    )
    parser.add_argument("input", nargs="+", help="Input .bib files")
    parser.add_argument("-o", "--output", help="Output .bib file (default: stdout)")
    args = parser.parse_args()
    for path in args.input:
        if not path.endswith(".bib"):
            parser.error(f"input file must be a .bib file: {path}")
        if not os.path.isfile(path):
            parser.error(f"input file not found: {path}")
    #
    bib_texts = []
    for path in args.input:
        with open(path) as f:
            bib_texts.append(f.read())
    #
    total_input = sum(len(parse_bibtex_to_entries(bib_text)) for bib_text in bib_texts)
    merged = merge_bibtex_strings(*bib_texts)
    result = entries_to_bibtex_string(merged)
    duplicates = total_input - len(merged)
    #
    if args.output:
        with open(args.output, "w") as f:
            f.write(result)
        print(
            f"Merged {len(merged)} entries from {len(args.input)} file(s) into {args.output} ({duplicates} duplicates removed)",
            file=sys.stderr,
        )
    else:
        sys.stdout.write(result)
        print(
            f"Merged {len(merged)} entries from {len(args.input)} file(s) to stdout ({duplicates} duplicates removed)",
            file=sys.stderr,
        )

if __name__ == "__main__":
    main()
