import random
import os
from PIL import Image
import uuid
import string
from django.db import models
from .utils import apply_videsh_chalo_watermark
from django.db.models.signals import post_save
from django.utils.text import slugify
from django.contrib.auth.signals import user_logged_in
from django.dispatch import receiver
from django.core.mail import send_mail
from django.conf import settings
from django.utils import timezone
from .image_utils import compress_and_resize_inplace
from decimal import Decimal # ✅ Zaroori import calculations ke liye
from django.contrib import messages
from django.contrib.auth.models import AbstractUser
from .validators import validate_age_18, validate_mobile_number, validate_experience, validate_videsh_email, validate_file_size
from ckeditor.fields import RichTextField
from ckeditor_uploader.fields import RichTextUploadingField
from openpyxl import Workbook

# ==========================================
# 🧱 GLOBAL CHOICE LISTS (The Master Source)
# ==========================================
# Inhe top par rakhne se ye poori file ke liye "Open" ho gaye hain.

COUNTRY_CHOICES = [
    ('Dubai', 'Dubai 🇦🇪'),('Afghanistan', 'Afghanistan 🇦🇫'), ('Albania', 'Albania 🇦🇱'), ('Algeria', 'Algeria 🇩🇿'),
    ('Andorra', 'Andorra 🇦🇩'), ('Angola', 'Angola 🇦🇴'), ('Argentina', 'Argentina 🇦🇷'),
    ('Armenia', 'Armenia 🇦🇲'), ('Australia', 'Australia 🇦🇺'), ('Austria', 'Austria 🇦🇹'),
    ('Azerbaijan', 'Azerbaijan 🇦🇿'), ('Bahamas', 'Bahamas 🇧🇸'), ('Bahrain', 'Bahrain 🇧🇭'),
    ('Bangladesh', 'Bangladesh 🇧🇩'), ('Barbados', 'Barbados 🇧🇧'), ('Belarus', 'Belarus 🇧🇾'),
    ('Belgium', 'Belgium 🇧🇪'), ('Belize', 'Belize 🇧🇿'), ('Benin', 'Benin 🇧🇯'),
    ('Bhutan', 'Bhutan 🇧🇹'), ('Bolivia', 'Bolivia 🇧🇴'), ('Bosnia and Herzegovina', 'Bosnia and Herzegovina 🇧🇦'),
    ('Botswana', 'Botswana 🇧🇼'), ('Brazil', 'Brazil 🇧🇷'), ('Brunei', 'Brunei 🇧🇳'),
    ('Bulgaria', 'Bulgaria 🇧🇬'), ('Burkina Faso', 'Burkina Faso 🇧🇫'), ('Burundi', 'Burundi 🇧🇮'),
    ('Cambodia', 'Cambodia 🇰🇭'), ('Cameroon', 'Cameroon 🇨🇲'), ('Canada', 'Canada 🇨🇦'),
    ('Chad', 'Chad 🇹🇩'), ('Chile', 'Chile 🇨🇱'), ('China', 'China 🇨🇳'),
    ('Colombia', 'Colombia 🇨🇴'), ('Congo', 'Congo 🇨🇬'), ('Costa Rica', 'Costa Rica 🇨🇷'),
    ('Croatia', 'Croatia 🇭🇷'), ('Cuba', 'Cuba 🇨🇺'), ('Cyprus', 'Cyprus 🇨🇾'),
    ('Czech Republic', 'Czech Republic 🇨🇿'), ('Denmark', 'Denmark 🇩🇰'), ('Djibouti', 'Djibouti 🇩🇯'),
    ('Dominica', 'Dominica 🇩🇲'), ('Dominican Republic', 'Dominican Republic 🇩🇴'), ('Ecuador', 'Ecuador 🇪🇨'),
    ('Egypt', 'Egypt 🇪🇬'), ('El Salvador', 'El Salvador 🇸🇻'), ('Estonia', 'Estonia 🇪🇪'),
    ('Ethiopia', 'Ethiopia 🇪🇹'), ('Fiji', 'Fiji 🇫🇯'), ('Finland', 'Finland 🇫🇮'),
    ('France', 'France 🇫🇷'), ('Gabon', 'Gabon 🇬🇦'), ('Gambia', 'Gambia 🇬🇲'),
    ('Georgia', 'Georgia 🇬🇪'), ('Germany', 'Germany 🇩🇪'), ('Ghana', 'Ghana 🇬🇭'),
    ('Greece', 'Greece 🇬🇷'), ('Grenada', 'Grenada 🇬🇩'), ('Guatemala', 'Guatemala 🇬🇹'),
    ('Guinea', 'Guinea 🇬🇳'), ('Guyana', 'Guyana 🇬🇾'), ('Haiti', 'Haiti 🇭🇹'), ('Hongkong', 'Hongkong 🇭🇰'),
    ('Honduras', 'Honduras 🇭🇳'), ('Hungary', 'Hungary 🇭🇺'), ('Iceland', 'Iceland 🇮🇸'),
    ('India', 'India 🇮🇳'), ('Indonesia', 'Indonesia 🇮🇩'), ('Iran', 'Iran 🇮🇷'),
    ('Iraq', 'Iraq 🇮🇶'), ('Ireland', 'Ireland 🇮🇪'), ('Israel', 'Israel 🇮🇱'),
    ('Italy', 'Italy 🇮🇹'), ('Jamaica', 'Jamaica 🇯🇲'), ('Japan', 'Japan 🇯🇵'),
    ('Jordan', 'Jordan 🇯🇴'), ('Kazakhstan', 'Kazakhstan 🇰🇿'), ('Kenya', 'Kenya 🇰🇪'),
    ('Kuwait', 'Kuwait 🇰🇼'), ('Kyrgyzstan', 'Kyrgyzstan 🇰🇬'), ('Laos', 'Laos 🇱🇦'),
    ('Latvia', 'Latvia 🇱🇻'), ('Lebanon', 'Lebanon 🇱🇧'), ('Lesotho', 'Lesotho 🇱🇸'),
    ('Liberia', 'Liberia 🇱🇷'), ('Libya', 'Libya 🇱🇾'), ('Lithuania', 'Lithuania 🇱🇹'),
    ('Luxembourg', 'Luxembourg 🇱🇺'), ('Madagascar', 'Madagascar 🇲🇬'), ('Malawi', 'Malawi 🇲🇼'),
    ('Malaysia', 'Malaysia 🇲🇾'), ('Maldives', 'Maldives 🇲️🇻'), ('Mali', 'Mali 🇲🇱'),
    ('Malta', 'Malta 🇲🇹'), ('Mauritania', 'Mauritania 🇲🇷'), ('Mauritius', 'Mauritius 🇲🇺'),
    ('Mexico', 'Mexico 🇲🇽'), ('Moldova', 'Moldova 🇲🇩'), ('Monaco', 'Monaco 🇲🇨'),
    ('Mongolia', 'Mongolia 🇲🇳'), ('Montenegro', 'Montenegro 🇲🇪'), ('Morocco', 'Morocco 🇲🇦'),
    ('Mozambique', 'Mozambique 🇲🇿'), ('Myanmar', 'Myanmar 🇲🇲'), ('Namibia', 'Namibia 🇳🇦'),
    ('Nepal', 'Nepal 🇳🇵'), ('Netherlands', 'Netherlands 🇳🇱'), ('New Zealand', 'New Zealand 🇳🇿'),
    ('Nicaragua', 'Nicaragua 🇳🇮'), ('Niger', 'Niger 🇳🇪'), ('Nigeria', 'Nigeria 🇳🇬'),
    ('North Korea', 'North Korea 🇰🇵'), ('Norway', 'Norway 🇳🇴'), ('Oman', 'Oman 🇴🇲'),
    ('Pakistan', 'Pakistan 🇵🇰'), ('Panama', 'Panama 🇵🇦'), ('Papua New Guinea', 'Papua New Guinea 🇵🇬'),
    ('Paraguay', 'Paraguay 🇵🇾'), ('Peru', 'Peru 🇵🇪'), ('Philippines', 'Philippines 🇵🇭'),
    ('Poland', 'Poland 🇵🇱'), ('Portugal', 'Portugal 🇵🇹'), ('Qatar', 'Qatar 🇶🇦'),
    ('Romania', 'Romania 🇷🇴'), ('Russia', 'Russia 🇷🇺'), ('Rwanda', 'Rwanda 🇷🇼'),
    ('Saudi Arabia', 'Saudi Arabia 🇸🇦'), ('Senegal', 'Senegal 🇸🇳'), ('Serbia', 'Serbia 🇷🇸'),
    ('Singapore', 'Singapore 🇸🇬'), ('Slovakia', 'Slovakia 🇸🇰'), ('Slovenia', 'Slovenia 🇸🇮'),
    ('South Africa', 'South Africa 🇿🇦'), ('South Korea', 'South Korea 🇰🇷'), ('Spain', 'Spain 🇪🇸'),
    ('Sri Lanka', 'Sri Lanka 🇱🇰'), ('Sudan', 'Sudan 🇸🇩'), ('Sweden', 'Sweden 🇸🇪'),
    ('Switzerland', 'Switzerland 🇨🇭'), ('Syria', 'Syria 🇸🇾'), ('Taiwan', 'Taiwan 🇹🇼'),
    ('Tajikistan', 'Tajikistan 🇹🇯'), ('Tanzania', 'Tanzania 🇹🇿'), ('Thailand', 'Thailand 🇹🇭'),
    ('Tunisia', 'Tunisia 🇹🇳'), ('Turkey', 'Turkey 🇹🇷'), ('Turkmenistan', 'Turkmenistan 🇹🇲'),
    ('Uganda', 'Uganda 🇺🇬'), ('Ukraine', 'Ukraine 🇺🇦'), ('United Arab Emirates', 'United Arab Emirates 🇦🇪'),
    ('United Kingdom', 'United Kingdom 🇬🇧'), ('United States', 'United States 🇺🇸'), ('Uruguay', 'Uruguay 🇺🇾'),
    ('Uzbekistan', 'Uzbekistan 🇺🇿'), ('Vatican City', 'Vatican City 🇻🇦'), ('Venezuela', 'Venezuela 🇻🇪'),
    ('Vietnam', 'Vietnam 🇻🇳'), ('Yemen', 'Yemen 🇾🇪'), ('Zambia', 'Zambia 🇿🇲'), ('Zimbabwe', 'Zimbabwe 🇿🇼'),
]
    
