from django.db import models
from django.contrib.auth.models import AbstractUser
from django.core.validators import MinValueValidator, MaxValueValidator

# --- Core Authentication & Profiles ---

class User(AbstractUser):
    ROLE_CHOICES = (
        ('admin', 'مدير'),
        ('teacher', 'معلم'),
        ('student', 'طالب'),
        ('community', 'المجتمع'),
    )
    role = models.CharField(max_length=15, choices=ROLE_CHOICES, default='community', verbose_name='الدور')

    class Meta:
        verbose_name = 'مستخدم'
        verbose_name_plural = 'المستخدمين'

class TeacherProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='teacher_profile', verbose_name='المستخدم')
    bio = models.TextField(verbose_name='نبذة تعريفية', blank=True)
    department = models.CharField(max_length=100, verbose_name='القسم') # e.g., Animal Production, Crops
    specialization = models.CharField(max_length=100, blank=True, verbose_name='التخصص الدقيق')
    photo = models.ImageField(upload_to='teachers/', blank=True, null=True, verbose_name='الصورة الشخصية')
    is_approved = models.BooleanField(default=False, verbose_name='معتمد (بانتظار موافقة الإدارة)')

    class Meta:
        verbose_name = 'ملف المعلم'
        verbose_name_plural = 'ملفات المعلمين'

    def __str__(self):
        return f"معلم: {self.user.get_full_name() or self.user.username}"

class StudentProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='student_profile', verbose_name='المستخدم')
    seat_number = models.CharField(max_length=20, unique=True, null=True, verbose_name='رقم الجلوس')
    class_level = models.CharField(max_length=50, verbose_name='المرحلة الدراسية')
    farm_plot_number = models.CharField(max_length=50, blank=True, verbose_name='رقم المقطع الزراعي')
    photo = models.ImageField(upload_to='students/', blank=True, null=True, verbose_name='الصورة الشخصية')
    is_approved = models.BooleanField(default=False, verbose_name='معتمد للعرض في الرئيسية')

    class Meta:
        verbose_name = 'ملف الطالب'
        verbose_name_plural = 'ملفات الطلاب'

    def __str__(self):
        return f"طالب: {self.user.get_full_name() or self.user.username}"

# --- Teacher Directory & Rating System ---

class Rating(models.Model):
    student = models.ForeignKey(StudentProfile, on_delete=models.CASCADE, verbose_name='الطالب')
    teacher = models.ForeignKey(TeacherProfile, on_delete=models.CASCADE, related_name='ratings', verbose_name='المعلم')
    clarity_score = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)], verbose_name='درجة وضوح الشرح')
    practical_score = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)], verbose_name='درجة الدعم العملي')
    professionalism_score = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)], verbose_name='درجة الاحترافية')
    comment = models.TextField(blank=True, verbose_name='تعليق')
    is_approved = models.BooleanField(default=False, verbose_name='معتمد (للنشر)')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='تاريخ التقييم')

    class Meta:
        unique_together = ('student', 'teacher')
        verbose_name = 'تقييم المعلم'
        verbose_name_plural = 'تقييمات المعلمين'

    def __str__(self):
        return f"تقييم من {self.student.user.username} لـ {self.teacher.user.username}"


# --- Student Academic Results ---

class SubjectResult(models.Model):
    EXAM_CHOICES = (
        ('first_term', 'الفصل الدراسي الأول'),
        ('second_term', 'الفصل الدراسي الثاني'),
        ('final', 'الاختبار النهائي'),
    )
    STATUS_CHOICES = (
        ('pass', 'ناجح'),
        ('fail', 'راسب'),
        ('absent', 'غائب'),
    )
    student = models.ForeignKey(StudentProfile, on_delete=models.CASCADE, related_name='results', verbose_name='الطالب')
    subject_name = models.CharField(max_length=100, verbose_name='اسم المادة')
    exam_period = models.CharField(max_length=20, choices=EXAM_CHOICES, default='first_term', verbose_name='الفصل الدراسي')
    academic_year = models.CharField(max_length=20, default='2025-2026', verbose_name='العام الدراسي')
    max_score = models.PositiveIntegerField(verbose_name='الدرجة الكاملة')
    student_score = models.PositiveIntegerField(verbose_name='درجة الطالب')
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='pass', verbose_name='الحالة')

    class Meta:
        verbose_name = 'نتيجة مادة'
        verbose_name_plural = 'نتائج الطلاب'
        ordering = ['subject_name']

    def __str__(self):
        return f"{self.student.user.get_full_name()} - {self.subject_name} ({self.exam_period})"

    @property
    def percentage(self):
        if self.max_score:
            return round((self.student_score / self.max_score) * 100, 1)
        return 0


