"""エントリポイント（`python -m tiasjudge`）．

`QApplication` を生成してメイン画面（SPEC_01）を表示する．
ログの出力先設定はエントリポイント側の責務とする（error-handling.md「ログ」）．

起動オプション:

- `--check`: 画面を生成して即終了する（起動可能性の確認用．イベントループを回さない）
"""

from __future__ import annotations

import logging
import sys
from collections.abc import Sequence

#: `--check`（イベントループを回さずに終了する）オプション
CHECK_OPTION = "--check"

#: ログの書式（診断の入出力は `core` が INFO で記録する）
LOG_FORMAT = "%(asctime)s %(levelname)s %(name)s: %(message)s"


def main(argv: Sequence[str] | None = None) -> int:
    """アプリを起動する．戻り値はプロセスの終了コード．

    Args:
        argv: コマンドライン引数（プログラム名を含まない）．省略時は `sys.argv[1:]`．

    Returns:
        プロセスの終了コード（0 が正常終了）．
    """
    arguments = list(sys.argv[1:] if argv is None else argv)
    logging.basicConfig(level=logging.INFO, format=LOG_FORMAT)

    # GUI ツールキットの import は起動時のみに限定する（`core` は GUI 非依存）
    from PySide6.QtWidgets import QApplication

    from tiasjudge.gui.main_window import MainWindow

    app = QApplication.instance() or QApplication(sys.argv[:1])
    window = MainWindow()

    if CHECK_OPTION in arguments:
        # 画面を構築できることだけを確認して終了する（ヘッドレス環境での確認用）
        window.close()
        return 0

    window.show()
    return int(app.exec())


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