from django.db import models
from django.utils import timezone
from io import BytesIO
from django.core.files.base import ContentFile
from django.core.exceptions import ValidationError


class Student(models.Model):
    STATUS_CHOICES = [
        ('L', 'Lulus'),
        ('T', 'Tidak Lulus'),
    ]

    nisn = models.CharField(max_length=20, unique=True)
    full_name = models.CharField(max_length=255)
    kelas = models.CharField(max_length=50, blank=True)
    photo = models.ImageField(upload_to='photos/', blank=True, null=True)
    status = models.CharField(max_length=1, choices=STATUS_CHOICES, default='T')
    issued_date = models.DateField(blank=True, null=True)

    tempat_lahir = models.CharField(max_length=255, blank=True, default="")
    tanggal_lahir = models.DateField(blank=True, null=True)

    nomor_sk = models.CharField(max_length=100, blank=True, null=True, unique=True)
    qr_code = models.ImageField(upload_to='qrcodes/', blank=True, null=True)

    # “barcode” untuk verifikasi surat (menggunakan QR sebagai representasi)
    sk_barcode = models.ImageField(upload_to='sk_barcodes/', blank=True, null=True)

    def __str__(self):
        return f"{self.full_name} ({self.nisn})"

    def generate_qr(self, text: str, filename: str):
        try:
            import qrcode
        except Exception:
            return None

        qr = qrcode.QRCode(box_size=10, border=2)
        qr.add_data(text)
        qr.make(fit=True)
        img = qr.make_image(fill_color='black', back_color='white')
        buffer = BytesIO()
        img.save(buffer, format='PNG')
        return ContentFile(buffer.getvalue(), name=filename)

    def save(self, *args, **kwargs):
        # Token verifikasi sesuai view verify_token()
        token = f"VERIF|{self.nisn}|{self.full_name}"

        # QR untuk verifikasi (token)
        qr_file = self.generate_qr(
            token,
            filename=f'qrcode-{self.nisn}.png'
        )
        if qr_file:
            self.qr_code = qr_file

        # “barcode” tanda tangan: encode ke URL verifikasi agar scan langsung menuju website verify
        # Menggunakan path relatif `/verify/<token>/` agar mengarah ke host yang sama (di aplikasi yang sama).
        sk_path = f"/verify/{token}/"
        sk_file = self.generate_qr(
            sk_path,
            filename=f'sk-barcode-{self.nisn}.png'
        )
        if sk_file:
            self.sk_barcode = sk_file

        super().save(*args, **kwargs)


class MadrasahProfile(models.Model):
    """
    Profile identitas madrasah yang dipakai untuk kop surat (harus single-row).
    """
    nama_madrasah = models.CharField(max_length=255)
    npsn = models.CharField(max_length=30, blank=True, default="")
    nsm = models.CharField(max_length=30, blank=True, default="")

    kepala_madrasah = models.CharField(max_length=255, blank=True, default="")
    alamat_sekolah = models.TextField(blank=True, default="")

    # Opsional: logo madrasah untuk kop surat
    logo = models.ImageField(upload_to="madrasah_logos/", blank=True, null=True)

    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "Identitas Madrasah"
        verbose_name_plural = "Identitas Madrasah"

    def __str__(self):
        return self.nama_madrasah

    def clean(self):
        # Pastikan hanya 1 record saja (kecuali update record yang sama)
        if not self.pk:
            if MadrasahProfile.objects.exists():
                raise ValidationError("Hanya boleh ada 1 data Identitas Madrasah di admin.")

        return super().clean()