# --- The "Agri-Market" ---

class Product(models.Model):
    name = models.CharField(max_length=200, verbose_name='اسم المنتج')
    description = models.TextField(verbose_name='الوصف')
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='السعر')
    stock_quantity = models.PositiveIntegerField(default=0, verbose_name='الكمية المتوفرة')
    image = models.ImageField(upload_to='products/', blank=True, null=True, verbose_name='صورة المنتج')
    is_active = models.BooleanField(default=True, verbose_name='نشط (متاح للبيع)')

    class Meta:
        verbose_name = 'منتج'
        verbose_name_plural = 'المنتجات (السوق الزراعي)'

    def __str__(self):
        return self.name

class Reservation(models.Model):
    STATUS_CHOICES = (
        ('reserved', 'محجوز'),
        ('picked_up', 'تم الاستلام'),
        ('cancelled', 'ملغي')
    )
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='المستخدم')
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name='المنتج')
    quantity = models.PositiveIntegerField(verbose_name='الكمية')
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='reserved', verbose_name='حالة الحجز')
    reserved_at = models.DateTimeField(auto_now_add=True, verbose_name='تاريخ الحجز')
    pickup_date = models.DateTimeField(verbose_name='تاريخ الاستلام')

    class Meta:
        verbose_name = 'حجز منتج'
        verbose_name_plural = 'حجوزات المنتجات'

    def __str__(self):
        return f"حجز {self.id} لـ {self.product.name}"

# --- Agricultural Features ---

class WikiPost(models.Model):
    CATEGORY_CHOICES = (
        ('scientific', '🔬 علمي'),
        ('practical', '🌿 عملي / زراعي'),
        ('cultural', '📚 ثقافي'),
        ('animal', '🐄 إنتاج حيواني'),
        ('soil', '🌍 علوم الأراضي'),
        ('food', '🍎 تصنيع غذائي'),
        ('news', '📰 أخبار المدرسة'),
    )

    title       = models.CharField(max_length=200, verbose_name='العنوان')
    slug        = models.SlugField(max_length=220, unique=True, allow_unicode=True, verbose_name='الرابط المختصر')
    category    = models.CharField(max_length=20, choices=CATEGORY_CHOICES, default='scientific', verbose_name='التصنيف')
    summary     = models.TextField(max_length=300, blank=True, verbose_name='ملخص المقال')
    content     = models.TextField(verbose_name='محتوى المقال')
    cover_image = models.ImageField(upload_to='wiki_covers/', blank=True, null=True, verbose_name='صورة الغلاف')
    author      = models.ForeignKey(TeacherProfile, on_delete=models.SET_NULL, null=True, related_name='wiki_posts', verbose_name='الكاتب')
    is_published = models.BooleanField(default=False, verbose_name='منشور')
    views_count  = models.PositiveIntegerField(default=0, verbose_name='عدد المشاهدات')
    created_at  = models.DateTimeField(auto_now_add=True, verbose_name='تاريخ النشر')
    updated_at  = models.DateTimeField(auto_now=True, verbose_name='آخر تعديل')

    class Meta:
        verbose_name = 'مقال'
        verbose_name_plural = 'المقالات'
        ordering = ['-created_at']

    def __str__(self):
        return self.title

    def get_category_display_icon(self):
        icons = {
            'scientific': '🔬', 'practical': '🌿', 'cultural': '📚',
            'animal': '🐄', 'soil': '🌍', 'food': '🍎', 'news': '📰',
        }
        return icons.get(self.category, '📄')

    @property
    def read_time(self):
        """Estimate read time in minutes (200 words/min)."""
        if not self.content:
            return 1
        word_count = len(self.content.split())
        minutes = max(1, round(word_count / 200))
        return minutes


