from django.db import models
from django.contrib.auth.models import User
from django.utils.text import slugify


class JobPosting(models.Model):
    """
    Parent model to store company-level job posting information.
    This is shared across multiple positions in a multiple-hire scenario.
    """
    HIRING_TYPE = [
        ('single', 'Single Hire'),
        ('multiple', 'Multiple Positions'),
    ]
    
    employer = models.ForeignKey(User, on_delete=models.CASCADE, related_name='job_postings', null=True, blank=True)
    CompanyName = models.CharField(max_length=255)
    CompanyCountry = models.CharField(max_length=100)
    workEmail = models.EmailField()
    startDate = models.CharField(max_length=100)
    requirements = models.TextField(help_text="Experience, skills, and other requirements")
    hiring_type = models.CharField(max_length=20, choices=HIRING_TYPE, default='single')
    status = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        ordering = ['-created_at']
    
    def __str__(self):
        return f"{self.CompanyName} - {self.hiring_type}"


class Job(models.Model):
    """
    Position-level job information.
    For single hire: Has no reference to JobPosting (standalone)
    For multiple hires: References JobPosting parent
    """
    job_posting = models.ForeignKey(JobPosting, on_delete=models.CASCADE, related_name='positions', null=True, blank=True)
    
    # Position-specific fields
    title = models.CharField(max_length=255)
    seniority = models.CharField(max_length=100)
    monthlyBudget = models.CharField(max_length=100)
    Tags = models.JSONField(default=list, help_text="Required skills/technologies")
    
    # Company fields (for single hire or convenience)
    CompanyName = models.CharField(max_length=255)
    CompanyCountry = models.CharField(max_length=100)
    workEmail = models.EmailField()
    startDate = models.CharField(max_length=100)
    requirements = models.TextField(help_text="Experience, skills, and other requirements")
    
    # Slug for URL-friendly job details
    slug = models.SlugField(max_length=255, unique=False, db_index=True, help_text='Auto-generated slug for URL')
    
    # SEO & Meta fields
    meta_title = models.CharField(max_length=60, blank=True, help_text='SEO meta title (60 characters recommended)')
    meta_description = models.CharField(max_length=160, blank=True, help_text='SEO meta description (160 characters recommended)')
    og_title = models.CharField(max_length=255, blank=True, help_text='Open Graph title')
    og_description = models.CharField(max_length=160, blank=True, help_text='Open Graph description')
    og_image = models.ImageField(upload_to='job_og_images/', blank=True, null=True, help_text='Open Graph image')
    og_image_alt = models.CharField(max_length=255, blank=True, help_text='Alt text for OG image')
    
    status = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        ordering = ['-created_at']
    
    def __str__(self):
        return f"{self.title} at {self.CompanyName}"
    
    def generate_slug(self):
        """
        Generate slug in format: {title}-job-{company location}-{unique id}
        If duplicate exists, appends -1, -2, etc.
        """
        base_slug = f"{slugify(self.title)}-job-{slugify(self.CompanyCountry)}"
        slug = base_slug
        counter = 1
        
        # Check for duplicates and add counter if needed
        while Job.objects.filter(slug=slug).exclude(pk=self.pk).exists():
            slug = f"{base_slug}-{counter}"
            counter += 1
        
        return slug
    
    def generate_meta_title(self):
        """
        Generate meta title in format:
        {Seniority} {job title} Job {company location} - Hiring Now | Stafflyn {unique id}
        """
        # Get unique counter if slug has one
        slug = self.slug or self.generate_slug()
        slug_parts = slug.split('-')
        
        # Extract unique id from slug if exists (last part if numeric)
        unique_id = ""
        if slug_parts and slug_parts[-1].isdigit():
            unique_id = f" {slug_parts[-1]}"
        
        meta_title = f"{self.seniority} {self.title} Job {self.CompanyCountry} - Hiring Now | Stafflyn{unique_id}"
        # Truncate to 60 chars
        return meta_title[:60]
    
    def generate_meta_description(self):
        """
        Generate meta description in format:
        Apply for {Job Title} in {company Location}. {Seniority} role with salary up to {Salary}. Explore remote opportunities on Stafflyn.
        """
        meta_desc = f"Apply for {self.title} in {self.CompanyCountry}. {self.seniority} role with salary up to {self.monthlyBudget}. Explore remote opportunities on Stafflyn."
        # Truncate to 160 chars
        return meta_desc[:160]
    
    def save(self, *args, **kwargs):
        """Auto-generate slug and meta fields before saving."""
        if not self.slug:
            self.slug = self.generate_slug()
        
        if not self.meta_title:
            self.meta_title = self.generate_meta_title()
        
        if not self.meta_description:
            self.meta_description = self.generate_meta_description()
        
        # Set og_title to job title
        self.og_title = self.title
        
        # Set og_description to meta_description
        self.og_description = self.meta_description
        
        # Set default og_image if not provided
        if not self.og_image:
            self.og_image = 'job_og_images/default-job-og.png'  # Default OG image
        
        # Set og_image_alt if not provided
        if not self.og_image_alt:
            self.og_image_alt = f"{self.title} at {self.CompanyName}"
        
        super().save(*args, **kwargs)