ACCO_CHOICES = [
    ('Provided', 'Yes'),
    ('Not Provided', 'No'),
]    
FOOD_CHOICES = [
    ('Provided', 'Yes'),
    ('Not Provided', 'No'),
]
OVERTIME_CHOICES = [
    ('1 Hour', '1 Hour'),
    ('2 Hours', '2 Hours'),
    ('3 Hours', '3 Hours'),
    ('4 Hours', '4 Hours'),
    ('Not Allowed', 'Not Allowed'),
]
DAYOFF_CHOICES = [
    ('2 Days Off', 'Saturday and Sunday Off'),
    ('1 Day Off', 'Sunday Off'),
    ('1 Full and 1 Half Day Off', 'Sunday Off and Saturday Half-day'),
    ('1 Day Off', 'Friday Off'),
]
TRANSPORTATION_CHOICES = [
    ('Provided', 'Provided'),
    ('Not Provided', 'Not Provided'),
]
    
INDUSTRY_CHOICES = [
    ('Construction & Architecture', 'Construction & Architecture'),
    ('Mechanical', 'Mechanical'),
    ('Electrical', 'Electrical'),
    ('Maintenance & Technical', 'Maintenance & Technical'),
    ('Manufacturing & Factory', 'Manufacturing & Factory'),
    ('Driving & Transport', 'Driving & Transport'),
    ('Cleaning & Support', 'Cleaning & Support'),
    ('Healthcare & Medical', 'Healthcare & Medical'),
    ('Hospitality & Tourism', 'Hospitality & Tourism'),
    ('Oil & Gas', 'Oil & Gas'),
    ('Information Technology (IT) & Software', 'Information Technology (IT) & Software'),
    ('Finance & Banking', 'Finance & Banking'),
    ('Education & Training', 'Education & Training'),
    ('Sales & Marketing', 'Sales & Marketing'),
    ('Customer Service & Support', 'Customer Service & Support'),
    ('Creative & Design', 'Creative & Design'),
    ('Legal & Compliance', 'Legal & Compliance'),
    ('Human Resources (HR)', 'Human Resources (HR)'),
    ('Research & Development', 'Research & Development'),
    ('Telecommunications', 'Telecommunications'),
    ('Real Estate & Property Management', 'Real Estate & Property Management'),
    ('Media & Communications', 'Media & Communications'),
    ('Agriculture & Farming', 'Agriculture & Farming'),
    ('Other', 'Other'),
]
    
JOB_TYPE_CHOICES = [
    ('Full-time', 'Full-time'),
    ('Part-time', 'Part-time'),
    ('Contract', 'Contract'),
    ('Internship', 'Internship'),
]