class BlogEntry(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='الناشر') # Students or Teachers
    content = models.TextField(verbose_name='المحتوى')
    image = models.ImageField(upload_to='farm_blog/', blank=True, null=True, verbose_name='صورة مرفقة')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='تاريخ النشر')

    class Meta:
        verbose_name = 'تدوينة المزرعة'
        verbose_name_plural = 'يوميات المزرعة'

    def __str__(self):
        return f"تدوينة بواسطة {self.author.username} في {self.created_at}"


# --- Courses & Lessons ---

class Course(models.Model):
    LEVEL_CHOICES = (
        ('first', 'الصف الأول الثانوي الزراعي'),
        ('second', 'الصف الثاني الثانوي الزراعي'),
        ('third', 'الصف الثالث الثانوي الزراعي'),
        ('all', 'جميع المراحل'),
    )
    title       = models.CharField(max_length=200, verbose_name='عنوان الكورس')
    description = models.TextField(verbose_name='وصف الكورس', blank=True)
    teacher     = models.ForeignKey(TeacherProfile, on_delete=models.CASCADE, related_name='courses', verbose_name='المعلم')
    level       = models.CharField(max_length=20, choices=LEVEL_CHOICES, default='all', verbose_name='المرحلة الدراسية')
    cover_image = models.ImageField(upload_to='course_covers/', blank=True, null=True, verbose_name='صورة الغلاف')
    is_published = models.BooleanField(default=False, verbose_name='منشور')
    
    # Paid Course Features
    is_paid     = models.BooleanField(default=False, verbose_name='كورس مدفوع')
    price       = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name='سعر الكورس (ج.م)')
    payment_instructions = models.TextField(blank=True, verbose_name='تعليمات الدفع (فودافون كاش / انستا باي)')
    
    created_at  = models.DateTimeField(auto_now_add=True, verbose_name='تاريخ الإنشاء')
    updated_at  = models.DateTimeField(auto_now=True, verbose_name='آخر تحديث')

    class Meta:
        verbose_name = 'كورس'
        verbose_name_plural = 'الكورسات'
        ordering = ['-created_at']

    def __str__(self):
        return self.title

    @property
    def lessons_count(self):
        return self.lessons.count()


class Lesson(models.Model):
    course      = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='lessons', verbose_name='الكورس')
    title       = models.CharField(max_length=200, verbose_name='عنوان الدرس')
    description = models.TextField(blank=True, verbose_name='وصف مختصر')
    # Content types - teacher can use any or all
    text_content = models.TextField(blank=True, verbose_name='شرح نصي')
    video_url    = models.URLField(blank=True, verbose_name='رابط الفيديو (YouTube/غيره)')
    video_file   = models.FileField(upload_to='lesson_videos/', blank=True, null=True, verbose_name='ملف الفيديو')
    image        = models.ImageField(upload_to='lesson_images/', blank=True, null=True, verbose_name='صورة توضيحية')
    order        = models.PositiveIntegerField(default=1, verbose_name='ترتيب الدرس')
    created_at   = models.DateTimeField(auto_now_add=True, verbose_name='تاريخ الإضافة')

    class Meta:
        verbose_name = 'درس'
        verbose_name_plural = 'الدروس'
        ordering = ['order', 'created_at']

    def __str__(self):
        return f"{self.course.title} - {self.title}"

    @property
    def has_video(self):
        return bool(self.video_url or self.video_file)

    @property
    def has_image(self):
        return bool(self.image)

    @property
    def has_text(self):
        return bool(self.text_content.strip())

    def get_embed_url(self):
        """Convert various YouTube and other URL formats to a standard embed URL."""
        if not self.video_url:
            return None
        
        import re
        # Support for:
        # - youtube.com/watch?v=ID
        # - youtu.be/ID
        # - youtube.com/embed/ID
        # - youtube.com/v/ID
        # - youtube.com/shorts/ID
        yt_regex = r'(?:v=|/v/|/embed/|youtu\.be/|/shorts/|/watch\?v=)([^#&?]+)'
        match = re.search(yt_regex, self.video_url)
        
        if match:
            video_id = match.group(1)
            return f'https://www.youtube.com/embed/{video_id}'
        
        return self.video_url

