from django.contrib.auth.models import User
from django.db import models
from io import BytesIO
from PIL import Image
from django.core.exceptions import ValidationError
from easy_thumbnails.fields import ThumbnailerImageField
from tinymce.models import HTMLField

# Create your models here.

PILIHAN_HARI = [('Senin', 'Senin'), ('Selasa', 'Selasa'), ('Rabu', 'Rabu'), ('Kamis', 'Kamis'), ('Jumat', 'Jumat'), ('Sabtu', 'Sabtu')]

TAHUN_AJAR = [('2024-2025', '2025-2025'), ('2025-2026', '2025-2026')]

SEMESTER = [('Semester 1', 'Semester 1'), ('Semester 2', 'Semester 2')]

TIPE_FILE = [('PDF', 'PDF'), ('Word/Text', 'Word/Text'), ('Excel/CSV', 'Excel/CSV'), ('PPT', 'PPT'), ('Video', 'Video')]

KATEGORI_KONTEN = [('Free', 'Free'), ('Premium', 'Premium')]

KATEGORI_LOKER = [('Sekolah', 'Sekolah'), ('Bimbel', 'Bimbel'), ('Lembaga', 'Lembaga')]

KATEGORI_BLOG = [('Artikel', 'Artikel'), ('Tutorial', 'Tutorial'), ('Informasi', 'Informasi')]

PILIHAN_AKTIVITAS_SANTRI = [('IYA', 'IYA'), ('TIDAK', 'TIDAK')]


class StatusUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    is_free = models.BooleanField('free status', default=False)
    is_premium = models.BooleanField('premium status', default=False)
    is_premium_end = models.BooleanField('status akhir premium', default=False)
    registration_date = models.DateField()
    registration_premium_date = models.DateField(null=True, blank=False)
    durasi_premium = models.IntegerField(default=0)

    objects = models.Manager()

    class Meta:
        ordering = ('user',)

    def __str__(self):
        return str(self.user)


def user_directory_path(ProfileUser, filename):
    return 'user_{0}/{1}/{2}'.format(ProfileUser.profile_user.id, 'profil', filename)


class ProfileUser(models.Model):
    profile_user = models.OneToOneField(User, on_delete=models.CASCADE)
    ttl = models.CharField(max_length=30, null=True, blank=True, default='')
    no_hp = models.CharField(default='', max_length=25, null=False, blank=False)
    photo_user = models.ImageField(upload_to=user_directory_path, blank=True, null=True)
    alamat_rumah = models.TextField(max_length=500, null=True, blank=True, default='')
    kelurahan = models.TextField(max_length=500, null=True, blank=True, default='')
    kecamatan = models.TextField(max_length=500, null=True, blank=True, default='')
    kota = models.TextField(max_length=500, null=True, blank=True, default='')
    provinsi = models.TextField(max_length=500, null=True, blank=True, default='')
    follows = models.ManyToManyField("self", related_name="followed_by", symmetrical=False, blank=True)

    objects = models.Manager()

    class Meta:
        ordering = ('profile_user',)

    def __str__(self):
        return str(self.profile_user)

    def save(self, *args, **kwargs):
        if self.photo_user:
            self.perkecil_image()
        super().save(*args, **kwargs)

    def perkecil_image(self):
        try:
            with Image.open(self.photo_user) as img:

                output_img = BytesIO()
                #print("IMAGE", new_name)
                img.save(output_img, optimize=True, quality=30)
                # new_name = self.photo_user.name.split('.')[0] + '.png'
                self.photo_user.save(output_img)

        except FileNotFoundError:
            print(f"Error: Image file not found")
        except Exception as e:
            print(f"An error occurred: {e}")


class DataSekolahUtama(models.Model):
    nama_user = models.OneToOneField(User, on_delete=models.CASCADE)
    nama_sekolah = models.CharField(max_length=50, default="", null=False)
    alamat_sekolah = models.TextField(max_length=500, null=True, blank=True, default='')
    kelurahan = models.TextField(max_length=500, null=True, blank=True, default='')
    kecamatan = models.TextField(max_length=500, null=True, blank=True, default='')
    kota = models.TextField(max_length=500, null=True, blank=True, default='')
    provinsi = models.TextField(max_length=500, null=True, blank=True, default='')

    objects = models.Manager()

    class Meta:
        ordering = ('nama_user',)

    def __str__(self):
        return str(self.nama_user)


class NamaSekolah(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, default='')
    nama_sekolah = models.CharField(default='', max_length=100, blank=False, null=False)

    objects = models.Manager()

    class Meta:
        ordering = ('nama_user',)

    def __str__(self):
        return str(self.nama_user)


