"""
pymatgen を用いて結晶構造の高対称k点経路を計算し表示するスクリプト。

概要:
    入力された結晶構造のBravais格子に基づいて高対称k点経路を計算し、表示します。

詳細説明:
    このスクリプトは、指定されたCIFファイルから結晶構造を読み込み、
    その原始構造 (primitive structure) に基づいて高対称k点経路を生成します。
    経路タイプは hinuma (Hinuma et al. 2017) または sc (Setyawan-Curtarolo 2010)
    から選択でき、デフォルトは hinuma です。
    計算されたk点経路のセグメントと、各高対称点の分数座標を標準出力に表示します。
    コマンドライン引数を使用することで、入力ファイルと経路タイプを動的に指定できます。
    例: python kpath_pymatgen.py my_structure.cif sc

引数:
    最初のコマンドライン引数 (sys.argv[1]) は入力CIFファイルへのパスを指定します。デフォルトは 'ZnO.cif' です。
    2番目のコマンドライン引数 (sys.argv[2]) は使用する高対称k点経路のタイプを指定します。'hinuma' (デフォルト) または 'sc' です。

戻り値:
    :returns: None. 計算結果は標準出力に表示されます。エラーが発生した場合はメッセージを表示し終了します。
    :rtype: None

関連リンク:
    kpath_pymatgen_usage
"""

import sys
from pymatgen.core import Structure
from pymatgen.symmetry.bandstructure import HighSymmKpath

infile = 'ZnO.cif'
path_type = "hinuma"  # hinuma: Hinuma–Pizzi–Kumagai–Oba–Tanaka (2017)
                      # sc: Setyawan–Curtarolo (2010)

if __name__ == "__main__":
    if len(sys.argv) > 1:
        infile = sys.argv[1]
    if len(sys.argv) > 2:
        path_type = sys.argv[2]


def main():
    """
    概要:
        pymatgenを用いて結晶構造の高対称k点経路を計算し、結果を標準出力に表示します。

    詳細説明:
        グローバル変数 infile と path_type に従って、指定された結晶構造の原始構造に対する高対称k点経路を計算します。
        計算された経路のセグメントと高対称点の座標を整形して標準出力に表示します。
        経路の計算に失敗した場合は、エラーメッセージを表示してプログラムを終了します。

    引数:
        main 関数は直接の引数を取りません。動作はグローバル変数 infile および path_type に依存します。

    戻り値:
        :returns: None
        :rtype: None

    例外:
        :raises SystemExit: 高対称k点経路の計算に失敗した場合にプログラムを終了します。
    """
    structure = Structure.from_file(infile)
    prim = structure.get_primitive_structure()

# 高対称点と経路を生成
    kpath = HighSymmKpath(prim, path_type = path_type)
    if kpath is None or kpath.kpath is None:
        print(f"\nError: Could not get k path for [{infile}] with the path_type={path_type}\n")
        exit()

# 経路の定義を見やすく表示
    print("\n=== k-path 経路 ===")
    for segment in kpath.kpath["path"]:
        print(" → ".join(segment))

# 高対称点座標を見やすく表示
    print("\n=== 高対称点座標 ===")
    for point, coord in kpath.kpath["kpoints"].items():
        print(f"{point:3s} : {coord}")


if __name__ == '__MAIN__':
    main()