"""
概要: CIFファイルから結晶構造を読み込み、pymatgenを用いて対称化し、結果をCIFファイルとして出力するスクリプト。

詳細説明:
本スクリプトは、pymatgenライブラリのSpacegroupAnalyzerを使用して、入力されたCIFファイルから結晶構造を読み込み、
その構造を高い対称性を持つ形式に変換（対称化）します。対称化の際には、symprecパラメータによって
原子座標や格子定数の許容誤差を調整できます。
対称化された構造は、新しいCIFファイルとして指定されたパスに保存されます。
コマンドライン引数として、入力CIFファイルのパス (infile)、出力CIFファイルのパス (outfile)、
対称性の許容誤差 (prec)、終了時の一時停止オプション (pause) を指定できます。
outfile が指定されない場合は infile に基づいて自動生成され、prec のデフォルト値は 1.0e-3、
pause のデフォルト値は 0 です。

関連リンク:
    symmetrize_pymatgen_usage
"""
import os
import sys
from pymatgen.core.structure import Structure
from pymatgen.symmetry.analyzer import SpacegroupAnalyzer
from pymatgen.io.cif import CifWriter, CifParser


infile = None
prec = 1.0e-3
pause = 0

if __name__ == "__main__":
    argv = sys.argv
    narg = len(argv)
    if narg >= 2:
        infile = argv[1]
    if narg >= 3:
        outfile = argv[2]
    elif infile is not None:
        dir_path = os.path.dirname(infile)
        filebody, ext = os.path.splitext(infile)
        outfile = os.path.join(dir_path, f"{filebody}-symmetrized.cif")
    if narg >= 4:
        prec = float(argv[3])
    if narg >= 5:
        pause = int(argv[4])


def main():
    """
    概要: メイン処理を実行し、結晶構造の対称化とファイル出力を行います。

    詳細説明:
        コマンドライン引数から設定された infile、outfile、prec の値を出力し、
        指定された infile から結晶構造を読み込みます。
        pymatgen.symmetry.analyzer.SpacegroupAnalyzer を使用して構造を対称化し、
        結果として得られた対称化された構造を outfile にCIF形式で保存します。
        pause が 1 に設定されている場合、スクリプト終了前にユーザーからの入力を待ちます。

    戻り値:
        :returns: なし。この関数は直接値を返しません。
        :rtype: None
    """
    print()
    print(f"infile: {infile}")
    print(f"outfile: {outfile}")
    print(f"prec: {prec}")

    struct = Structure.from_file(infile, primitive = False)
    print()
    print("input structure:")
    print(struct)

    symmetry_analyzer = SpacegroupAnalyzer(struct, symprec = prec) #, angle_tolerance = 5.0)
    symmetrized_structure = symmetry_analyzer.get_symmetrized_structure()
    print()
    print("symmetrized_structure:")
    print(symmetrized_structure)

    print()
    print(f"Save the symmetrized structure to [{outfile}]")
    writer = CifWriter(symmetrized_structure, symprec = prec) #, angle_tolerance = 5.0)
    writer.write_file(outfile)

    if pause: input("\nPress ENTER to terminate>>\n")


if __name__ == '__MAIN__':
    main()