from django.contrib.postgres.fields import ArrayField
from django.db import models
from django.utils import timezone
from .constants import *


class User(models.Model):
    email = models.CharField(primary_key=True, blank=False, max_length=50)
    id = models.CharField(blank=False, max_length=25)
    user_type = ArrayField(models.CharField(blank=False, max_length=10), size=4, default=list, blank=False)


class Student(models.Model):
    id = models.CharField(blank=False, max_length=15, primary_key=True)
    roll_no = models.IntegerField(blank=False)
    name = models.CharField(blank=False, max_length=50)
    batch = models.CharField(max_length=10, choices=BATCH_CHOICES, blank=False)
    branch = models.CharField(choices=BRANCH_CHOICES, blank=False, max_length=10)
    phone_number = models.PositiveBigIntegerField(blank=True, default=None, null=True)
    resumes = ArrayField(models.CharField(null=True, default=None, max_length=100), size=10, default=list, blank=True)
    cpi = models.DecimalField(decimal_places=2, max_digits=4)


class Admin(models.Model):
    id = models.CharField(blank=False, max_length=15, primary_key=True)
    name = models.CharField(blank=False, max_length=50)


class Placement(models.Model):
    id = models.CharField(blank=False, primary_key=True, max_length=15)
    name = models.CharField(blank=False, max_length=50)
    address = models.CharField(blank=False, max_length=150)
    companyType = models.CharField(blank=False, max_length=50)
    website = models.CharField(blank=True, max_length=50)
    contact_person_name = models.CharField(blank=False, max_length=50)
    phone_number = models.PositiveBigIntegerField(blank=False)
    designation = models.CharField(blank=False, max_length=25, default=None, null=True)
    description = models.CharField(blank=False, max_length=200)
    start_date = models.DateField(blank=False, verbose_name="Start Date")
    city = models.CharField(blank=False, max_length=100, default="")
    city_type = models.CharField(blank=False, max_length=15, choices=OFFER_CITY_TYPE)
    compensation = models.IntegerField(blank=False)  # Job - Per Year
    compensation_details = models.CharField(blank=True, max_length=200)
    tier = models.CharField(blank=False, choices=TIERS, max_length=10, default=None, null=True)
    allowed_batch = ArrayField(
        models.CharField(max_length=10, choices=BATCH_CHOICES),
        size=TOTAL_BATCHES,
        default=list
    )
    allowed_branch = ArrayField(
        models.CharField(choices=BRANCH_CHOICES, blank=False, max_length=10),
        size=TOTAL_BRANCHES,
        default=list
    )
    attachments = ArrayField(
        models.CharField(max_length=100, blank=True),
        size=10,
        blank=True
    )
    rounds = ArrayField(
        models.CharField(max_length=25, blank=True),
        size=10,
    )
    additional_info = ArrayField(
        models.CharField(max_length=25, blank=True),
        size=10,
        blank=True
    )
    status = models.CharField(max_length=50, blank=False)
    rounds_details = models.JSONField(blank=True, default=dict)
    created_at = models.DateTimeField(blank=False, default=None, null=True)


class PlacementApplication(models.Model):
    id = models.CharField(blank=False, primary_key=True, max_length=15)
    placement = models.ForeignKey(Placement, blank=False, on_delete=models.RESTRICT, default=None, null=True)
    student = models.ForeignKey(Student, blank=False, on_delete=models.CASCADE)
    resume = models.CharField(max_length=100, blank=False, null=True, default=None)
    status = models.CharField(max_length=50, null=True, blank=True, default=None)
    additional_info = models.JSONField(blank=True, default=None, null=True)
    selected = models.BooleanField(null=True, default=None, blank=True)
    applied_at = models.DateTimeField(blank=False, default=None, null=True)

    def save(self, *args, **kwargs):
        ''' On save, add timestamps '''
        if not self.applied_at:
            self.applied_at = timezone.now()

        return super(PlacementApplication, self).save(*args, **kwargs)

    class Meta:
        verbose_name_plural = "Placement Applications"


class PrePlacementOffer(models.Model):
    id = models.AutoField(primary_key=True)
    student = models.ForeignKey(Student, on_delete=models.CASCADE, blank=False)
    company = models.CharField(max_length=50, blank=False)
    compensation = models.IntegerField(blank=False)  # Job - Per Year
    compensation_details = models.CharField(blank=True, max_length=200)
    tier = models.CharField(blank=False, choices=TIERS, max_length=10)
    designation = models.CharField(blank=False, max_length=25, default=None, null=True)
    accepted = models.BooleanField(default=None, null=True)