from django.contrib.auth import get_user_model
from django.core.files.uploadedfile import SimpleUploadedFile
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from rest_framework_simplejwt.tokens import RefreshToken
from .models import MasterDesignation

User = get_user_model()


class MasterDesignationWorkflowTests(APITestCase):
    def setUp(self):
        # Create user
        self.user = User.objects.create_user(
            email="testuser@ta-ats.local",
            password="testpassword",
            first_name="Test",
            last_name="User"
        )
        self.user.role = "ADMIN"
        self.user.is_superuser = True
        self.user.is_staff = True
        self.user.save()

        # Generate JWT and apply to client
        token = RefreshToken.for_user(self.user)
        self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {token.access_token}")

    def test_download_template(self):
        url = reverse("master-designation-download-template")
        response = self.client.get(url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response["Content-Type"], "text/csv")
        self.assertIn("attachment; filename=\"master-designations.csv\"", response["Content-Disposition"])
        content = response.content.decode("utf-8")
        self.assertIn("Designation Name", content)

    def test_import_csv_success(self):
        csv_data = "Designation Name\nSoftware Engineer\nSenior Developer\nProject Manager\n"
        csv_file = SimpleUploadedFile("master-designations.csv", csv_data.encode("utf-8"), content_type="text/csv")

        url = reverse("master-designation-import-csv")
        response = self.client.post(url, {"file": csv_file}, format="multipart")

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertTrue(response.data["success"])
        self.assertEqual(response.data["data"]["imported"], 3)
        self.assertEqual(response.data["data"]["skipped"], 0)
        self.assertEqual(len(response.data["data"]["errors"]), 0)

        # Check in DB
        designations = MasterDesignation.objects.all()
        self.assertEqual(designations.count(), 3)
        for d in designations:
            self.assertEqual(d.status, "DRAFT")

    def test_import_csv_validation_and_skips(self):
        # Pre-create "Software Engineer" in DB
        MasterDesignation.objects.create(
            name="Software Engineer",
            status="ACTIVE",
            created_by=self.user,
            updated_by=self.user
        )

        csv_data = (
            "Designation Name\n"
            "Software Engineer\n"
            "\n"
            "Senior Developer\n"
            "senior developer\n"
            "  \n"
            "Project Manager\n"
            ",\n"
        )
        csv_file = SimpleUploadedFile("master-designations.csv", csv_data.encode("utf-8"), content_type="text/csv")

        url = reverse("master-designation-import-csv")
        response = self.client.post(url, {"file": csv_file}, format="multipart")

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data["data"]["imported"], 2)  # Senior Developer, Project Manager
        self.assertEqual(response.data["data"]["skipped"], 2)   # Row 2 (exists), Row 5 (duplicate in CSV)
        
        errors = response.data["data"]["errors"]
        self.assertIn("Row 2 : Designation already exists", errors)
        self.assertIn("Row 5 : Duplicate designation in CSV", errors)

        # Verify only Senior Developer and Project Manager were inserted as DRAFT
        inserted = MasterDesignation.objects.filter(status="DRAFT").order_by("name")
        self.assertEqual(inserted.count(), 2)
        self.assertEqual(inserted[0].name, "Project Manager")
        self.assertEqual(inserted[1].name, "Senior Developer")

    def test_import_csv_invalid_file_type(self):
        file = SimpleUploadedFile("test.txt", b"some text", content_type="text/plain")
        url = reverse("master-designation-import-csv")
        response = self.client.post(url, {"file": file}, format="multipart")
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertFalse(response.data["success"])

    def test_bulk_approve_success(self):
        d1 = MasterDesignation.objects.create(name="D1", status="DRAFT", created_by=self.user, updated_by=self.user)
        d2 = MasterDesignation.objects.create(name="D2", status="DRAFT", created_by=self.user, updated_by=self.user)
        d3 = MasterDesignation.objects.create(name="D3", status="ACTIVE", created_by=self.user, updated_by=self.user)

        url = reverse("master-designation-bulk-approve")
        response = self.client.patch(url, {"designationIds": [d1.id, d2.id, d3.id]}, format="json")

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data["data"]["updated_count"], 2)

        d1.refresh_from_db()
        d2.refresh_from_db()
        self.assertEqual(d1.status, "ACTIVE")
        self.assertEqual(d2.status, "ACTIVE")
        self.assertEqual(d1.updated_by, self.user)

    def test_bulk_delete_success(self):
        d1 = MasterDesignation.objects.create(name="D1", status="DRAFT", created_by=self.user, updated_by=self.user)
        d2 = MasterDesignation.objects.create(name="D2", status="DRAFT", created_by=self.user, updated_by=self.user)
        d3 = MasterDesignation.objects.create(name="D3", status="ACTIVE", created_by=self.user, updated_by=self.user)

        url = reverse("master-designation-bulk-delete")
        response = self.client.delete(url, {"designationIds": [d1.id, d2.id, d3.id]}, format="json")

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data["data"]["deleted_count"], 2)

        self.assertFalse(MasterDesignation.objects.filter(id=d1.id).exists())
        self.assertFalse(MasterDesignation.objects.filter(id=d2.id).exists())
        self.assertTrue(MasterDesignation.objects.filter(id=d3.id).exists())