WORKING_HOURS = [
    ('6 hours', '6 hours'),
    ('7 hours', '7 hours'),
    ('8 hours', '8 hours'),
    ('9 hours', '9 hours'),
    ('10 hours', '10 hours'),
    ('11 hours', '11 hours'),
    ('12 hours', '12 hours'),
]

CONTRACT_PERIOD = [
    ('6 months', '6 months'),
    ('1 year', '1 year'),
    ('2 years', '2 years'),
    ('3 years', '3 years'),
    ('4 years', '4 years'),
    ('5 years', '5 years'),
]
    
PCC = [
    ('Required', 'Required'),
    ('Not Required', 'Not Required'),
]
    
    # Status ke liye options define karo
STATUS_CHOICES = [
    ('Pending', 'Pending ⏳'),
    ('Viewed', 'Viewed 👁️'),
    ('Under Review', 'Under Review 🔍'),
    ('Approved', 'Selected ✅'),
    ('Visa Done', 'Visa Done 🧾'),
    ('Deployed', 'Deployed 🚀'),
    ('Paid', 'Referral Payment Done! 💰'),
    ('Rejected', 'Not Selected ❌'),
]    
    
# ==========================================
# 👥 USER & INFRASTRUCTURE MODELS
# ==========================================

class User(AbstractUser):
    full_name = models.CharField(max_length=100, blank=True, null=True)
    email = models.EmailField(max_length=100, blank=True, null=True, validators=[validate_videsh_email])
    is_recruiter = models.BooleanField(default=False)
    is_candidate = models.BooleanField(default=False)
    role_selected = models.BooleanField(default=False)

    def __str__(self):
        # ✅ CORRECTED: User ke liye uska naam ya username dikhna chahiye
        return self.full_name if self.full_name else self.username
        
class SiteHit(models.Model):
    """Har ek page visit ko record karne ke liye model"""
    timestamp = models.DateTimeField(auto_now_add=True)
    is_unique = models.BooleanField(default=False)
    path = models.CharField(max_length=255, null=True, blank=True) # Kaunsa page dekha

    def __str__(self):
        # ✅ CORRECTED: SiteHit ke liye timestamp aur uniqueness info
        return f"Hit at {self.timestamp} - Unique: {self.is_unique}"
        
# ==========================================
# 📊 NEW TRADE MASTER MODELS
# ==========================================

class IndustryMaster(models.Model):
    """Sari Industries ki Master List (Admin manage kar sakta hai)"""
    name = models.CharField(max_length=100, choices=INDUSTRY_CHOICES, unique=True)
    
    def __str__(self):
        return self.name
    
    class Meta:
        verbose_name_plural = "1. Master Industries"

class TradePosition(models.Model):
    """Specific Job Roles (Mason, Driver, Welder) linked to Industry"""
    industry = models.ForeignKey(IndustryMaster, on_delete=models.CASCADE, related_name='positions')
    title = models.CharField(max_length=100)
    
    # Isse hum track karenge ki ye "Verified" list se hai ya "Other" se user ne khud likha hai
    is_verified = models.BooleanField(default=True) 

    def __str__(self):
        return f"{self.title} ({self.industry.name})"

    class Meta:
        unique_together = ('industry', 'title') # Same industry mein duplicate title nahi chahiye
        verbose_name_plural = "2. Master Trades/Positions"
        
# ==========================================
# 💼 CORE BUSINESS MODELS
# ==========================================

