from django.contrib.auth.models import User
from rest_framework import serializers
from .models import StatusUser, ProfileUser, DataKbm, NilaiKbm,  DataSekolahUtama, NamaSekolah, \
    Kelas, Mapel, Ekskul, DataSiswa, JadwalKbm, DataTahfizh, IbadahHarian, \
    DataEkskul, NilaiEkskul, MediaAjar, DataLoker, DataPenawaran, CatatanGuru, \
    KalendarKegiatan, KonfirmasiPembayaran, ImageSlider, Blog


class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email', 'first_name', 'last_name', 'is_staff')


class ProfileUserSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = ProfileUser
        fields = (
        'id', 'profile_user', 'name', 'ttl', 'no_hp', 'photo_user',
        'alamat_rumah', 'kelurahan', 'kecamatan', 'kota', 'provinsi', 'follows')

    @staticmethod
    def get_name(profileuser):
        return profileuser.profile_user.first_name


class StatusUserSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = StatusUser
        fields = ('id', 'user_id', 'name', 'is_free', 'is_premium', 'is_premium_end',
                  'registration_date', 'registration_premium_date', 'durasi_premium')

    @staticmethod
    def get_name(statususer):
        return statususer.user.username


class DataSekolahUtamaSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = DataSekolahUtama
        fields = ('id', 'nama_user', 'name', 'nama_sekolah', 'alamat_sekolah',
                  'kelurahan', 'kecamatan', 'kota', 'provinsi')

    @staticmethod
    def get_name(datasekolahutama):
        return datasekolahutama.nama_user.username


class NamaSekolahSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = NamaSekolah
        fields = ('id', 'nama_user', 'name', 'nama_sekolah')

    @staticmethod
    def get_name(namasekolah):
        return namasekolah.nama_user.first_name


class KelasSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = Kelas
        fields = ('id', 'nama_user', 'name', 'nama_kelas')

    @staticmethod
    def get_name(kelas):
        return kelas.nama_user.first_name


class MapelSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = Mapel
        fields = ('id', 'nama_user', 'name', 'nama_mapel')

    @staticmethod
    def get_name(mapel):
        return mapel.nama_user.first_name


class EkskulSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = Ekskul
        fields = ('id', 'nama_user', 'name', 'nama_ekskul')

    @staticmethod
    def get_name(ekskul):
        return ekskul.nama_user.first_name


class DataSiswaSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = DataSiswa
        fields = ('id', 'nama_user', 'name', 'nama_siswa', 'nama_sekolah',
                  'nama_kelas', 'nama_ekskul1', 'nama_ekskul2', 'nama_ekskul3')

    @staticmethod
    def get_name(datasiswa):
        return datasiswa.nama_user.first_name


class JadwalKbmSerializer(serializers.ModelSerializer):
    username = serializers.SerializerMethodField()

    class Meta:
        model = JadwalKbm
        fields = ('id', 'nama_user', 'username', 'nama_hari', 'awal_jam',
                  'akhir_jam', 'nama_sekolah', 'mapel', 'kelas', 'tahun_ajar')

    @staticmethod
    def get_username(jadwalkbm):
        return jadwalkbm.nama_user.username


class DataKbmSerializer(serializers.ModelSerializer):
    username = serializers.SerializerMethodField()

    class Meta:
        model = DataKbm
        fields = ('id', 'nama_user', 'username', 'tanggal', 'nama_sekolah',
                  'kelas', 'mapel', 'materi', 'kehadiran', 'keterangan',
                  'nama_siswa', 'tahun_ajar', 'semester_ajar')

    @staticmethod
    def get_username(datakbm):
        return datakbm.nama_user.username


class NilaiKbmSerializer(serializers.ModelSerializer):
    username = serializers.SerializerMethodField()

    class Meta:
        model = NilaiKbm
        fields = ('id', 'nama_user', 'username', 'tanggal', 'nama_sekolah',
                  'kelas', 'mapel', 'nama_tugas', 'jenis_nilai',
                  'nama_siswa', 'tahun_ajar', 'semester_ajar', 'nilai')

    @staticmethod
    def get_username(nilaikbm):
        return nilaikbm.nama_user.username


class DataTahfizhSerializer(serializers.ModelSerializer):
    username = serializers.SerializerMethodField()

    class Meta:
        model = DataTahfizh
        fields = ('id', 'nama_user', 'username', 'tanggal', 'waktu',
                  'nama_sekolah', 'kelas_halaqoh', 'nama_siswa',
                  'nama_surat_awal', 'nama_surat_akhir', 'awal_ayat',
                  'akhir_ayat', 'jumlah_ayat', 'jumlah_halaman', 'kehadiran')

    @staticmethod
    def get_username(datatahfizh):
        return datatahfizh.nama_user.username


class IbadahHarianSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = IbadahHarian
        fields = ('id', 'nama_user', 'name', 'tanggal', 'shalat_jamaah_subuh',
                  'shalat_jamaah_zuhur', 'shalat_jamaah_ashar', 'shalat_jamaah_maghrib',
                  'shalat_jamaah_isya', 'tahajud', 'dhuha' ,'puasa_sunnah',
                  'nama_siswa', 'nama_sekolah', 'kelas_halaqoh')

    @staticmethod
    def get_name(ibadahharian):
        return ibadahharian.nama_user.username


class DataEkskulSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = DataEkskul
        fields = ('id', 'nama_user', 'name', 'tanggal', 'nama_sekolah',
                  'kelas', 'nama_ekskul', 'materi', 'kehadiran', 'keterangan',
                  'nama_siswa', 'tahun_ajar', 'semester_ajar')

    @staticmethod
    def get_name(dataekskul):
        return dataekskul.nama_user.username


class NilaiEkskulSerializer(serializers.ModelSerializer):
    username = serializers.SerializerMethodField()

    class Meta:
        model = NilaiEkskul
        fields = ('id', 'nama_user', 'tanggal', 'username', 'nama_sekolah', 'kelas',
                  'nama_ekskul', 'nama_penilaian', 'jenis_nilai', 'tahun_ajar',
                  'semester_ajar', 'nama_siswa', 'nilai')

    @staticmethod
    def get_username(nilaieskul):
        return nilaieskul.nama_user.username


class MediaAjarSerializer(serializers.ModelSerializer):
    username = serializers.SerializerMethodField()

    class Meta:
        model = MediaAjar
        fields = ('id', 'nama_user', 'username', 'judul_media', 'sub_judul_media',
                  'preview_media', 'file_media', 'tipe_file', 'ukuran_file',
                  'jumlah_download', 'kategori_konten')

    @staticmethod
    def get_username(mediaajar):
        return mediaajar.nama_user.first_name

    def to_internal_value(self, data):
        # If 'image' is a string URL and we are updating, remove it from validation
        if self.instance and 'preview_media' in data and isinstance(data['preview_media'], str):
            if data['preview_media'].startswith('http') or '/media/' in data['preview_media']:
                # Drop it so DRF doesn't try to validate a string as a file
                data = data.copy()
                data.pop('preview_media')
            if self.instance and 'file_media' in data and isinstance(data['file_media'], str):
                if data['file_media'].startswith('http') or '/media/' in data['file_media']:
                    # Drop it so DRF doesn't try to validate a string as a file
                    data = data.copy()
                    data.pop('file_media')
        return super().to_internal_value(data)


class DataLokerSerializer(serializers.ModelSerializer):
    username = serializers.SerializerMethodField()

    class Meta:
        model = DataLoker
        fields = ('id', 'pemasang_loker', 'username', 'judul_loker', 'tanggal', 'nama_sekolah',
                  'deskripsi', 'nomor_kontak', 'alamat_loker', 'kelurahan',
                  'kecamatan', 'kota', 'provinsi', 'kategori')

    @staticmethod
    def get_username(dataloker):
        return dataloker.pemasang_loker.first_name


class DataPenawaranSerializer(serializers.ModelSerializer):
    username = serializers.SerializerMethodField()

    class Meta:
        model = DataPenawaran
        fields = ('id', 'nama_user', 'username', 'judul_penawaran',
                  'deskripsi_penawaran', 'agama', 'negara',
                  'riwayat_pendidikan', 'riwayat_organisasi', 'pengalaman_kerja',
                  'riwayat_prestasi', 'keahlian')

    @staticmethod
    def get_username(datapenawaran):
        return datapenawaran.nama_user.first_name


class CatatanGuruSerializer(serializers.ModelSerializer):
    username = serializers.SerializerMethodField()

    class Meta:
        model = CatatanGuru
        fields = ('id', 'nama_user', 'username',
                  'tanggal', 'judul_catatan', 'isi_catatan')

    @staticmethod
    def get_username(catatanguru):
        return catatanguru.nama_user.username


class KalendarKegiatanSerializer(serializers.ModelSerializer):
    username = serializers.SerializerMethodField()

    class Meta:
        model = KalendarKegiatan
        fields = ('id', 'nama_user', 'username', 'tanggal',
                  'tanggal_akhir', 'lokasi', 'waktu_awal',
                  'waktu_akhir', 'judul_kegiatan', 'deskripsi')

    @staticmethod
    def get_username(kalendarkegiatan):
        return kalendarkegiatan.nama_user.first_name


class BlogSerializer(serializers.ModelSerializer):
    username = serializers.SerializerMethodField()

    class Meta:
        model = Blog
        fields = ('id', 'nama_user', 'username', 'tanggal',
                  'judul', 'img_judul', 'kategori', 'deskripsi')

    @staticmethod
    def get_username(blog):
        return blog.nama_user.first_name


class KonfirmasiPembayaranSerializer(serializers.ModelSerializer):
    username = serializers.SerializerMethodField()

    class Meta:
        model = KonfirmasiPembayaran
        fields = ('id', 'nama_user', 'username', 'tanggal',
                  'kode_invoice', 'nama_bank', 'nomor_rek', 'nama_rek')

    @staticmethod
    def get_username(konfirmasipembayaran):
        return konfirmasipembayaran.nama_user.first_name


class ImageSliderSerializer(serializers.ModelSerializer):
    class Meta:
        model = ImageSlider
        fields = ('id', 'nama_user', 'judul_slide', 'sub_judul_slide', 'file_image')