class Kelas(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, default='')
    nama_kelas = models.CharField(default='', max_length=100, blank=False, null=False)

    objects = models.Manager()

    class Meta:
        ordering = ('nama_user',)

    def __str__(self):
        return str(self.nama_user)


class Mapel(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, default='')
    nama_mapel = models.CharField(default='', max_length=100, blank=False, null=False)

    objects = models.Manager()

    class Meta:
        ordering = ('nama_user',)

    def __str__(self):
        return str(self.nama_user)


class Ekskul(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, default='')
    nama_ekskul = models.CharField(default='', max_length=100, blank=False, null=False)

    objects = models.Manager()

    class Meta:
        ordering = ('nama_user',)

    def __str__(self):
        return str(self.nama_user)


class DataSiswa(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, default='')
    nama_siswa = models.CharField(default='', max_length=100, blank=False, null=False)
    nama_sekolah = models.CharField(default='', max_length=100, blank=False, null=False)
    nama_kelas = models.CharField(default='', max_length=100, blank=False, null=False)
    nama_ekskul1 = models.CharField(default='', max_length=100, blank=True, null=True)
    nama_ekskul2 = models.CharField(default='', max_length=100, blank=True, null=True)
    nama_ekskul3 = models.CharField(default='', max_length=100, blank=True, null=True)

    objects = models.Manager()

    class Meta:
        ordering = ('nama_user',)

    def __str__(self):
        return str(self.nama_user)


class JadwalKbm(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, default='', unique=False)
    nama_hari = models.CharField(default='', max_length=15, choices=PILIHAN_HARI, blank=False, null=False)
    awal_jam = models.TimeField(blank=True, null=True)
    akhir_jam = models.TimeField(blank=True, null=True)
    nama_sekolah = models.CharField(default='', max_length=100, blank=False, null=False)
    mapel = models.CharField(default='', max_length=50, blank=False, null=False)
    kelas = models.CharField(default='', max_length=15, blank=False, null=False)
    tahun_ajar = models.CharField(default='', max_length=20, choices=TAHUN_AJAR, null=True)

    objects = models.Manager()

    class Meta:
        ordering = ('nama_user',)

    def __str__(self):
        return str(self.nama_user)


class DataKbm(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False)
    tanggal = models.DateField()
    nama_sekolah = models.CharField(default='', max_length=200)
    kelas = models.CharField(default='', max_length=20)
    mapel = models.CharField(default='', max_length=20)
    materi = models.CharField(default='', max_length=100)
    kehadiran = models.CharField(default='Hadir', max_length=10)
    keterangan = models.CharField(default='', max_length=100)
    nama_siswa = models.CharField(default='', max_length=200)
    tahun_ajar = models.CharField(default='', max_length=20, choices=TAHUN_AJAR, null=True)
    semester_ajar = models.CharField(default='', max_length=20, choices=SEMESTER, null=True)

    objects = models.Manager()

    class Meta:
        ordering = ('tanggal',)

    def __str__(self):
        return str(self.nama_user)


class NilaiKbm(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False, related_name="nilaikbm")
    tanggal = models.DateField()
    nama_sekolah = models.CharField(default='', max_length=200)
    kelas = models.CharField(default='', max_length=25)
    mapel = models.CharField(default='', max_length=100)
    nama_tugas = models.CharField(default='', max_length=300)
    jenis_nilai = models.CharField(default='', max_length=130)
    tahun_ajar = models.CharField(default='', max_length=20, choices=TAHUN_AJAR)
    semester_ajar = models.CharField(default='', max_length=20, choices=SEMESTER)
    nama_siswa = models.CharField(default='', max_length=200)
    nilai = models.IntegerField(default=0)

    objects = models.Manager()

    class Meta:
        ordering = ('tanggal',)

    def __str__(self):
        return str(self.nama_user)


class DataTahfizh(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False, related_name="datatahfizh")
    tanggal = models.DateField()
    waktu = models.TimeField(blank=True, null=True)
    nama_sekolah = models.CharField(default='', max_length=200)
    kelas_halaqoh = models.CharField(default='', max_length=200, blank=True, null=True)
    nama_siswa = models.CharField(default='', max_length=200)
    nama_surat_awal = models.CharField(max_length=40, default='Nama Surat Awal')
    nama_surat_akhir = models.CharField(max_length=40, default='Nama Surat Akhir')
    awal_ayat = models.IntegerField(default=0, blank=True, null=True)
    akhir_ayat = models.IntegerField(default=0, blank=True, null=True)
    jumlah_ayat = models.IntegerField(default=0, blank=True, null=True)
    jumlah_halaman = models.IntegerField(default=0, blank=True, null=True)
    kehadiran = models.CharField(max_length=10, default='Hadir', null=False, blank=False)

    objects = models.Manager()

    class Meta:
        ordering = ('-tanggal',)

    def __str__(self):
        return str(self.nama_user)


