"""
This program has been developed by students from the bachelor Computer Science at Utrecht
University within the Software Project course.
© Copyright Utrecht University (Department of Information and Computing Sciences)
"""

from datetime import datetime
from logging import FileHandler
from pathlib import Path


class DatedFileHandler(FileHandler):
    def __init__(self, file_prefix: str, **kwargs):
        if not file_prefix:
            raise ValueError("`file_prefix` argument cannot be empty.")
        self._file_prefix = file_prefix
        kwargs["filename"] = self._make_filename()
        super().__init__(**kwargs)

    def _make_filename(self) -> str:
        """
        Create the filename for the current logfile, using the configured file prefix and the
        current date and time. If the directory does not exist, it gets created.

        :return: A filepath.
        """
        filepath = Path(f"{self._file_prefix}-{datetime.now():%Y%m%d-%H%M%S}.log")
        if not filepath.parent.is_dir():
            filepath.parent.mkdir(parents=True, exist_ok=True)
        return str(filepath)

    def do_rollover(self):
        """
        Close the current logfile and create a new one with the current date and time.
        """
        self.acquire()
        try:
            if self.stream:
                self.stream.close()

            self.baseFilename = self._make_filename()
            self.stream = self._open()
        finally:
            self.release()
