#!/usr/bin/env python3

import argparse
import logging
import sys
import traceback
import operator

from crytic_compile import cryticparser

from .info     import info
from .test     import test
from .train    import train
from .plot     import plot

logging.basicConfig()
logger = logging.getLogger("Slither-simil")

modes = ["info", "test", "train", "plot"]

def parse_args():
    parser = argparse.ArgumentParser(description='Code similarity detection tool. For usage, see https://github.com/crytic/slither/wiki/Code-Similarity-detector')

    parser.add_argument('mode',
                        help="|".join(modes))

    parser.add_argument('model',
                        help='model.bin')

    parser.add_argument('--filename',
                        action='store',
                        dest='filename',
                        help='contract.sol')

    parser.add_argument('--fname',
                        action='store',
                        dest='fname',
                        help='Target function')

    parser.add_argument('--ext',
                        action='store',
                        dest='ext',
                        help='Extension to filter contracts')

    parser.add_argument('--nsamples',
                        action='store',
                        type=int,
                        dest='nsamples',
                        help='Number of contract samples used for training')

    parser.add_argument('--ntop',
                        action='store',
                        type=int,
                        dest='ntop',
                        default=10,
                        help='Number of more similar contracts to show for testing')

    parser.add_argument('--input',
                        action='store',
                        dest='input',
                        help='File or directory used as input')

    parser.add_argument('--version',
                        help='displays the current version',
                        version="0.0",
                        action='version')

    cryticparser.init(parser)

    if len(sys.argv) == 1:
        parser.print_help(sys.stderr)
        sys.exit(1)

    args = parser.parse_args()
    return args

# endregion
###################################################################################
###################################################################################
# region Main
###################################################################################
###################################################################################

def main():
    args = parse_args()

    default_log = logging.INFO
    logger.setLevel(default_log)
    
    mode = args.mode

    if mode == "info":
        info(args)
    elif mode == "train":
        train(args) 
    elif mode == "test":
        test(args)
    elif mode == "plot":
        plot(args)
    else:
        logger.error('Invalid mode!. It should be one of these: %s' % ", ".join(modes))
        sys.exit(-1)

if __name__ == '__main__':
    main()

# endregion
