from __future__ import with_statement

import logging
import os
import sys

from json import load

import AbletonWebConnector as live_api_connector

from abl.webconnector import WEBCONNECTOR_EXT, UsageReporter
from abl.webconnector.main import main as real_main


def main(param_file=None, max_bytes=1000000):
    if param_file is None:
        param_file = sys.argv[1]

    param_json = load(open(param_file))

    logging_params = param_json.get("logging", {})

    c_level = logging_params.get("log_level", "DEBUG").upper()
    if c_level not in ("ERROR", "CRITICAL", "WARNING", "WARN", "INFO", "DEBUG"):
        c_level = "DEBUG"

    logging_params["log_level"] = c_level

    if not "file_path" in logging_params:
        sys.stderr.write("You must provide a logging.file_path")
        sys.exit(1)

    formatter = logging.Formatter("%(levelname)s:%(asctime)s:%(name)s:%(message)s")
    file_path = logging_params["file_path"]
    # truncate the logfile if it's too large
    if os.path.exists(file_path) and os.path.getsize(file_path) > max_bytes:
        os.rename(file_path, file_path + ".old")
        with open(file_path + ".old", "rb") as inf:
            inf.seek(-max_bytes / 2, os.SEEK_END)
            with open(file_path, "wb") as outf:
                content = inf.read()
                outf.write(content)

    handler = logging.FileHandler(file_path)
    handler.setLevel(getattr(logging, c_level))
    handler.setFormatter(formatter)

    root_logger = logging.getLogger()
    root_logger.addHandler(handler)
    root_logger.setLevel(getattr(logging, c_level))

    usage_log_file = None

    if "usage_report_prefix" in param_json and "aip_usage_data_dir" in param_json:
        usage_log_file = open(
            os.path.join(
                param_json["aip_usage_data_dir"],
                "%s%s" % (param_json["usage_report_prefix"], WEBCONNECTOR_EXT),
            ).encode("utf-8"),
            "wb",
        )

    usage_reporter = UsageReporter(usage_log_file)

    with usage_reporter:
        real_main(param_json, live_api_connector, usage_reporter=usage_reporter)


if __name__ == "__main__":
    main()