class Job(models.Model):

    title = models.CharField(max_length=200, help_text="Example: Urgent Requirement for Mason")
    
    # ✅ NEW: Agar Position mein 'Other' select ho, toh ye field bhari jayegi
    other_position_name = models.CharField(
        max_length=100, 
        blank=True, 
        null=True, 
        help_text="Agar list mein post nahi hai toh yahan likhein"
    )
    
    # ✅ NEW: Agar Industry mein 'Other' select ho, toh ye field bhari jayegi
    other_industry_name = models.CharField(
        max_length=100, 
        blank=True, 
        null=True, 
        help_text="Agar list mein post nahi hai toh yahan likhein"
    )
    
    industry_master = models.ForeignKey(
        IndustryMaster, 
        on_delete=models.SET_NULL, 
        null=True, 
        blank=True,
        related_name='industry_jobs'
    )
    
    # ✅ NEW: Trade Position link
    position = models.ForeignKey(
        TradePosition, 
        on_delete=models.SET_NULL, 
        null=True, 
        blank=True,
        related_name='position_jobs'
    )
    is_closed = models.BooleanField(
        default=False, 
        help_text="Bhai, ise tab tick karein jab vacancy bhar gayi ho lekin aap SEO ke liye page live rakhna chahte hon."
    )
    closed_notice = models.CharField(
        max_length=255, 
        blank=True, 
        default="No longer accepting new applications!",
        help_text="User ko dikhne wala message."
    )
    redirect_to_job = models.ForeignKey(
        'self', 
        on_delete=models.SET_NULL, 
        null=True, 
        blank=True, 
        related_name='redirected_from',
        help_text="Wo naya job post chunein jahan aap user ko bhejna chahte hain."
    )
    meta_title = models.CharField(max_length=100, blank=True, help_text="Google pe dikhne wala title")
    meta_description = models.TextField(max_length=160, blank=True, help_text="Chota summary SEO ke liye")
    seo_keywords = models.CharField(max_length=255, blank=True, help_text="Keywords (comma se alag karein)")
    image_alt = models.CharField(max_length=255, blank=True, help_text="Image ke liye SEO alt text")
    job_code = models.CharField(max_length=10, unique=True, editable=False)
    slug = models.SlugField(max_length=300, unique=True, null=True, blank=True)
    sequence = models.PositiveIntegerField(default=0)
    is_featured = models.BooleanField(default=False, verbose_name="Featured Job (Paid)")
    is_active = models.BooleanField(default=True, help_text="Job ko site par dikhane ke liye tick karein")
    
    important_note= models.CharField(max_length=120, blank=True, null=True)
    image = models.ImageField(upload_to='job_images/', null=True, blank=True)
    class Meta:
        # Ye line sabse zaroori hai adminsortable2 ke liye
        ordering = ['sequence', '-is_featured']  # Featured jobs ko hamesha top pe rakho
        verbose_name_plural = "3. JobPost"
    
    def save(self, *args, **kwargs):
        # --- PHASE 1: SLUG GENERATION (SEO ke liye) ---
        if not self.slug:
            # Format: job-vacancy-for-title-in-country
            base_slug_text = f"job vacancy for {self.position.title} in {self.country} at videsh chalo"
            self.slug = slugify(base_slug_text)
            
            # Check for uniqueness (agar do same title/country wali jobs hon)
            original_slug = self.slug
            queryset = Job.objects.filter(slug=original_slug).exclude(pk=self.pk)
            counter = 1
            while queryset.exists():
                self.slug = f"{original_slug}-{counter}"
                counter += 1
                queryset = Job.objects.filter(slug=self.slug).exclude(pk=self.pk)
                
        # --- PHASE 2: JOB CODE GENERATION ---
        if not self.job_code or self.job_code == "":
            country_prefix = self.country[:2].upper() if self.country else "GL"
            random_num = random.randint(10, 99) 
            new_code = f"{country_prefix}-26{random_num}"
            
            while Job.objects.filter(job_code=new_code).exists():
                random_num = random.randint(10, 99)
                new_code = f"{country_prefix}-26{random_num}"
            
            self.job_code = new_code

        # --- PHASE 3: INITIAL SAVE (Zaroori hai taaki physical path mil sake) ---
        super().save(*args, **kwargs)

        # --- PHASE 4: SURGICAL IMAGE PROCESSING (Post-Save) ---
        # Note: In-place logic use kar rahe hain taaki naye suffixes (_abc123) na banein
        if self.image:
            try:
                # 1. Surgical Compression (Overwrites existing file)
                from .image_utils import compress_and_resize_inplace
                compress_and_resize_inplace(self.image, max_width=800, quality=70)
                
                # 2. Dynamic Watermarking (Overwrites again)
                from .utils import apply_videsh_chalo_watermark
                apply_videsh_chalo_watermark(self.image.path)
                
            except Exception as e:
                print(f"Error in Image Processing for Job {self.id}: {e}")
    
    # Job Details fields
    vacancies = models.IntegerField(default=1)
    country = models.CharField(max_length=100, choices=COUNTRY_CHOICES, default='Italy')
    age_limit = models.CharField(max_length=50, help_text="e.g., 18-45", default='18-45')
    contract_period = models.CharField(max_length=50, choices=CONTRACT_PERIOD, default='2 years')
    job_type = models.CharField(max_length=50, choices=JOB_TYPE_CHOICES,default='Full-time') # Full-time, etc.
    industry_old = models.CharField(max_length=100, choices=INDUSTRY_CHOICES, default='Other')
    experience = models.IntegerField(default=2)
    language = models.CharField(max_length=100)
    salary = models.CharField(max_length=100)
    PCC = models.CharField(max_length=100, choices=PCC, help_text="Police Clearance Certificate ki zarurat hai ya nahi", default='Required')
    overtime = models.CharField(max_length=50, choices=OVERTIME_CHOICES, default='Yes')
    working_hours = models.CharField(max_length=20, choices=WORKING_HOURS, default='9 hours')
    day_off = models.CharField(max_length=50,choices=DAYOFF_CHOICES,default='5 Days a Week')
    favorites = models.ManyToManyField(User, related_name='favorite_jobs', blank=True)
    posted_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posted_jobs', null=True, blank=True)
    is_approved = models.BooleanField(default=False)
    
    # Facilities
    accommodation = models.CharField(max_length=100,choices=ACCO_CHOICES,default='Yes')
    food = models.CharField(max_length=100,choices=FOOD_CHOICES,default='Yes')
    transportation = models.CharField(max_length=100,choices=TRANSPORTATION_CHOICES,default='Provided')

    # Rich Description (Backend mein editor setup karenge)
    description = RichTextUploadingField(blank=True, null=True, config_name='default')
    
    is_hot = models.BooleanField(default=False, verbose_name="Mark as Hot Job 🔥")
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.title} ({self.job_code})"
        
# Recruiter ke liye alag profile model taaki wo apni company details bhar sake

class RecruiterProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='recruiter_profile')
    company_name = models.CharField(max_length=200, null=True, blank=False, help_text="Aapki Firm ya Company ka naam")
    company_logo = models.ImageField(upload_to='company_logos/', null=True, blank=True)
    industry = models.CharField(max_length=100, choices=INDUSTRY_CHOICES, default='Other') # Industry zaroori hai
    company_description = RichTextField(null=True, blank=True)
    city = models.CharField(max_length=100, null=True, blank=True)
    website = models.URLField(null=True, blank=True)
    licence_number = models.CharField(max_length=100, null=True, blank=True)
    contact_person = models.CharField(max_length=100, null=True, blank=True) # HR ka naam
    whatsapp_number = models.CharField(max_length=15, null=True, blank=False)
    credits = models.IntegerField(default=5) # Har naye recruiter ko 5 free job posts milengi
    is_verified = models.BooleanField(default=False) # Admin verification ke liye

    def save(self, *args, **kwargs):
        # --- PHASE 1: INITIAL SAVE ---
        # Pehle database mein save hone dein taaki physical path (self.company_logo.path) mil sake
        super().save(*args, **kwargs)

        # --- PHASE 2: SURGICAL LOGO PROCESSING (Anti-Duplicate) ---
        if self.company_logo:
            try:
                # Nayi 'inplace' utility use kar rahe hain jo seedha physical file ko overwrite karti hai
                # Isse Django ko naya suffix banane ka mauka nahi milta
                from .image_utils import compress_and_resize_inplace
                compress_and_resize_inplace(self.company_logo, max_width=600, quality=75)
                
                print(f"SUCCESS: Recruiter Logo optimized for {self.company_name}")
            except Exception as e:
                # Agar koi error aaye toh log mein dikhe, par site na crash ho
                print(f"CRITICAL: Recruiter Logo Processing Failed: {e}")
    
    def __str__(self):
        return f"{self.company_name} ({self.user.username})"
        
    
