from django.core.management.base import BaseCommand
from course.models import Course, CourseTeacher
from teacher_management.models import Teacher
from departments.models import Department
from batch_year.models import BatchYear
from semester.models import Semester
from django.utils.text import slugify
import random

class Command(BaseCommand):
    help = 'Adds default course data with department mapping and random semester/year assignment.'

    def handle(self, *args, **kwargs):
        self.stdout.write("Adding default course data...")

        teachers = list(Teacher.objects.all())
        
        # Department mapping
        dept_mapping = {
            'cse': 'Computer Science and Engineering',
            'eee': 'Electrical and Electronics Engineering',
            'bba': 'Department of Business Administration',
            'civ': 'Civil Engineering'
        }
        
        # Get all semesters and years for random assignment
        semesters = list(Semester.objects.all())
        years = list(BatchYear.objects.all())
        
        if not semesters or not years:
            self.stdout.write(self.style.ERROR("Please ensure at least one Semester and BatchYear exist in the database."))
            return

        course_data = [
            {'code': 'CSE 3100', 'title': 'Web Based Application Lab/Project', 'credit': 1.0, 'credit_hours': 1.0, 'dept': 'cse'},
            {'code': 'CSE 3101', 'title': 'Database Systems', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'cse'},
            {'code': 'CSE 3102', 'title': 'Database Systems Sessional', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'cse'},
            {'code': 'CSE 3103', 'title': 'Data Communication', 'credit': 1.0, 'credit_hours': 1.0, 'dept': 'cse'},
            {'code': 'CSE 3104', 'title': 'Data Communication Sessional', 'credit': 1.0, 'credit_hours': 1.0, 'dept': 'cse'},
            {'code': 'CSE 3105', 'title': 'Microprocessors and Assembly Language', 'credit': 1.0, 'credit_hours': 1.0, 'dept': 'cse'},
            {'code': 'CSE 3106', 'title': 'Microprocessors and Assembly Language Sessional', 'credit': 1.0, 'credit_hours': 1.0, 'dept': 'cse'},
            {'code': 'CSE 3108', 'title': 'Technical Writing and Presentation Sessional', 'credit': 2.0, 'credit_hours': 2.0, 'dept': 'cse'},
            {'code': 'CSE 3201', 'title': 'Operating Systems', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'cse'},
            {'code': 'CSE 3202', 'title': 'Operating Systems Sessional', 'credit': 1.0, 'credit_hours': 1.0, 'dept': 'cse'},
            {'code': 'CSE 3301', 'title': 'Software Engineering', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'cse'},
            {'code': 'EEE 3101', 'title': 'Electrical Circuits', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'eee'},
            {'code': 'EEE 3102', 'title': 'Electrical Circuits Lab', 'credit': 1.0, 'credit_hours': 1.0, 'dept': 'eee'},
            {'code': 'EEE 3103', 'title': 'Electronics I', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'eee'},
            {'code': 'EEE 3104', 'title': 'Electronics I Lab', 'credit': 1.0, 'credit_hours': 1.0, 'dept': 'eee'},
            {'code': 'EEE 3201', 'title': 'Power Systems', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'eee'},
            {'code': 'EEE 3202', 'title': 'Power Systems Lab', 'credit': 1.0, 'credit_hours': 1.0, 'dept': 'eee'},
            {'code': 'EEE 3301', 'title': 'Digital Signal Processing', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'eee'},
            {'code': 'BBA 3101', 'title': 'Principles of Management', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'bba'},
            {'code': 'BBA 3102', 'title': 'Financial Accounting', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'bba'},
            {'code': 'BBA 3103', 'title': 'Business Communication', 'credit': 2.0, 'credit_hours': 2.0, 'dept': 'bba'},
            {'code': 'BBA 3201', 'title': 'Marketing Management', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'bba'},
            {'code': 'BBA 3202', 'title': 'Business Statistics', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'bba'},
            {'code': 'BBA 3301', 'title': 'Human Resource Management', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'bba'},
            {'code': 'CIV 3101', 'title': 'Structural Analysis', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'civ'},
            {'code': 'CIV 3102', 'title': 'Structural Analysis Lab', 'credit': 1.0, 'credit_hours': 1.0, 'dept': 'civ'},
            {'code': 'CIV 3103', 'title': 'Geotechnical Engineering', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'civ'},
            {'code': 'CIV 3104', 'title': 'Geotechnical Engineering Lab', 'credit': 1.0, 'credit_hours': 1.0, 'dept': 'civ'},
            {'code': 'CIV 3201', 'title': 'Fluid Mechanics', 'credit': 3.0, 'credit_hours': 3.0, 'dept': 'civ'},
            {'code': 'CIV 3202', 'title': 'Fluid Mechanics Lab', 'credit': 1.0, 'credit_hours': 1.0, 'dept': 'civ'},
            {'code': 'Math 3101', 'title': 'Mathematics-V', 'credit': 1.0, 'credit_hours': 1.0},
            {'code': 'Hum 3101', 'title': 'Industrial Law and Safety Management', 'credit': 1.0, 'credit_hours': 1.0}
        ]

        for data in course_data:
            try:
                code = data['code']
                title = data['title']
                credit = data['credit']
                credit_hours = data['credit_hours']
                dept_key = data.get('dept')
                
                # Get department by name
                if dept_key:
                    try:
                        department = Department.objects.get(department_name=dept_mapping[dept_key])
                    except Department.DoesNotExist:
                        self.stdout.write(self.style.WARNING(f"Department '{dept_mapping[dept_key]}' not found. Skipping course {code}"))
                        continue
                else:
                    department = None
                
                # Random semester and year
                semester = random.choice(semesters)
                year = random.choice(years)
                
                course, created = Course.objects.get_or_create(
                    code=code,
                    defaults={
                        'name': title,
                        'credit': credit,
                        'credit_hours': credit_hours,
                        'slug': slugify(f"{code}-{title}"),
                        'department': department,
                        'year': year,
                        'semester': semester,
                    }
                )

                if created:
                    dept_name = department.department_name if department else 'No Department'
                    self.stdout.write(self.style.SUCCESS(f'Successfully added course: {course.code} - {course.name} ({dept_name})'))
                    if teachers:
                        teacher = random.choice(teachers)
                        CourseTeacher.objects.create(course=course, teacher=teacher)
                        self.stdout.write(self.style.SUCCESS(f'  - Assigned teacher: {teacher}'))
                else:
                    self.stdout.write(self.style.WARNING(f'Course {course.code} - {course.name} already exists.'))

            except Exception as e:
                self.stdout.write(self.style.ERROR(f"Error adding course {data.get('code', '')}: {e}"))

        self.stdout.write("Default course data addition complete.")