#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
cif_inf_reader.py

Console checker for tkcif_reader.py.

Usage:
    python cif_inf_reader.py sample.cif

Default:
    use read_structure(), i.e. pymatgen Structure with fallback order:
      pymatgen -> tkcif_base+pymatgen -> tkcif_legacy+pymatgen

Emergency tkCrystal path:
    python cif_inf_reader.py sample.cif --reader tkcrystal
"""

from __future__ import annotations

import argparse
import sys
from pathlib import Path

from tkcif_reader import (
    CIFReadError,
    ase_atoms_summary_text,
    read_ase_atoms,
    read_structure,
    read_tkcrystal,
    structure_summary_text,
    tkcrystal_summary_text,
)


def main() -> int:
    parser = argparse.ArgumentParser(
        description="Read one CIF through tkcif_reader.py and print structure information."
    )
    parser.add_argument("cif_file", type=str, help="Input CIF file")
    parser.add_argument(
        "--reader",
        type=str,
        default="structure",
        choices=["structure", "ase", "tkcrystal"],
        help="structure: return pymatgen Structure. ase: return ASE Atoms. tkcrystal: return legacy tkCrystal. Default: structure",
    )
    parser.add_argument(
        "--primitive",
        type=int,
        default=0,
        choices=[0, 1],
        help="For pymatgen Structure reading, request primitive cell. Default: 0",
    )
    parser.add_argument(
        "--show-log",
        type=int,
        default=1,
        choices=[0, 1],
        help="Print backend log and warnings. Default: 1",
    )
    args = parser.parse_args()

    path = Path(args.cif_file)
    if not path.is_file():
        print(f"Error: file not found: {path}", file=sys.stderr)
        return 1

    try:
        if args.reader == "structure":
            structure, info = read_structure(
                path,
                primitive=bool(args.primitive),
                return_info=True,
            )

            print("=" * 72)
            print("CIF reader")
            print("=" * 72)
            print(f"Path                      : {path}")
            print(f"Backend                   : {info.backend}")
            print(f"Normalized                : {info.normalized}")
            if info.encoding:
                print(f"Encoding                  : {info.encoding}")

            if args.show_log:
                if info.unavailable_backends:
                    print("")
                    print("Unavailable backends")
                    for msg in info.unavailable_backends:
                        print(f"  - {msg}")

                if info.warnings:
                    print("")
                    print("Warnings")
                    for msg in info.warnings:
                        print(f"  - {msg}")

                if info.errors:
                    print("")
                    print("Previous backend errors")
                    for msg in info.errors:
                        print(f"  - {msg}")

            print("")
            print("=" * 72)
            print("pymatgen Structure")
            print("=" * 72)
            print(structure_summary_text(structure))

        elif args.reader == "ase":
            atoms, info = read_ase_atoms(path, return_info=True)

            print("=" * 72)
            print("CIF reader")
            print("=" * 72)
            print(f"Path                      : {path}")
            print(f"Backend                   : {info.backend}")

            if args.show_log:
                if info.warnings:
                    print("")
                    print("Warnings")
                    for msg in info.warnings:
                        print(f"  - {msg}")

                if info.errors:
                    print("")
                    print("Errors")
                    for msg in info.errors:
                        print(f"  - {msg}")

            print("")
            print("=" * 72)
            print("ASE Atoms")
            print("=" * 72)
            print(ase_atoms_summary_text(atoms))

        else:
            cry, info = read_tkcrystal(path, return_info=True)

            print("=" * 72)
            print("CIF reader")
            print("=" * 72)
            print(f"Path                      : {path}")
            print(f"Backend                   : {info.backend}")

            if args.show_log:
                if info.unavailable_backends:
                    print("")
                    print("Unavailable legacy module candidates")
                    for msg in info.unavailable_backends:
                        print(f"  - {msg}")

                if info.warnings:
                    print("")
                    print("Warnings")
                    for msg in info.warnings:
                        print(f"  - {msg}")

                if info.errors:
                    print("")
                    print("Errors")
                    for msg in info.errors:
                        print(f"  - {msg}")

            print("")
            print("=" * 72)
            print("legacy tkCrystal")
            print("=" * 72)
            print(tkcrystal_summary_text(cry))

        return 0

    except (CIFReadError, ImportError, RuntimeError) as exc:
        print("Error: CIF reading failed", file=sys.stderr)
        print(f"  {type(exc).__name__}: {exc}", file=sys.stderr)
        return 1

    except Exception as exc:
        print("Unexpected error", file=sys.stderr)
        print(f"  {type(exc).__name__}: {exc}", file=sys.stderr)
        return 1


if __name__ == "__main__":
    raise SystemExit(main())
