import argparse
from . import *
from .classes import *
from .funcs import *
from abcli import file
import abcli.logging
import logging

logger = logging.getLogger(__name__)


parser = argparse.ArgumentParser(name, description=f"{name}-{version}")
parser.add_argument(
    "task",
    type=str,
    default="",
    help="describe,eval,ingest,predict,preprocess,train",
)
parser.add_argument(
    "--objects",
    type=str,
    default="",
)
parser.add_argument(
    "--color",
    type=int,
    default=0,
    help="0/1",
)
parser.add_argument(
    "--convnet",
    type=int,
    default=1,
    help="0/1",
)
parser.add_argument(
    "--count",
    type=int,
    default=-1,
)
parser.add_argument(
    "--data_path",
    type=str,
    default="",
)
parser.add_argument(
    "--epochs",
    default=10,
    type=int,
    help="",
)
parser.add_argument(
    "--infer_annotation",
    type=int,
    default=1,
    help="0/1",
)
parser.add_argument(
    "--input_path",
    type=str,
    default="",
)
parser.add_argument(
    "--model_path",
    type=str,
    default="",
)
parser.add_argument(
    "--output_path",
    type=str,
    default="",
)
parser.add_argument(
    "--purpose",
    type=str,
    default="",
    help="predict/train",
)
parser.add_argument(
    "--window_size",
    type=int,
    default=default_window_size,
)
args = parser.parse_args()

success = False
if args.task == "describe":
    Image_Classifier().load(args.model_path)
    success = True
elif args.task == "eval":
    success = eval(args.input_path, args.output_path)
elif args.task == "predict":
    classifier = Image_Classifier()

    if classifier.load(args.model_path):
        success, test_images = file.load(f"{args.data_path}/test_images.pyndarray")

    if success:
        logger.info(f"test_images: {string.pretty_shape_of_matrix(test_images)}")

        _, test_labels = file.load(
            f"{args.data_path}/test_labels.pyndarray",
            civilized=True,
            default=None,
        )

        test_images = test_images / 255.0

        success = classifier.predict(
            test_images,
            test_labels,
            args.output_path,
        )
elif args.task == "preprocess":
    success = preprocess(
        args.output_path,
        objects=args.objects,
        infer_annotation=args.infer_annotation,
        purpose=args.purpose,
        window_size=args.window_size,
    )
elif args.task == "train":
    success = Image_Classifier.train(
        args.data_path,
        args.model_path,
        color=args.color,
        convnet=args.convnet,
        epochs=args.epochs,
    )
else:
    logger.error(f"-{name}: {args.task}: command not found.")

if not success:
    logger.error(f"-{name}: {args.task}: failed.")