# (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_data.telemetry import telemetry_purge
from app_home.log import event_purge, log2


@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()}
    log2.bind(actor=aaa["username"], actor_kind="user" if username else "system")
    start_time = time.time()
    log2.ok("housekeeping.start")

    # each step logs its own event (eav.refresh, ipam.refresh, eav.purge, log.purge,
    # task.cleanup, filestore.*, telemetry.purge); counts are also summed up in housekeeping.daily
    steps = {}

    update_bigset()

    count_create, count_update, _count, _written = eav_refresh(dryrun=False, force=False)
    steps["eav_refresh"] = count_create + count_update

    count_create, count = ipam_refresh(dryrun=False)
    steps["ipam_refresh"] = count_create

    count_delete, count = eav_purge(dryrun=False)
    steps["eav_purge"] = count_delete

    steps["log_purge"] = event_purge()

    # V3.15.11 - clear sessions
    management.call_command("clearsessions")

    # V3.23 - purge old revisions
    steps["revision_purge"] = revision_purge(aaa=aaa)
    log2.ok("revision.purge", count=steps["revision_purge"])

    steps["task_cleanup"] = datatask_cleanup(days=30)

    cleaned, orphaned = filestore_cleanup(hours=24)
    steps["filestore_cleanup"] = cleaned + orphaned

    steps["telemetry_purge"] = telemetry_purge()

    # TODO
    # forced eav refresh
    # sirene message purge

    duration_ms = int((time.time() - start_time) * 1000)
    log2.ok("housekeeping.daily", duration_ms=duration_ms, extra=steps)
