# (c) cavaliba.com - test / factory reset / on-disk state

import os
import tempfile

from django.core.cache import cache as cache_django
from django.test import TestCase, override_settings

import app_home.cache as cache
from app_home.factory import wipe_files, wipe_folder


class TestFactoryResetFiles(TestCase):
    def setUp(self):
        cache.clear()
        cache_django.clear()

    def _folder_with_files(self, *names):
        folder = tempfile.mkdtemp()
        for name in names:
            with open(os.path.join(folder, name), "w") as f:
                f.write("x")
        return folder

    def test_wipe_folder_removes_files(self):
        folder = self._folder_with_files("a.pdf", "b.csv")
        removed, errors = wipe_folder(folder)
        self.assertEqual(removed, 2)
        self.assertEqual(errors, [])
        self.assertEqual(os.listdir(folder), [])

    def test_wipe_folder_keeps_gitignore(self):
        folder = self._folder_with_files("a.pdf", ".gitignore")
        removed, errors = wipe_folder(folder)
        self.assertEqual(removed, 1)
        self.assertEqual(errors, [])
        self.assertEqual(os.listdir(folder), [".gitignore"])

    def test_wipe_folder_keeps_subfolders(self):
        folder = self._folder_with_files("a.pdf")
        os.mkdir(os.path.join(folder, "sub"))
        removed, errors = wipe_folder(folder)
        self.assertEqual(removed, 1)
        self.assertEqual(errors, [])
        self.assertEqual(os.listdir(folder), ["sub"])

    def test_wipe_folder_missing_folder_is_not_an_error(self):
        removed, errors = wipe_folder("/nonexistent/cavaliba/factory/test")
        self.assertEqual(removed, 0)
        self.assertEqual(errors, [])

    def test_wipe_files_covers_every_folder(self):
        filestore = self._folder_with_files("f1", "f2")
        export = self._folder_with_files("e1")
        mail = self._folder_with_files("m1", "m2", "m3")
        sms = self._folder_with_files()

        with override_settings(
            CAVALIBA_FILESTORE=filestore,
            CAVALIBA_EXPORT_FOLDER=export,
            CAVALIBA_MAIL_FOLDER=mail,
            CAVALIBA_SMS_FOLDER=sms,
        ):
            files, errors = wipe_files()

        self.assertEqual(errors, [])
        self.assertEqual(files, {"filestore": 2, "export": 1, "mail": 3, "sms": 0})
        self.assertEqual(os.listdir(filestore), [])
        self.assertEqual(os.listdir(export), [])
        self.assertEqual(os.listdir(mail), [])