class Application(models.Model):
    
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='my_applications', null=True, blank=True)
    job = models.ForeignKey(Job, on_delete=models.CASCADE, related_name='applications')
    full_name = models.CharField(max_length=100)
    email = models.EmailField(max_length=100, blank=True, null=True, validators=[validate_videsh_email])
    phone = models.CharField(max_length=15, validators=[validate_mobile_number], help_text="Example: +9198XXXXXXXX")
    resume = models.FileField(upload_to='resumes/', null=True, blank=True, validators=[validate_file_size])
    applied_at = models.DateTimeField(auto_now_add=True)
    status = models.CharField(
        max_length=20, 
        choices=STATUS_CHOICES, 
        default='Pending'
    )
    recruiter_message = models.TextField(blank=True, null=True, help_text="User ko kya karna hai yahan likhein")
    unlocked_by = models.ManyToManyField(User, related_name='unlocked_applications', blank=True)

    def save(self, *args, **kwargs):
        # --- PHASE 1: INITIAL SAVE ---
        # Pehle record save karein taaki resume ka physical path mil sake
        super().save(*args, **kwargs)

        # --- PHASE 2: SURGICAL RESUME PROCESSING (Anti-Duplicate) ---
        if self.resume:
            try:
                # 🛡️ SAFETY CHECK: Sirf images ko compress karein (PDF ko nahi)
                filename = self.resume.name.lower()
                if filename.endswith(('.jpg', '.jpeg', '.png')):
                    from .image_utils import compress_and_resize_inplace
                    
                    # Resumes ke liye 1200px width sahi hai taaki text saaf dikhe
                    compress_and_resize_inplace(self.resume, max_width=1200, quality=75)
                    
                    print(f"SUCCESS: Resume image optimized for {self.full_name}")
                else:
                    # Agar PDF hai toh bas skip kar dein, koi error nahi
                    pass
                    
            except Exception as e:
                print(f"CRITICAL: Application Resume Processing Failed: {e}")
    
    def __str__(self):
        return f"{self.full_name} - {self.job.title}"

@receiver(post_save, sender=Application)
def send_status_email(sender, instance, created, **kwargs):
    # Agar nayi application nahi hai (matlab purani update hui hai)
    if not created:
        subject = f"Update on your Application: {instance.job.title}"
        
        if instance.status == 'Approved':
            message = f"Ram Ram {instance.full_name}!\n\nBadhai ho! Aapka application {instance.job.title} ke liye SELECT ho gaya hai. Humari team aapse jald sampark karegi.\n\nRegards,\nTeam Videsh Chalo"
        elif instance.status == 'Rejected':
            message = f"Hello {instance.full_name},\n\nHumne aapka application review kiya. Humein khed hai ki abhi hum ise aage nahi badha pa rahe hain. Agli baar phir koshish karein.\n\nRegards,\nTeam Videsh Chalo"
        else:
            # Under Review ya Pending ke liye mail nahi bhejna toh return kar do
            return

        send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [instance.email])


class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='profile')
    # ✅ NEW: Candidate ka Trade aur Industry Organize karna
    preferred_industry = models.ForeignKey(
        IndustryMaster, 
        on_delete=models.SET_NULL, 
        null=True, 
        blank=True,
        related_name='candidate_industries'
    )
    preferred_position = models.ForeignKey(
        TradePosition, 
        on_delete=models.SET_NULL, 
        null=True, 
        blank=True,
        related_name='candidate_positions'
    )
    
    # ✅ NEW: Candidate ke liye bhi 'Other' option
    other_preferred_position = models.CharField(
        max_length=100, 
        blank=True, 
        null=True, 
        help_text="Aapka trade agar list mein nahi hai toh yahan likhein"
    )
    
    # ✅ NEW: Candidate ke liye bhi 'Other' option
    other_preferred_industry = models.CharField(
        max_length=100, 
        blank=True, 
        null=True, 
        help_text="Aapka trade agar list mein nahi hai toh yahan likhein"
    )
    
    # ✅ FIX: default='' hata diya, null=True kiya taaki trigger sahi chale
    # blank=False karne se ye mandatory ban jayega
    whatsapp_number = models.CharField(
        max_length=17, 
        blank=False, 
        null=True, 
        validators=[validate_mobile_number],
        help_text="Example: +9198XXXXXXXX"
    )
    
    email = models.EmailField(max_length=100, blank=True, null=True, validators=[validate_videsh_email])
    city = models.CharField(max_length=100, blank=True, null=True)
    avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
    GENDER_CHOICES = [('Male', 'Male'), ('Female', 'Female'), ('Other', 'Other')]
    gender = models.CharField(max_length=10, choices=GENDER_CHOICES, default='Male')
    dob = models.DateField(blank=True, null=True, validators=[validate_age_18], help_text="Aapki umar kam se kam 18 saal honi chahiye.", verbose_name="Date of Birth")
    skills = models.CharField(max_length=500, blank=True, null=True, help_text="Apni extra skills comma se alag likhein")
    qualification = models.CharField(max_length=200, blank=True, null=True)
    experience_years = models.IntegerField(default=0, validators=[validate_experience])
    state_choices = (("Andhra Pradesh","Andhra Pradesh"),("Arunachal Pradesh ","Arunachal Pradesh "),("Assam","Assam"),("Bihar","Bihar"),("Chhattisgarh","Chhattisgarh"),("Goa","Goa"),("Gujarat","Gujarat"),("Haryana","Haryana"),("Himachal Pradesh","Himachal Pradesh"),("Jammu and Kashmir ","Jammu and Kashmir "),("Jharkhand","Jharkhand"),("Karnataka","Karnataka"),("Kerala","Kerala"),("Madhya Pradesh","Madhya Pradesh"),("Maharashtra","Maharashtra"),("Manipur","Manipur"),("Meghalaya","Meghalaya"),("Mizoram","Mizoram"),("Nagaland","Nagaland"),("Odisha","Odisha"),("Punjab","Punjab"),("Rajasthan","Rajasthan"),("Sikkim","Sikkim"),("Tamil Nadu","Tamil Nadu"),("Telangana","Telangana"),("Tripura","Tripura"),("Uttar Pradesh","Uttar Pradesh"),("Uttarakhand","Uttarakhand"),("West Bengal","West Bengal"),("Andaman and Nicobar Islands","Andaman and Nicobar Islands"),("Chandigarh","Chandigarh"),("Dadra and Nagar Haveli","Dadra and Nagar Haveli"),("Daman and Diu","Daman and Diu"),("Lakshadweep","Lakshadweep"),("National Capital Territory of Delhi","National Capital Territory of Delhi"),("Puducherry","Puducherry"))
    state = models.CharField(max_length=100, choices=state_choices, blank=True, null=True)
    resume = models.FileField(upload_to='resumes/', null=True, blank=True, validators=[validate_file_size])
    last_seen = models.DateTimeField(null=True, blank=True)
    referred_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='referrals')

    def save(self, *args, **kwargs):
        # --- PHASE 1: INITIAL SAVE ---
        # Pehle database mein save karein taaki physical paths mil sakein
        super().save(*args, **kwargs)

        from .image_utils import compress_and_resize_inplace

        # --- PHASE 2: 📸 AVATAR SURGICAL COMPRESSION ---
        if self.avatar:
            try:
                # Avatar ko 500px tak optimize kar rahe hain (In-place)
                compress_and_resize_inplace(self.avatar, max_width=500, quality=70)
            except Exception as e:
                print(f"Error optimizing avatar for {self.user.username}: {e}")

        # --- PHASE 3: 📄 RESUME SURGICAL COMPRESSION (With PDF Guard) ---
        if self.resume:
            try:
                # Sirf tabhi compress karein jab worker ne photo (JPG/PNG) upload ki ho
                filename = self.resume.name.lower()
                if filename.endswith(('.jpg', '.jpeg', '.png')):
                    # Resume ke liye 1200px sahi hai taaki details clear rahein
                    compress_and_resize_inplace(self.resume, max_width=1200, quality=75)
            except Exception as e:
                print(f"Error optimizing resume for {self.user.username}: {e}")
    
