#!/usr/bin/python3

import argparse
import logging
import os
import sys

from dfs.df_cache import PandasDataFrameCache, FileCache
from dfs.df_server import DataFrameServer, FileServer
from dfs.helpers import *

parser = argparse.ArgumentParser(description='Run Python DataFrame Service.')
parser.add_argument('--file', action="store_const", const=True, help='specify raw file mode', default=False)
parser.add_argument('--port', type=int, help='specify alternate port (default: 8000)', default=8000)
parser.add_argument('--bind', type=str, help='specify alternate bind address (default: all interfaces)', default="0.0.0.0")
parser.add_argument('--dir', type=str, help='specify alternate directory (default: current directory)', default=os.getcwd())
parser.add_argument('--memory', type=int, help='specify alternate max memory usage (default: 1GB)', default=2**30)
parser.add_argument('--log', type=str, help='specify alternate logging level (default: WARN)', default="WARN")

args = parser.parse_args()

log_level = getattr(logging, args.log.upper(), None)
if not isinstance(log_level, int):
    raise ValueError('Invalid log level: %s' % args.log)
logging.basicConfig(level=log_level)

logging.info(f"Serving on {args.bind} port {args.port} with max memory {args.memory} at root directory {args.dir}")

if args.file:
    cache = FileCache(max_memory=args.memory, root_path=args.dir)
    with FileServer(cache, (args.bind, args.port)) as server:
        try:
            server.serve_forever()
        except KeyboardInterrupt:
            sys.exit(0)
else:
    cache = PandasDataFrameCache(max_memory=args.memory, root_path=args.dir)
    with DataFrameServer(cache, (args.bind, args.port)) as server:
        try:
            server.serve_forever()
        except KeyboardInterrupt:
            sys.exit(0)
