# (c) cavaliba.com - home - tasks.py

# from time import sleep

import time

# from app_home.configuration import get_configuration
from celery import shared_task
from django.core import management

import app_home.cache as cache
from app_data.data import update_bigset
from app_data.eav import eav_purge, eav_refresh
from app_data.filestore import filestore_cleanup
from app_data.ipam import ipam_refresh
from app_data.permissions import permission_all_keynames
from app_data.revision import revision_purge
from app_data.task_manager import datatask_cleanup
from app_home.log import INFO, log, purge


@shared_task(ignore_result=True)
def housekeeping_daily(username=None):
    """Run daily maintenance. `username` (plain string, Celery-serializer-safe)
    is passed by the admintools UI to attribute the run to the triggering
    admin in the log; the cron schedule calls this with no argument, so it
    falls back to "cron"."""

    # flush_cache_per_request()
    cache.init()

    aaa = {"username": username or "cron", "is_admin": True, "perms": permission_all_keynames()}
    start_time = time.time()

    log(INFO, aaa=aaa, app="housekeeping", view="daily",
        action="start", status="OK", data="DAILY HOUSEKEEPING STARTED ...")  # fmt: skip

    # update_bigset
    log(INFO, aaa=aaa, app="housekeeping", view="bigset",
        action="update", status="OK", data="")  # fmt: skip
    update_bigset()

    # eav_refresh
    log(INFO, aaa=aaa, app="housekeeping", view="eav",
        action="refresh", status="OK", data="eav_refresh start ...")  # fmt: skip
    count_create, count_update, count = eav_refresh(dryrun=False, force=False)
    log(INFO, aaa=aaa, app="housekeeping", view="eav",
        action="refresh", status="OK",
        data=f"eav_refresh done: {count_create} created, {count_update} updated, {count} total")  # fmt: skip

    # ipam_refresh
    log(INFO, aaa=aaa, app="housekeeping", view="ipam",
        action="refresh", status="OK", data="ipam_refresh start ...")  # fmt: skip
    count_create, count = ipam_refresh(dryrun=False)
    log(INFO, aaa=aaa, app="housekeeping", view="ipam",
        action="refresh", status="OK",
        data=f"ipam_refresh done: {count_create} created, {count} total")  # fmt: skip

    # eav_purge
    log(INFO, aaa=aaa, app="housekeeping", view="eav",
        action="purge", status="OK", data="eav_purge start ...")  # fmt: skip
    count_delete, count = eav_purge()
    log(INFO, aaa=aaa, app="housekeeping", view="eav",
        action="purge", status="OK", data=f"eav_purge done : {count_delete} deleted, {count} total")  # fmt: skip

    # log purge
    count = purge(aaa=aaa)
    log(INFO, aaa=aaa, app="housekeeping", view="log",
        action="purge", status="OK", data=f"{count} removed")  # fmt: skip

    # V3.15.11 - clear sessions
    management.call_command("clearsessions")
    log(INFO, aaa=aaa, app="housekeeping", view="session",
        action="clear", status="OK", data="cleared expired sessions")  # fmt: skip

    # V3.23 - purge old revisions
    count = revision_purge(aaa=aaa)
    log(INFO, aaa=aaa, app="housekeeping", view="revision",
        action="cleanup", status="OK", data=f"removed : {count}")  # fmt: skip

    # datatask cleanup
    count = datatask_cleanup(days=30)
    log(INFO, aaa=aaa, app="housekeeping", view="datatask",
        action="cleanup", status="OK", data=f"{count} old tasks removed")  # fmt: skip

    # filestore cleanup
    cleaned, orphaned = filestore_cleanup(hours=24)
    log(INFO, aaa=aaa, app="housekeeping", view="filestore",
        action="cleanup", status="OK",
        data=f"{cleaned} expired datafiles removed, {orphaned} orphaned files removed")  # fmt: skip

    # TODO
    # forced eav refresh
    # sirene message purge

    #  done
    duration = time.time() - start_time
    log(INFO, aaa=aaa, app="housekeeping", view="daily",
        action="done", status="OK", data=f"DAILY HOUSEKEEPING DONE in {duration:.2f}s")  # fmt: skip


# #@app.task
# @shared_task
# def log_purge():

#     aaa = None
#     count = purge(aaa=aaa)
#     log(INFO, aaa=aaa, app="home", view="cron_housekeeping", action="log_purge", status="OK", data=f"{count} removed")


# # V3.15.11
# @shared_task
# def clear_expired_sessions():
#     management.call_command('clearsessions')
#     aaa = None
#     log(INFO, aaa=aaa, app="home", view="cron", action="clear_session", status="OK", data=f"cleared expired sessions")
