#!/usr/bin/env python3

"""Precomputes values for a quantum factoring execution."""


from __future__ import annotations

import argparse
import math
import pathlib
import sys
import time
from typing import Any

src_path = pathlib.Path(__file__).parent.parent / 'src'
assert src_path.exists()
sys.path.append(str(src_path))

from facto.algorithm.prep import ProblemConfig, ExecutionConfig


def main():
    t0 = time.monotonic()

    f: Any
    parser = argparse.ArgumentParser()
    parser.add_argument("--problem_ini", default=None, type=str)
    parser.add_argument("--out_dir", required=True, type=str)
    args = parser.parse_args()

    if getattr(args, 'problem_ini') is None:
        conf_content = sys.stdin.read()
    else:
        with open(getattr(args, 'problem_ini')) as f:
            conf_content = f.read()
    out_dir: pathlib.Path = pathlib.Path(args.out_dir)

    problem_config = ProblemConfig.from_ini_content(conf_content)

    exec_conf = ExecutionConfig.from_problem_config(problem_config, print_progress=True)

    print("Writing results to disk...", file=sys.stderr)
    out_dir.mkdir(exist_ok=True, parents=True)
    exec_conf.write_to_data_directory(
        out_dir,
        input_conf=conf_content,
        print_progress=True,
    )

    t1 = time.monotonic()
    dt = math.ceil((t1 - t0) * 10) / 10
    print(f"Done (total time {dt}s)", file=sys.stderr)


if __name__ == '__main__':
    main()
