#!/usr/bin/env python

__author__ = "Damon May"


import argparse
from jamstats.io.scoreboard_json_io import (
    load_derby_game_from_json_file, load_inprogress_game_from_server)
from jamstats.plots.plot_together import save_game_plots_to_pdf
from jamstats.plots import plot_together, jamplots, skaterplots
from jamstats.data import json_to_pandas
import logging
import sys

logger = logging.Logger(__name__)


parser = argparse.ArgumentParser()
parser.add_argument('jsonfileorserver', type=str,
                    help="Scoreboard json file to read (or server:port, e.g., localhost:8000,"
                    "if --inprogress)")
parser.add_argument('pdffile', type=argparse.FileType('w'), nargs='?',
                    help='PDF file to write')
parser.add_argument('--anonymize', action="store_true",
                    help="Replace actual skater names with random pregenerated ones?")
parser.add_argument('--debug', action="store_true",
                    help="enable debug logging")
parser.add_argument('--inprogress', action="store_true",
                    help="If true, treats unnamed argument as the server and port"
                    "of an in-progress game, connects to it and grabs the current json.")
args = parser.parse_args()

logging.basicConfig(level=logging.WARNING,
                    format='%(asctime)s | %(name)s |  %(levelname)s: %(message)s')
if args.debug:
    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(logging.DEBUG)
    stream_handler.setFormatter(formatter)
    stream_handler.setStream(sys.stdout)

    logger.warning("Enabling debug logging.")
    for mymodule in [plot_together, jamplots, skaterplots, json_to_pandas]:
        mymodule.logger.setLevel(logging.DEBUG)
        mymodule.logger.addHandler(stream_handler)

print(f"Loading game from {args.jsonfileorserver}...")

if args.inprogress:
    print("Connecting to server...")
    try:
        server, port = args.jsonfileorserver.split(":")
        port = int(port)
    except Exception:
        quit(f"Tried to parse {args.jsonfileorserver} as server:port, failed. Quitting.")
    try:
        derby_game = load_inprogress_game_from_server(server, port)
    except Exception as e:
        quit(f"Failed to download in-game data from server {server}:{port}: {e}")
else:
    try:
        derby_game = load_derby_game_from_json_file(args.jsonfileorserver)
    except Exception as e:
        quit(f"Failed to open file {args.jsonfileorserver}: {e}")

if args.pdffile is None:
    if args.inprogress:
        quit("Output filepath not provided, and connecting to an in-progress game. "
        "Don't know where to write output, quitting.")
    elif args.jsonfileorserver.lower().endswith(".json"):
        print(f"Output filepath not provided. "
              f"Using input filepath with extension .pdf instead of {args.jsonfileorserver[-5:]}")
        pdf_filepath = args.jsonfileorserver[:-len(".json")] + ".pdf"
    else:
        print("Input file doesn't end with .json, so refusing to guess what output file you want."
              "  Please rename your input file or specify an output filepath. Quitting.")
        quit()
else:
    pdf_filepath = args.pdffile.name
    args.pdffile.close()

save_game_plots_to_pdf(derby_game, pdf_filepath, anonymize_names=args.anonymize)
print(f"Wrote {pdf_filepath}")