class Enrollment(models.Model):
    STATUS_CHOICES = (
        ('pending', 'بانتظار الدفع / المراجعة'),
        ('active', 'نشط (تم الوصول)'),
        ('rejected', 'مرفوض'),
    )
    student = models.ForeignKey(StudentProfile, on_delete=models.CASCADE, related_name='enrollments', verbose_name='الطالب')
    course  = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='enrollments', verbose_name='الكورس')
    status  = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name='حالة الاشتراك')
    payment_screenshot = models.ImageField(upload_to='payments/', blank=True, null=True, verbose_name='صورة إيصال التحويل')
    enrolled_at = models.DateTimeField(auto_now_add=True, verbose_name='تاريخ الاشتراك')

    class Meta:
        unique_together = ('student', 'course')
        verbose_name = 'اشتراك كورس'
        verbose_name_plural = 'اشتراكات الكورسات'

    def __str__(self):
        return f"{self.student.user.username} في {self.course.title}"

class LessonCompletion(models.Model):
    student = models.ForeignKey(StudentProfile, on_delete=models.CASCADE, related_name='completions', verbose_name='الطالب')
    lesson  = models.ForeignKey(Lesson, on_delete=models.CASCADE, related_name='completions', verbose_name='الدرس')
    completed_at = models.DateTimeField(auto_now_add=True, verbose_name='تاريخ الإكمال')

    class Meta:
        unique_together = ('student', 'lesson')
        verbose_name = 'إكمال درس'
        verbose_name_plural = 'دروس مكتملة'

    def __str__(self):
        return f"{self.student.user.username} أكمل {self.lesson.title}"

# --- PDF Summaries ---

class PDFSummary(models.Model):
    LEVEL_CHOICES = (
        ('first', 'الصف الأول الثانوي الزراعي'),
        ('second', 'الصف الثاني الثانوي الزراعي'),
        ('third', 'الصف الثالث الثانوي الزراعي'),
        ('all', 'جميع المراحل'),
    )
    title = models.CharField(max_length=200, verbose_name='عنوان الملخص')
    description = models.TextField(verbose_name='الوصف', blank=True)
    pdf_file = models.FileField(upload_to='pdf_summaries/', verbose_name='ملف PDF')
    level = models.CharField(max_length=20, choices=LEVEL_CHOICES, default='third', verbose_name='المرحلة الدراسية')
    price = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name='السعر (ج.م)')
    payment_instructions = models.TextField(blank=True, verbose_name='تعليمات الدفع (فودافون كاش)')
    is_active = models.BooleanField(default=True, verbose_name='متاح للشراء')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='تاريخ الإضافة')

    class Meta:
        verbose_name = 'ملخص PDF'
        verbose_name_plural = 'ملخصات PDF'
        ordering = ['-created_at']

    def __str__(self):
        return self.title


class SummaryPurchase(models.Model):
    STATUS_CHOICES = (
        ('pending', 'بانتظار الدفع / المراجعة'),
        ('active', 'نشط (تم الوصول)'),
        ('rejected', 'مرفوض'),
    )
    student = models.ForeignKey(StudentProfile, on_delete=models.CASCADE, related_name='summary_purchases', verbose_name='الطالب')
    summary = models.ForeignKey(PDFSummary, on_delete=models.CASCADE, related_name='purchases', verbose_name='الملخص')
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name='حالة الشراء')
    payment_screenshot = models.ImageField(upload_to='summary_payments/', blank=True, null=True, verbose_name='صورة إيصال الدفع')
    purchased_at = models.DateTimeField(auto_now_add=True, verbose_name='تاريخ الشراء')

    class Meta:
        unique_together = ('student', 'summary')
        verbose_name = 'شراء ملخص'
        verbose_name_plural = 'مشتريات الملخصات'

    def __str__(self):
        return f"{self.student.user.username} - {self.summary.title}"

