from django.db import models
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.conf import settings
from django.db import models
from django.conf import settings


class SystemLog(models.Model):

    ACTION_TYPES = (
        ('LOGIN', 'User Login'),
        ('LOGOUT', 'User Logout'),
        ('CREATE', 'Create Action'),
        ('UPDATE', 'Update Action'),
        ('DELETE', 'Delete Action'),
        ('PAYMENT', 'Payment Action'),
        ('ERROR', 'System Error'),
        ('OTHER', 'Other'),
    )

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True
    )

    action_type = models.CharField(max_length=50)
    description = models.TextField()
    ip_address = models.GenericIPAddressField(null=True, blank=True)

    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at']

    def __str__(self):
        return f"{self.action_type} - {self.created_at}"
        

class MediaResources(models.Model):
    file_name = models.CharField(max_length=255, blank = True)
    file = models.FileField(upload_to = 'resources', blank = True)
    uploaded_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.file_name or self.file.name


class Job(models.Model):
    JOB_TYPE_CHOICES = (
        ("FULL_TIME", "Full Time"),
        ("PART_TIME", "Part Time"),
        ("INTERNSHIP", "Internship"),
        ("CONTRACT", "Contract"),
    )

    title = models.CharField(max_length=255)
    company = models.CharField(max_length=255)
    location = models.CharField(max_length=255)
    job_type = models.CharField(max_length=20, choices=JOB_TYPE_CHOICES)
    description = models.TextField()
    application_link = models.URLField(blank=True, null=True)
    deadline = models.DateField()
    is_active = models.BooleanField(default=True)

    posted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True)
    is_notified = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title
     
     
class Donation(models.Model):
    STATUS_CHOICES = (
        ('PENDING', 'Pending'),
        ('SUCCESS', 'Success'),
        ('FAILED', 'Failed'),
    )

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
    phone_number = models.CharField(max_length=15, blank=True, null=True)
    amount = models.DecimalField(max_digits=10, decimal_places=2)
    reference = models.CharField(max_length=200, unique=True)
    status = models.CharField(
        max_length=10,
        choices=STATUS_CHOICES,
        default='PENDING'
    )
    transaction_id = models.CharField(max_length=200, blank=True, null=True)
    payment_channel = models.CharField(max_length=50, blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.user} - {self.amount}"


class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError("The Email field must be set")

        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError("Superuser must have is_staff=True.")
        if extra_fields.get('is_superuser') is not True:
            raise ValueError("Superuser must have is_superuser=True.")

        return self.create_user(email, password, **extra_fields)


class User(AbstractUser):
    ROLE_CHOICES = [
        ('ALUMNI', 'Alumni'),
        ('SECRETARIAT', 'Secretariat Staff'),
        ('ADMIN', 'Administrator'),
    ]

    username = None  # remove username
    email = models.EmailField(unique=True)

    role = models.CharField(max_length=20, choices=ROLE_CHOICES)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager() 

    def __str__(self):
        return self.email


class AlumniCategory(models.Model):
    CATEGORY_CHOICES = [
        ('CORE', 'Core'),
        ('ASSOCIATE', 'Associate'),
        ('HONORARY', 'Honorary'),
    ]

    name = models.CharField(max_length=20, choices=CATEGORY_CHOICES, unique=True)

    def __str__(self):
        return self.name

class AlumniChapter(models.Model):
    name = models.CharField(max_length=100)
    country = models.CharField(max_length=100)
    region = models.CharField(max_length=100, blank=True)
    city = models.CharField(max_length=100, blank=True)

    def __str__(self):
        return f"{self.name} ({self.country})"

class Alumni(models.Model):
    GENDER_CHOICES = [
        ('M', 'Male'),
        ('F', 'Female'),
        ('O', 'Other'),
    ]

    REGION_CHOICES = [
        ('Ahafo', 'Ahafo'),
        ('Ashanti', 'Ashanti'),
        ('Bono', 'Bono'),
        ('Central', 'Central'),
        ('Eastern', 'Eastern'),
        ('Greater Accra', 'Greater Accra'),
        ('Northern', 'Northern'),
        ('Upper East', 'Upper East'),
        ('Upper West', 'Upper West'),
        ('Volta', 'Volta'),
        ('Western', 'Western'),
        ('Western North', 'Western North'),
        ('Savannah', 'Savannah'),
        ('North East', 'North East'),
        ('Oti', 'Oti'),
    ]
    
    user = models.OneToOneField(
        'User',
        on_delete=models.CASCADE,
        related_name='alumni_profile'
    )

    # Personal Information
    full_name = models.CharField(max_length=150)
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
    contact_number = models.CharField(max_length=20)
    graduation_year = models.PositiveIntegerField()
    programme = models.CharField(max_length=150)
    
    passport = models.ImageField(upload_to='passports/', null=True, blank=True)

    region = models.CharField(
        max_length=50,
        choices=REGION_CHOICES,
        blank=True
    )

    category = models.ForeignKey('AlumniCategory', on_delete=models.SET_NULL, null=True, blank=True)
    chapter = models.ForeignKey('AlumniChapter', on_delete=models.SET_NULL, null=True, blank=True)

    verify = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_registered = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.full_name


class Qualification(models.Model):
    CERTIFICATE_CHOICES = [
        ('DIP', 'Diploma'),
        ('HND', 'HND'),
        ('BSC', 'Bachelor Degree'),
        ('MSC', 'Masters'),
        ('PHD', 'PhD'),
        ('CERT', 'Certificate'),
    ]

    alumni = models.ForeignKey(
        Alumni,
        on_delete=models.CASCADE,
        related_name='qualifications'
    )

    programme = models.CharField(max_length=150)
    certificate_type = models.CharField(max_length=10, choices=CERTIFICATE_CHOICES)
    graduation_year = models.PositiveIntegerField()

    def __str__(self):
        return f"{self.alumni.full_name} - {self.programme} ({self.graduation_year})"


class AcademicHistory(models.Model):
    alumni = models.ForeignKey(Alumni, on_delete=models.CASCADE, related_name='academic_records')

    student_id = models.CharField(max_length=50)
    degree = models.CharField(max_length=100)
    faculty = models.CharField(max_length=100)
    department = models.CharField(max_length=100)
    year_admitted = models.PositiveIntegerField()
    year_completed = models.PositiveIntegerField()

    def __str__(self):
        return f"{self.alumni.full_name} - {self.degree}"

class Employment(models.Model):
    alumni = models.ForeignKey(Alumni, on_delete=models.CASCADE, related_name='employment_records')

    employer = models.CharField(max_length=150)
    job_title = models.CharField(max_length=100)
    industry = models.CharField(max_length=100)
    employment_status = models.CharField(
        max_length=50,
        choices=[
            ('EMPLOYED', 'Employed'),
            ('SELF', 'Self-Employed'),
            ('UNEMPLOYED', 'Unemployed'),
        ]
    )
    start_year = models.PositiveIntegerField()
    is_current = models.BooleanField(default=True)

    def __str__(self):
        return f"{self.alumni.full_name} - {self.job_title}"


class AlumniEvent(models.Model):
    title = models.CharField(max_length=150)
    description = models.TextField()
    event_date = models.DateField()
    location = models.CharField(max_length=150)

    def __str__(self):
        return self.title


class EventParticipation(models.Model):
    alumni = models.ForeignKey(Alumni, on_delete=models.CASCADE)
    event = models.ForeignKey(AlumniEvent, on_delete=models.CASCADE)
    attended = models.BooleanField(default=False)
    registered_on = models.DateTimeField(auto_now_add=True)

