# (c) cavaliba.com - test / views / factory reset (successful POST)

import os
import tempfile

from django.conf import settings
from django.core.cache import cache as cache_django
from django.test import TestCase, override_settings
from django.urls import reverse

import app_home.cache as cache
from app_data.models import DataClass, DataInstance
from tests import helper


class TestViewsFactoryReset(TestCase):
    def setUp(self):
        cache.clear()
        cache_django.clear()
        self.url = reverse("app_home:admintools_factory_reset")
        self.tmpdir = tempfile.mkdtemp()
        with open(os.path.join(self.tmpdir, "leftover.pdf"), "w") as f:
            f.write("x")

    def _post(self, **data):
        with override_settings(
            CAVALIBA_FILESTORE=self.tmpdir,
            CAVALIBA_EXPORT_FOLDER=self.tmpdir,
            CAVALIBA_MAIL_FOLDER=self.tmpdir,
            CAVALIBA_SMS_FOLDER=self.tmpdir,
        ):
            return self.client.post(self.url, data, follow=True)

    @override_settings(CAVALIBA_AUTH_MODE="unittest", CAVALIBA_ADMIN_PASSWORD="s3cret")
    def test_reset_report_page(self):
        helper.add_admin_user(login="unittest")
        helper.add_user(login="tobewiped")

        response = self._post(admin_password="s3cret")

        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "Factory reset done.", status_code=200)
        self.assertContains(response, settings.CAVALIBA_VERSION, status_code=200)
        self.assertContains(response, "Sign in again", status_code=200)

        self.assertFalse(DataInstance.objects.filter(keyname="tobewiped").exists())
        self.assertGreater(DataClass.objects.count(), 0)
        self.assertFalse(os.path.isfile(os.path.join(self.tmpdir, "leftover.pdf")))

    @override_settings(CAVALIBA_AUTH_MODE="unittest", CAVALIBA_ADMIN_PASSWORD="s3cret")
    def test_operator_account_is_restored(self):
        helper.add_admin_user(login="unittest")

        response = self._post(admin_password="s3cret")

        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "recreated with the admin role", status_code=200)
        self.assertTrue(DataInstance.objects.filter(classname="user", keyname="unittest").exists())

    @override_settings(CAVALIBA_AUTH_MODE="unittest", CAVALIBA_ADMIN_PASSWORD="s3cret")
    def test_reset_is_logged_after_the_wipe(self):
        from app_home.models import CavalibaLog

        helper.add_admin_user(login="unittest")

        self._post(admin_password="s3cret")

        self.assertTrue(
            CavalibaLog.objects.filter(action="factory_reset", status="OK").exists(),
            "the factory reset must leave a log entry in the fresh log table",
        )
