"""Command-line interface for tkmlr."""
from __future__ import annotations

import argparse
import sys

from .data import make_xy_from_table, read_table
from .factory import create_model, registered_models
from .metrics import regression_report


def build_parser() -> argparse.ArgumentParser:
    p = argparse.ArgumentParser(description="tkmlr regression CLI")
    p.add_argument("--input", "--infile", dest="input", required=True, help="Input CSV/XLSX file")
    p.add_argument("--sheet", default=0, help="Excel sheet name/index")
    p.add_argument("--method", default="gpr", help=f"Model name. Available: {', '.join(registered_models())}")
    p.add_argument("--target", default=None, help="Target column label. Default: first parsed target")
    p.add_argument("--standardize", type=int, default=0, choices=[0, 1], help="Reserved option for Launcher compatibility")
    p.add_argument("--alpha", type=float, default=1.0e-6, help="alpha for compatible models")
    p.add_argument("--random-seed", type=int, default=0, help="Random seed for compatible models")
    p.add_argument("--return-std", type=int, default=1, choices=[0, 1], help="Print uncertainty if supported")
    return p


def main(argv=None) -> int:
    args = build_parser().parse_args(argv)
    sheet = args.sheet
    try:
        sheet = int(sheet)
    except ValueError:
        pass

    df = read_table(args.input, sheet_name=sheet)
    X, y, spec, descriptors, work = make_xy_from_table(df, target=args.target)

    params = {}
    if args.method.lower() in ["gpr", "gp", "ridge", "lasso", "elastic"]:
        params["alpha"] = args.alpha
    if args.method.lower() in ["physbo"]:
        params["random_seed"] = args.random_seed

    model = create_model(args.method, **params)
    model.fit(X, y)
    pred = model.predict(X, return_std=bool(args.return_std))
    if isinstance(pred, tuple):
        y_pred, y_std = pred
    else:
        y_pred, y_std = pred, None

    print("Model:", args.method)
    print("Target:", spec.original_label, "mode=", spec.mode)
    print("Descriptors:", descriptors)
    print("Metrics:")
    for key, value in regression_report(y, y_pred).items():
        print(f"  {key}: {value:.6g}")
    if y_std is not None:
        print("Uncertainty: available")
    return 0


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