import logging
import os
from datetime import datetime, timedelta
from logging.handlers import SysLogHandler
from shutil import rmtree

PATH = f"/opt/rbta/aldpro/repo/storage/tmp"
IGNORE_FILES = [
    ".gitkeep",
]

logger = logging.getLogger("aldpro-repo-garbage-collector")
logger.setLevel(logging.ERROR)

handler = SysLogHandler(address="/dev/log")
formatter = logging.Formatter("%(name)s %(levelname)s %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)


def is_file_using(file_path: str) -> bool:
    return timedelta(
        seconds=(datetime.timestamp(datetime.now()) - os.path.getmtime(file_path))
    ) >= timedelta(days=1)


def main():
    logger.info(f"Начата проверка мусорных файлов сервера репозитория")

    if not os.path.exists(PATH):
        logger.error(f"Директория {PATH} не существует")
        return

    dirs_for_check = set()

    for dirpath, dirnames, filenames in os.walk(PATH):
        logger.info(f"Файлов директории {dirpath} к проверке {len(filenames)}")

        for filename in [*filenames, *dirnames]:
            file_path = os.path.join(dirpath, filename)

            if os.path.isdir(file_path):
                dirs_for_check.add(file_path)
                continue

            if is_file_using(file_path) and filename not in IGNORE_FILES:
                try:
                    os.remove(file_path)
                    logger.info(f"Файл {file_path} удален")
                except Exception as e:
                    logger.error(f"При удалении файла {file_path} возникла ошибка: {e}")

    for dirname in sorted(
        dirs_for_check, key=lambda name: len(name.split("/")), reverse=True
    ):
        if is_file_using(dirname) and len(os.listdir(dirname)) == 0:
            try:
                rmtree(dirname)
                logger.info(f"Директория {dirname} удалена ")
            except Exception as e:
                logger.error(f"При удалении директории {dirname} возникла ошибка: {e}")

    logger.info("Проверка завершена")


main()