@receiver(post_save, sender=User)
def manage_user_profile(sender, instance, created, **kwargs):
    
    if created:
        Profile.objects.create(user=instance)
        RecruiterProfile.objects.create(user=instance) # Har user ke saath ek recruiter profile bhi banao (wo bhar sakta hai ya nahi bhi bhar sakta)

class ContactMessage(models.Model):
    name = models.CharField(max_length=100)
    phone = models.CharField(max_length=15)
    message = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True) # Kab message aaya

    def __str__(self):
        return f"Message from {self.name}"
    
@receiver(user_logged_in)
def handle_pending_favorite(sender, request, user, **kwargs):
    # 1. URL uthao (GET aur POST dono check karo)
    next_url = request.GET.get('next') or request.POST.get('next') or ""
    print(f"DEBUG: Signal ke andar URL mili: '{next_url}'") 

    # 2. Agar URL mein '/favorite/' hai
    if '/favorite/' in next_url:
        try:
            # URL se ID nikaalne ka sabse desi aur pakka tarika
            # /favorite/2/ ko split karke '2' nikaalna
            parts = next_url.strip('/').split('/')
            # Parts kuch aise honge: ['favorite', '2']
            job_id = parts[-1] 
            
            print(f"DEBUG: Pehchani gayi Job ID: {job_id}")

            from .models import Job
            job = Job.objects.get(id=job_id)
            
            # Database mein entry kar do
            if not job.favorites.filter(id=user.id).exists():
                job.favorites.add(user)
                print(f"SUCCESS: {user.username} ke liye job {job.id} favorite ho gayi! ❤️")
            
        except Exception as e:
            print(f"ERROR: Kaam nahi hua kyunki: {e}")
        
# 1. REFERRAL WALLET MODEL
# Ye model har user ka 'Tijori' (Vault) hoga
class ReferralWallet(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='wallet')
    balance = models.DecimalField(max_digits=10, decimal_places=2, default=0.00) # Jo abhi nikal sakte hain
    total_earned = models.DecimalField(max_digits=10, decimal_places=2, default=0.00) # Aaj tak ki kul kamayi
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.user.username}'s Wallet - ₹{self.balance}"

# 2. TRANSACTION HISTORY MODEL
# Paisa kahan se aaya aur kahan gaya, uska pura 'Bahi-Khata'
class Transaction(models.Model):
    TRANSACTION_TYPES = (
        ('Credit', 'Credit (Paisa Aaya)'),
        ('Debit', 'Debit (Paisa Gaya)'),
    )
    wallet = models.ForeignKey(ReferralWallet, on_delete=models.CASCADE, related_name='transactions')
    amount = models.DecimalField(max_digits=10, decimal_places=2)
    transaction_type = models.CharField(max_length=10, choices=TRANSACTION_TYPES)
    description = models.CharField(max_length=255) # Jaise: "Referral bonus for Amit" ya "Withdrawal"
    timestamp = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return f"{self.transaction_type}: ₹{self.amount} for {self.wallet.user.username}"

# 3. WITHDRAWAL REQUEST MODEL
# Jab user paise nikalne ki request dalega
class WithdrawalRequest(models.Model):
    STATUS_CHOICES = (
        ('Pending', 'Pending (Intezar karein)'),
        ('Processing', 'Processing (Kaam chal raha hai)'),
        ('Completed', 'Completed (Paisa bhej diya)'),
        ('Rejected', 'Rejected (Mana kar diya)'),
    )
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    amount = models.DecimalField(max_digits=10, decimal_places=2)
    upi_id = models.CharField(max_length=100) # Google Pay / PhonePe / UPI ID
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='Pending')
    request_date = models.DateTimeField(auto_now_add=True)
    payment_date = models.DateTimeField(null=True, blank=True)
    admin_note = models.TextField(null=True, blank=True) # Agar reject hua toh wajah likhne ke liye

    def __str__(self):
        return f"Withdrawal: ₹{self.amount} by {self.user.username} ({self.status})"
        
# 1. CANDIDATE COIN WALLET
# NOTE: Ye sirf virtual V-Coins ke liye hai, real money ke liye ReferralWallet use karein.
class CandidateWallet(models.Model):
        user = models.OneToOneField(
            settings.AUTH_USER_MODEL, 
            related_name='coin_wallet', 
            on_delete=models.CASCADE
        )
        coins = models.IntegerField(default=0, help_text="Virtual V-Coins (Non-redeemable)")
        last_login_reward = models.DateField(null=True, blank=True)
        
        # --- ⏱️ TIME TRACKING FIELDS ---
        total_time_spent = models.IntegerField(default=0, help_text="Minutes spent in current active session")
        last_heartbeat = models.DateTimeField(null=True, blank=True, help_text="Last signal from browser")
        is_eligible_for_time_reward = models.BooleanField(default=True, help_text="Anti-fraud flag")
        
        updated_at = models.DateTimeField(auto_now=True)

        def __str__(self):
            return f"{self.user.username} - {self.coins} V-Coins"

# 2. COIN TRANSACTION HISTORY
class CoinTransaction(models.Model):
    TRANSACTION_TYPES = [
        ('Credit', 'Credit (Income)'),
        ('Debit', 'Debit (Expense)'),
    ]
    wallet = models.ForeignKey(CandidateWallet, on_delete=models.CASCADE, related_name='transactions')
    amount = models.IntegerField()
    transaction_type = models.CharField(max_length=10, choices=TRANSACTION_TYPES)
    reason = models.CharField(max_length=255) # e.g., "Signup Bonus", "Daily Login"
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.wallet.user.username} | {self.transaction_type} | {self.amount}"
        