class IbadahHarian(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False, related_name="ibadahharian")
    tanggal = models.DateField(unique=False, blank=True, null=True)
    shalat_jamaah_subuh = models.CharField(choices=PILIHAN_AKTIVITAS_SANTRI, max_length=5, default='Tidak', blank=True, null=True)
    shalat_jamaah_zuhur = models.CharField(choices=PILIHAN_AKTIVITAS_SANTRI, max_length=5, default='Tidak', blank=True, null=True)
    shalat_jamaah_ashar = models.CharField(choices=PILIHAN_AKTIVITAS_SANTRI, max_length=5, default='Tidak', blank=True, null=True)
    shalat_jamaah_maghrib = models.CharField(choices=PILIHAN_AKTIVITAS_SANTRI, max_length=5, default='Tidak', blank=True, null=True)
    shalat_jamaah_isya = models.CharField(choices=PILIHAN_AKTIVITAS_SANTRI, max_length=5, default='Tidak', blank=True, null=True)
    tahajud = models.CharField(choices=PILIHAN_AKTIVITAS_SANTRI, max_length=5, default='Tidak', blank=True, null=True)
    dhuha = models.CharField(choices=PILIHAN_AKTIVITAS_SANTRI, max_length=5, default='Tidak', blank=True, null=True)
    puasa_sunnah = models.CharField(choices=PILIHAN_AKTIVITAS_SANTRI, max_length=5, default='Tidak', blank=True, null=True)
    nama_siswa = models.CharField(default='', max_length=200)
    nama_sekolah = models.CharField(default='', max_length=200)
    kelas_halaqoh = models.CharField(default='', max_length=200, blank=True, null=True)

    objects = models.Manager()

    class Meta:
        ordering =('-tanggal',)

    def __str__(self):
        return str(self.nama_user)


class DataEkskul(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False)
    tanggal = models.DateField()
    nama_sekolah = models.CharField(default='', max_length=200)
    kelas = models.CharField(default='', max_length=20)
    nama_ekskul = models.CharField(default='', max_length=20)
    materi = models.CharField(default='', max_length=100)
    kehadiran = models.CharField(default='Hadir', max_length=10)
    keterangan = models.CharField(default='', max_length=100)
    nama_siswa = models.CharField(default='', max_length=200)
    tahun_ajar = models.CharField(default='', max_length=20, choices=TAHUN_AJAR, null=True)
    semester_ajar = models.CharField(default='', max_length=20, choices=SEMESTER, null=True)

    objects = models.Manager()

    class Meta:
        ordering = ('tanggal',)

    def __str__(self):
        return str(self.nama_user)


class NilaiEkskul(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False, related_name="nilaiekskul")
    tanggal = models.DateField()
    nama_sekolah = models.CharField(default='', max_length=200)
    kelas = models.CharField(default='', max_length=25)
    nama_ekskul = models.CharField(default='', max_length=30)
    nama_penilaian = models.CharField(default='', max_length=30)
    jenis_nilai = models.CharField(default='', max_length=30)
    tahun_ajar = models.CharField(default='', max_length=20, choices=TAHUN_AJAR)
    semester_ajar = models.CharField(default='', max_length=20, choices=SEMESTER)
    nama_siswa = models.CharField(default='', max_length=200)
    nilai = models.IntegerField(default=0)

    objects = models.Manager()

    class Meta:
        ordering = ('tanggal',)

    def __str__(self):
        return str(self.nama_user)


def preview_media_ajar_directory(MediaAjar, filename):
    return '{0}/user_{1}/{2}/{3}'.format('preview_media_ajar', MediaAjar.nama_user.id, MediaAjar.judul_media, filename)


def file_media_ajar_directory(MediaAjar, filename):
    return '{0}/user_{1}/{2}/{3}'.format('file_media_ajar', MediaAjar.nama_user.id, MediaAjar.judul_media, filename)


class MediaAjar(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE)
    judul_media = models.CharField(max_length=100, null=False, blank=False, default='')
    sub_judul_media = models.CharField(default='', max_length=200, null=True, blank=True)
    preview_media = models.ImageField(upload_to=preview_media_ajar_directory, blank=True, null=True)
    file_media = models.FileField(upload_to=file_media_ajar_directory, blank=True, null=True)
    tipe_file = models.CharField(default='', max_length=200, null=True, blank=True, choices=TIPE_FILE)
    ukuran_file = models.CharField(default='', max_length=6, null=True, blank=True)
    jumlah_download = models.IntegerField(default=0)
    kategori_konten = models.CharField(max_length=20, choices=KATEGORI_KONTEN, default='Free')

    objects = models.Manager()

    class Meta:
        ordering = ('nama_user',)

    def __str__(self):
        return str(self.nama_user)


