#!/usr/bin/env python3


import os
import sys

os.environ["CLI_MODE"] = "TRUE"
CRM_DIR = os.path.dirname(os.path.abspath(__file__))
os.chdir(CRM_DIR)
print(CRM_DIR)
sys.path.append(CRM_DIR)

for i in range(1,6):
    try:
        from cmf.manage import *
        break
    except Exception as e:
        import logging
        import time
        logging.exception("не смог импортировать cmf.manage")
        time.sleep(i)
else:
    raise Exception("не смог импортировать cmf.manage")

from modules.cron import do_cron

install_traceback_email_notify()

# APP.config.from_pyfile("cmf/config_load.py")
# start_views()
init_ds()
# CMF_CACHE.flushdb()

import argparse

parser = argparse.ArgumentParser()

subparser = parser.add_subparsers(dest="subparser")

cron_parser = subparser.add_parser("cron")
cron_parser.add_argument(
    "period", choices=["minutely", "hourly", "daily", "weekly", "monthly"]
)
cron_parser.set_defaults(module="cron")

benchmark_parser = subparser.add_parser("benchmark")
benchmark_parser.add_argument(
    "name", choices=["cpu_1"]
)
benchmark_parser.set_defaults(module="benchmark")

args = parser.parse_args()


def benchmark_cpu_1():
    import pickle
    from modules.api.views.index import CmfResultSplitter

    for i in range(5000):
        p = models.CmfPerson(name=str(i), code=str(i))
        t = models.CmfUWorkTask(name=str(i), code=str(i))

        for fieldname, field_cls in p.fields.items():
            p.init_field(fieldname, field_cls)

        for fieldname, field_cls in t.fields.items():
            t.init_field(fieldname, field_cls)

        t.executors.append(p)
        t.spectators.append(p)
        t.responsible = p
        t.cmf_owner = p
        p.cmf_deleted = False
        t.cmf_delete = p.cmf_deleted
        t.cmf_author = p
        t.text = str(i) * 100000
        p.text = t.text

        pickle.loads(pickle.dumps(p))

        CmfResultSplitter(p).split()


        # for j in range(1000):
        #     p.cmf_created_at.set_now()


def benchmark(name):
    from time import time

    with APP.test_request_context("/"):
        method = globals()[f"benchmark_{name}"]
        now = time()
        method()

    print(time() - now, "seconds")


if args.subparser is None:
    parser.print_help()
    exit(2)
elif args.subparser == "cron":
    os.environ["NO_CACHE"] = "TRUE"
    do_cron(args.period)
elif args.subparser == "benchmark":
    benchmark(args.name)
