from datetime import date
import json

from django.contrib.auth.models import User
from django.test import TestCase, Client
from django.urls import reverse

from .models import (
    School,
    EducationLevel,
    ClassRoom,
    Student,
    Subject,
    SubjectAllocation,
    HeadTeacher,
)


class SubjectAllocationCBETest(TestCase):
    def setUp(self):
        self.user = User.objects.create_user(username='ht', password='pass')
        self.school = School.objects.create(
            name='Test School',
            school_type='CBE',
            system_type='CBE',
            school_category='PRIMARY',
        )
        HeadTeacher.objects.create(user=self.user, school=self.school, full_name='Head Teacher')

        self.level = EducationLevel.objects.create(name='Lower Primary')
        self.classroom = ClassRoom.objects.create(
            school=self.school,
            name='Grade 1',
            level=self.level,
            order=1,
        )

        self.student = Student.objects.create(
            school=self.school,
            classroom=self.classroom,
            first_name='Jane',
            last_name='Doe',
            date_of_birth=date(2015, 1, 1),
            gender='Female',
            admission_number='A001',
            admission_date=date(2025, 1, 1),
        )

        self.subject = Subject.objects.create(
            school=self.school,
            code='CUST',
            name='Custom Primary Subject',
            education_level=self.level,
        )

        self.client = Client()
        self.client.login(username='ht', password='pass')

    def test_custom_primary_subject_allocation_is_allowed(self):
        url = reverse('save_subject_allocations')
        payload = {
            'class_id': self.classroom.id,
            'subject_id': self.subject.id,
            'students': [self.student.id],
            'allocate_all': False,
        }

        response = self.client.post(url, data=json.dumps(payload), content_type='application/json')

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json().get('success'), True)

        self.assertTrue(SubjectAllocation.objects.filter(subject=self.subject, student=self.student).exists())
