from django.core.management.base import BaseCommand, CommandError
from django.db import transaction
from teacher_management.models import Teacher
from departments.models import Department
from status.models import Status
from course.models import Course, CourseTeacher
from organization.models import Organization
import os
import json

class Command(BaseCommand):
    help = 'Loads initial teacher data from a JSON file into the database'

    def handle(self, *args, **kwargs):
        self.stdout.write('Starting to load teacher data...')
        
        try:
            with open(os.path.join(os.path.dirname(__file__), 'teachers.json')) as f: # import teacher data from teachers.json use dir variable not static path
                teachers_data = json.load(f)
        except FileNotFoundError:
            self.stdout.write(self.style.ERROR('teachers.json not found. Please create the file.'))
            return

        with transaction.atomic():
            for teacher_data in teachers_data:
                try:
                    department_name = teacher_data.pop("department")
                    status_name = teacher_data.pop("status")
                    course_names = teacher_data.pop("courses", [])

                    department = Department.objects.get(department_name=department_name)
                    status = Status.objects.get(title=status_name, type='teacher')

                    teacher, created = Teacher.objects.get_or_create(
                        email=teacher_data["email"],
                        defaults={
                            "first_name": teacher_data.get("first_name"),
                            "last_name": teacher_data.get("last_name"),
                            "code": teacher_data.get("code"),
                            "phone": teacher_data.get("phone"),
                            "title": teacher_data.get("title"),
                            "hire_date": teacher_data.get("hire_date"),
                            "department": department, 
                            "status": status
                        }
                    )

                    if created:
                        self.stdout.write(self.style.SUCCESS(f'Successfully created teacher: {teacher.first_name} {teacher.last_name}'))
                    else:
                        self.stdout.write(self.style.WARNING(f'Teacher already exists: {teacher.first_name} {teacher.last_name}'))

                    for course_name in course_names:
                        try:
                            course = Course.objects.get(name=course_name)
                            CourseTeacher.objects.get_or_create(teacher=teacher, course=course)
                            self.stdout.write(self.style.SUCCESS(f'  - Assigned course: {course.name}'))
                        except Course.DoesNotExist:
                            self.stdout.write(self.style.WARNING(f'  - Course not found: {course_name}'))

                except Exception as e:
                    self.stdout.write(self.style.ERROR(f'Error creating teacher: {e}'))

        self.stdout.write('Finished loading teacher data.')