class DataLoker(models.Model):
    pemasang_loker = models.ForeignKey(User, on_delete=models.RESTRICT)
    judul_loker = models.CharField(max_length=200, blank=False, null=False)
    nama_sekolah = models.CharField(max_length=200, blank=False, null=False)
    tanggal = models.DateField()
    deskripsi = HTMLField(default='deskripsi loker', blank=True, null=True)
    nomor_kontak = models.CharField(max_length=200, blank=False, null=False, default='nomor kontak')
    alamat_loker = models.CharField(max_length=200, blank=True, null=True)
    kelurahan = models.CharField(max_length=500, null=True, blank=True, default='')
    kecamatan = models.CharField(max_length=500, null=True, blank=True, default='')
    kota = models.CharField(max_length=500, null=True, blank=True, default='')
    provinsi = models.CharField(max_length=500, null=True, blank=True, default='')
    kategori = models.CharField(choices=KATEGORI_LOKER, max_length=100, default='Sekolah')

    objects = models.Manager()

    class Meta:
        ordering = ('-tanggal',)

    def __str__(self):
        return str(self.judul_loker)


class DataPenawaran(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.RESTRICT)
    judul_penawaran = models.CharField(max_length=200, blank=False, null=False)
    deskripsi_penawaran = models.TextField(default='penawaran', null=True, blank=True)
    agama = models.CharField(max_length=200, blank=False, null=False)
    negara = models.CharField(max_length=200, blank=False, null=False)
    riwayat_pendidikan = models.TextField(default='pendidikan', blank=False, null=False)
    riwayat_organisasi = models.TextField(default='organisasi', null=True, blank=True)
    pengalaman_kerja = models.TextField(default='pengalaman', null=True, blank=True)
    riwayat_prestasi = models.TextField(default='prestasi', null=True, blank=True)
    keahlian = models.TextField(default='keahlian', null=True, blank=True)

    objects = models.Manager()

    class Meta:
        ordering = ('nama_user',)

    def __str__(self):
        return str(self.nama_user)


class CatatanGuru(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False)
    tanggal = models.DateField()
    judul_catatan = models.CharField(max_length=30, blank=True, null=True)
    isi_catatan = models.TextField(null=True, blank=True)

    objects = models.Manager()

    class Meta:
        ordering = ('nama_user',)

    def __str__(self):
        return str(self.nama_user)


class KalendarKegiatan(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False)
    tanggal = models.DateField()
    tanggal_akhir = models.DateField(blank=True, null=True)
    lokasi = models.CharField(max_length=200, blank=True, null=True)
    waktu_awal = models.TimeField()
    waktu_akhir = models.TimeField(null=True, blank=True)
    judul_kegiatan = models.CharField(max_length=200, blank=True, null=True)
    deskripsi = models.TextField(default='deskripsi', null=True, blank=True)

    objects = models.Manager()

    class Meta:
        ordering = ('nama_user',)

    def __str__(self):
        return str(self.nama_user)


def blog_directory_path(Blog, filename):
    return 'blog_{0}/{1}/{2}'.format(Blog.kategori, Blog.judul, filename)


class Blog(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False)
    tanggal = models.DateField()
    judul = models.CharField(max_length=500, blank=True, null=True)
    img_judul = ThumbnailerImageField(upload_to=blog_directory_path, blank=True, null=True)
    deskripsi = HTMLField(default='deskripsi', null=True, blank=True)
    kategori = models.CharField(choices=KATEGORI_BLOG, max_length=100, default='Artikel')

    objects = models.Manager()

    class Meta:
        ordering = ('-tanggal',)

    def __str__(self):
        return str(self.nama_user)


class KonfirmasiPembayaran(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False)
    tanggal = models.DateField()
    kode_invoice = models.CharField(max_length=30, blank=True, null=True)
    nama_bank = models.CharField(blank=True, null=True, max_length=100)
    nomor_rek = models.CharField(blank=True, null=True, max_length=50)
    nama_rek = models.CharField(blank=True, null=True, max_length=50)

    objects = models.Manager()

    class Meta:
        ordering = ('tanggal',)

    def __str__(self):
        return str(self.nama_user)


def slide_image_directory(Slider, filename):
    return '{0}/{1}/{2}'.format('file_slide_img', Slider.nama_user, filename)


class ImageSlider(models.Model):
    nama_user = models.ForeignKey(User, on_delete=models.CASCADE)
    judul_slide = models.CharField(max_length=100, null=True, blank=True, default='')
    sub_judul_slide = models.CharField(default='', max_length=200, null=True, blank=True)
    file_image = models.FileField(upload_to=slide_image_directory, blank=False, null=False)

    objects = models.Manager()

    class Meta:
        ordering = ('judul_slide',)

    def __str__(self):
        return str(self.nama_user)