# ---    NAYA: LUCKY WHEEL ACTIVITY MODEL ---
class LuckyWheelActivity(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    spin_date = models.DateField(default=timezone.now)
    win_amount = models.IntegerField(default=0)

    class Meta:
        # Ek banda ek din mein sirf ek hi baar spin kar sake
        unique_together = ('user', 'spin_date') 
        verbose_name_plural = "4. Lucky Wheel Activities"

    def __str__(self):
        return f"{self.user.username} won {self.win_amount} on {self.spin_date}"
        
class AIResumeSnapshot(models.Model):
    """
    VERSION 39.0: Freeze generated CV data for public verification.
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='ai_resumes')
    cv_data = models.JSONField() # Pura CV data (Summary, Exp, Edu) yahan save hoga
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"CV for {self.user.username} - {self.created_at.strftime('%Y-%m-%d')}"

    class Meta:
        verbose_name = "AI Resume Snapshot"
        verbose_name_plural = "AI Resume Snapshots"
        
# ==========================================
# 📊 NEWSPOST MASTER MODEL
# ==========================================

class NewsPost(models.Model):
    # 📑 Category choices for better filtering
    CATEGORY_CHOICES = [
        ('overseas', 'Overseas News'),
        ('gulf', 'Gulf News'),
        ('europe', 'Europe News'),
        ('africa', 'Africa News'),
        ('hiring', 'Hiring News'),
        ('government', 'Sarkari Jobs'),
        ('skills', 'Skill Training'),
        ('General', 'General News'),
        ('Viral', 'Viral Stories'),
        ('diaspora', 'Indian Diaspora News'),
        ('visa', 'Visa Alerts'),
        ('legal', 'Legal Alerts'),
    ]
    
    # ✅ Added Status: User review ke liye zaroori hai
    STATUS_CHOICES = [
        ('draft', 'Draft'),
        ('published', 'Published'),
    ]

    title = models.CharField(max_length=255)
    
    # 🔗 SEO-Friendly URL: Automatic generate hoga
    slug = models.SlugField(unique=True, blank=True, max_length=255)
    
    image = models.ImageField(upload_to='news_images/', help_text="Featured image (WhatsApp share par dikhegi)")
    # Remote image URL (backup agar download na ho paye)
    image_url = models.URLField(blank=True, null=True)
    image_alt = models.CharField(max_length=255, blank=True, help_text="Image ke liye SEO alt text")
    
    # ✍️ Premium Rich Text (CKEditor)
    content = RichTextUploadingField(config_name='default')
    
    # 🧠 AI SUMMARY: Chota nichod jo workers turant padh sakein
    short_description = RichTextField(max_length=700)

    category = models.CharField(max_length=20, choices=CATEGORY_CHOICES, default='overseas')
    
    # 🛡️ AUTHENTICITY: Source of information
    source_name = models.CharField(max_length=100, blank=True, help_text="Jaise: Gulf News, Indian Embassy")
    source_url = models.URLField(max_length=1000, blank=True, help_text="Asli khabar ka link (Verification ke liye)")
    
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
    
    # ✅ Unique ID from API: Taaki same news baar-baar na aaye
    api_id = models.CharField(max_length=255, unique=True, null=True, blank=True)
    
    # --- 🔥 NEW: SEO Section (Hybrid Control) ---
    meta_title = models.CharField(
        max_length=255, 
        blank=True, 
        help_text="Google ke liye custom title (Khali chhodne par news title use hoga)"
    )
    meta_description = models.TextField(
        max_length=160, 
        blank=True, 
        help_text="Google ke liye 1-2 lines ka nichod"
    )
    meta_keywords = models.CharField(
        max_length=255, 
        blank=True, 
        help_text="Job news, Saudi rules, etc. (Comma se separate karein)"
    )
    
    # 🔥 BREAKING NEWS: Site ticker par chamakne ke liye
    is_breaking = models.BooleanField(default=False)
    
    # 📊 ENGAGEMENT: Kitne logo ne padha?
    views_count = models.PositiveIntegerField(default=0)
    
    # 🕒 TIMESTAMPS
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    @property
    def category_slug(self):
        # 'Sarkari Jobs' ko 'sarkari-jobs' bana dega
        return slugify(self.get_category_display())

    def save(self, *args, **kwargs):
        # --- PHASE 1: 🔗 AUTO-SLUG (SEO ke liye) ---
        # Ise save se pehle hi rehne dete hain kyunki ye sirf text hai
        if not self.slug:
            self.slug = slugify(self.title)

        # --- PHASE 2: 💾 INITIAL DISK SAVE ---
        # Pehle record save karein taaki image ka physical 'path' mil sake
        super().save(*args, **kwargs)    

        # --- PHASE 3: 🚀 SURGICAL IMAGE PROCESSING (Post-Save) ---
        if self.image:
            try:
                # 1. Surgical Compression (In-place Overwrite)
                # Purane logic ki jagah naya 'inplace' function jo suffixes rokta hai
                from .image_utils import compress_and_resize_inplace
                compress_and_resize_inplace(self.image, max_width=1000, quality=75)

                # 2. Dynamic Watermarking
                # Ye bhi usi physical path par watermark lagayega bina naya suffix banaye
                from .utils import apply_videsh_chalo_watermark
                apply_videsh_chalo_watermark(self.image.path)
                
                print(f"SUCCESS: News Image optimized and watermarked: {self.title}")
                
            except Exception as e:
                # Agar watermark ya compression fail ho, toh log mein error dikhe
                print(f"CRITICAL: News Image Processing Error: {e}")

    def __str__(self):
        return self.title

    class Meta:
        ordering = ['-created_at'] # Nayi news hamesha upar
        verbose_name = "Rojgar News Post"
        verbose_name_plural = "5. Rojgar News Posts"

# ==========================================
# 📊 INDEXNOWL
# ==========================================
        
from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
from .indexnow_utils import notify_indexnow, notify_google_indexing

# 🧠 INTERNAL LOGIC: Check karne ke liye ki kya status badla hai
@receiver(pre_save, sender=NewsPost)
def track_news_status_change(sender, instance, **kwargs):
    if instance.pk:
        # Purana record hai, DB se purani state uthao
        try:
            old_instance = NewsPost.objects.get(pk=instance.pk)
            instance._old_status = old_instance.status
            instance._old_title = old_instance.title
        except NewsPost.DoesNotExist:
            instance._old_status = None
    else:
        # Naya record hai
        instance._old_status = None

@receiver(post_save, sender=NewsPost)
def smart_indexing_news(sender, instance, created, **kwargs):
    """
    Ping sirf tabhi jayega jab:
    1. Pehli baar Publish hua ho.
    2. Draft se Published mein convert hua ho.
    3. Title badla ho (taaki naya slug index ho sake).
    """
    is_now_published = (instance.status == 'published')
    was_draft = (getattr(instance, '_old_status', None) == 'draft')
    title_changed = (getattr(instance, '_old_title', '') != instance.title)

    if is_now_published and (created or was_draft or title_changed):
        # Category slug logic
        cat_slug = getattr(instance, 'category_slug', instance.category)
        full_url = f"https://www.videshchalo.com/news/{cat_slug}/{instance.slug}/"
        
        # 📡 Notify (Logic remains same, only print is cleaned)
        try:
            notify_indexnow([full_url])
            notify_google_indexing(full_url)
            # CLEAN PRINT: Emoji hataya gaya taaki UnicodeEncodeError na aaye
            print(f"SMART PING SUCCESS: News '{instance.title}' has been indexed.")
        except Exception as e:
            print(f"SMART PING ERROR: {str(e)}")

# --- Same logic for Jobs ---
@receiver(pre_save, sender=Job)
def track_job_status_change(sender, instance, **kwargs):
    if instance.pk:
        try:
            old_job = Job.objects.get(pk=instance.pk)
            instance._was_approved = old_job.is_approved
        except: instance._was_approved = False
    else: instance._was_approved = False

@receiver(post_save, sender=Job)
def smart_indexing_job(sender, instance, created, **kwargs):
    # Ping sirf tabhi jab Approve ho (pehli baar)
    is_approved_now = instance.is_approved
    was_not_approved = not getattr(instance, '_was_approved', False)

    if is_approved_now and (created or was_not_approved):
        full_url = f"https://www.videshchalo.com/{instance.slug}/"
        try:
            notify_indexnow([full_url])
            notify_google_indexing(full_url)
            # CLEAN PRINT: Emoji hataya gaya
            print(f"SMART PING SUCCESS: Job '{instance.title}' has been indexed.")
        except Exception as e:
            print(f"SMART PING ERROR: {str(e)}")

# ==========================================
# 📊 CountryBLOG GROQ
# ==========================================
            
class CountryGuide(models.Model):
    country_name = models.CharField(max_length=100, unique=True)
    content_html = models.TextField() # AI generated HTML content
    meta_description = models.CharField(max_length=255, blank=True)
    last_updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"Guide for {self.country_name}"

# ==========================================
# 📊 🔑 OTP SYSTEM MODEL
# ==========================================        

class FormOTP(models.Model):
    code = models.CharField(max_length=10, unique=True, help_text="Yash babu ye code recruiter ko denge.")
    is_used = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    used_at = models.DateTimeField(null=True, blank=True)

    def __str__(self):
        status = "Used" if self.is_used else "Active"
        return f"{self.code} ({status})"

    class Meta:
        verbose_name = "Form OTP"
        verbose_name_plural = "Form OTPs"

# 2. 📝 EMPLOYER REQUIREMENT DATA MODEL
class EmployerRequirement(models.Model):
    # Employer Information
    company_name = models.CharField(max_length=255)
    contact_person = models.CharField(max_length=255)
    
    # Job Details
    positions = models.TextField(help_text="Positions and count")
    total_vacancies = models.CharField(max_length=100)
    responsibilities = models.TextField()
    skills_required = models.TextField()
    english_level = models.CharField(max_length=100)
    working_schedule = models.CharField(max_length=255)
    
    # Salary & Benefits
    salary_range = models.CharField(max_length=255)
    overtime_details = models.CharField(max_length=255)
    bonuses = models.CharField(max_length=255)
    accommodation = models.CharField(max_length=255)
    food_allowance = models.CharField(max_length=255)
    transportation = models.CharField(max_length=255)
    
    # Travel & Legal
    airfare_bearer = models.TextField()
    visa_permit_provided = models.CharField(max_length=255)
    visa_processing_handler = models.CharField(max_length=255)
    medical_insurance = models.CharField(max_length=255)
    
    # Contract Terms
    contract_duration = models.CharField(max_length=255)
    probation_period = models.CharField(max_length=255)
    termination_conditions = models.TextField()
    paid_leave = models.CharField(max_length=255)
    
    # Living Conditions
    room_type = models.CharField(max_length=255)
    people_per_room = models.CharField(max_length=100)
    utilities_included = models.CharField(max_length=255)
    
    # Other
    annual_leave_tickets = models.CharField(max_length=255)
    salary_deductions = models.CharField(max_length=255)
    arrival_support = models.TextField()
    restrictions = models.TextField()

    submitted_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"Requirement from {self.company_name} - {self.submitted_at.date()}"

from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
from .push_utils import send_videsh_chalo_push

# 1. Bypassing 'Views Count' updates triggering push notifications
@receiver(pre_save, sender=Job)
def track_job_status_change(sender, instance, **kwargs):
    """ Track if is_approved just changed to True """
    if instance.pk:
        old_job = Job.objects.get(pk=instance.pk)
        instance._just_approved = not old_job.is_approved and instance.is_approved
    else:
        instance._just_approved = instance.is_approved

@receiver(post_save, sender=Job)
def smart_push_job_approval(sender, instance, created, **kwargs):
    """
    Logic: Notification tabhi jayega jab job nayi bani ho aur approved ho, 
    ya existing job abhi-abhi approve hui ho.
    """
    if getattr(instance, '_just_approved', False):
        try:
            # Removed print statement to avoid UnicodeEncodeError in production logs
            title = f"🚀 New Job: {instance.title}"
            message = f"Location: {instance.country} | Salary: ₹{instance.salary}. Jaldi apply karein!"
            url = f"https://www.videshchalo.com/{instance.slug}/"
            image = instance.image.url if instance.image else None
            
            # Fire and forget (Bina print kiye)
            send_videsh_chalo_push(title, message, url, image)
        except Exception:
            pass # Fail silently so user/admin experience isn't broken


@receiver(pre_save, sender=NewsPost)
def track_news_status_change(sender, instance, **kwargs):
    """ Track if status just changed to 'published' """
    if instance.pk:
        old_news = NewsPost.objects.get(pk=instance.pk)
        instance._just_published = old_news.status != 'published' and instance.status == 'published'
    else:
        instance._just_published = instance.status == 'published'

@receiver(post_save, sender=NewsPost)
def smart_push_news_publish(sender, instance, created, **kwargs):
    """
    Logic: Notification sirf tab jab news pehli baar publish ho.
    Views count update (post.save()) isey trigger nahi karega.
    """
    if getattr(instance, '_just_published', False):
        try:
            title = f"📰 News: {instance.title}"
            message = instance.short_description[:100] + "..." if instance.short_description else "Nayi khabar padhein!"
            url = f"https://www.videshchalo.com/news/{instance.category_slug}/{instance.slug}/"
            image = instance.image.url if instance.image else None
            
            send_videsh_chalo_push(title, message, url, image)
        except Exception:
            pass