"""
Advanced SEO Models
Top-class SEO with meta tags, schema, sitemaps, redirects
"""
from django.db import models
from django.utils.text import slugify
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType


class SEOSettings(models.Model):
    """
    Per-page SEO settings
    """
    PAGE_TYPE_CHOICES = [
        ('HOME', 'Homepage'),
        ('PRODUCT', 'Product Page'),
        ('CATEGORY', 'Category Page'),
        ('BLOG', 'Blog Post'),
        ('CUSTOM', 'Custom Page'),
    ]
    
    page_type = models.CharField(max_length=20, choices=PAGE_TYPE_CHOICES)
    page_url = models.CharField(max_length=500, unique=True, help_text='URL path, e.g., /about/')
    
    # Meta Tags
    meta_title = models.CharField(max_length=70, help_text='Recommended: 50-60 characters')
    meta_description = models.TextField(max_length=160, help_text='Recommended: 150-160 characters')
    meta_keywords = models.TextField(blank=True, help_text='Comma-separated keywords')
    
    # Open Graph (Facebook)
    og_title = models.CharField(max_length=100, blank=True)
    og_description = models.TextField(max_length=200, blank=True)
    og_image = models.ImageField(upload_to='seo/og_images/', blank=True)
    og_type = models.CharField(max_length=50, default='website')
    
    # Twitter Card
    twitter_card = models.CharField(max_length=50, default='summary_large_image')
    twitter_title = models.CharField(max_length=100, blank=True)
    twitter_description = models.TextField(max_length=200, blank=True)
    twitter_image = models.ImageField(upload_to='seo/twitter_images/', blank=True)
    
    # Schema.org Markup
    schema_type = models.CharField(
        max_length=50,
        blank=True,
        help_text='e.g., Product, Article, WebPage'
    )
    schema_json = models.JSONField(blank=True, null=True, help_text='Custom schema.org JSON-LD')
    
    # Canonical & Indexing
    canonical_url = models.URLField(blank=True, help_text='Canonical URL if different from page_url')
    noindex = models.BooleanField(default=False, help_text='Prevent search engines from indexing')
    nofollow = models.BooleanField(default=False, help_text='Prevent search engines from following links')
    
    # Priority & Frequency (for sitemap)
    sitemap_priority = models.DecimalField(max_digits=2, decimal_places=1, default=0.5)
    sitemap_changefreq = models.CharField(
        max_length=20,
        choices=[
            ('always', 'Always'),
            ('hourly', 'Hourly'),
            ('daily', 'Daily'),
            ('weekly', 'Weekly'),
            ('monthly', 'Monthly'),
            ('yearly', 'Yearly'),
            ('never', 'Never'),
        ],
        default='weekly'
    )
    
    # Status
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        verbose_name = 'SEO Setting'
        verbose_name_plural = 'SEO Settings'
        ordering = ['page_url']
    
    def __str__(self):
        return f"{self.page_url} - {self.meta_title}"


class URLRedirect(models.Model):
    """
    301/302 Redirects for SEO
    """
    REDIRECT_TYPE_CHOICES = [
        ('301', '301 Permanent'),
        ('302', '302 Temporary'),
    ]
    
    old_url = models.CharField(max_length=500, unique=True)
    new_url = models.CharField(max_length=500)
    redirect_type = models.CharField(max_length=3, choices=REDIRECT_TYPE_CHOICES, default='301')
    
    is_active = models.BooleanField(default=True)
    hit_count = models.IntegerField(default=0, editable=False)
    
    created_at = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        verbose_name = 'URL Redirect'
        verbose_name_plural = 'URL Redirects'
    
    def __str__(self):
        return f"{self.old_url} → {self.new_url} ({self.redirect_type})"


class Theme(models.Model):
    """
    Multi-Theme Support
    """
    name = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True, blank=True)
    description = models.TextField(blank=True)
    
    # Theme Preview
    preview_image = models.ImageField(upload_to='themes/previews/', blank=True)
    
    # Theme Colors
    primary_color = models.CharField(max_length=7, default='#667eea', help_text='Hex color, e.g., #667eea')
    secondary_color = models.CharField(max_length=7, default='#764ba2')
    accent_color = models.CharField(max_length=7, default='#FF9900')
    text_color = models.CharField(max_length=7, default='#2d3748')
    background_color = models.CharField(max_length=7, default='#FFFFFF')
    
    # Typography
    font_family = models.CharField(
        max_length=100,
        default='Inter, sans-serif',
        help_text='Google Font or system font'
    )
    font_url = models.URLField(blank=True, help_text='Google Fonts URL')
    
    # Layout
    layout_type = models.CharField(
        max_length=20,
        choices=[
            ('default', 'Default'),
            ('boxed', 'Boxed'),
            ('wide', 'Wide'),
            ('minimal', 'Minimal'),
        ],
        default='default'
    )
    
    # Custom CSS/JS
    custom_css = models.TextField(blank=True)
    custom_js = models.TextField(blank=True)
    
    # Template Files
    header_template = models.CharField(max_length=200, default='themes/default/header.html')
    footer_template = models.CharField(max_length=200, default='themes/default/footer.html')
    home_template = models.CharField(max_length=200, default='themes/default/home.html')
    product_template = models.CharField(max_length=200, default='themes/default/product.html')
    
    # Status
    is_active = models.BooleanField(default=True)
    is_default = models.BooleanField(default=False)
    
    # Metadata
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        verbose_name = 'Theme'
        verbose_name_plural = 'Themes'
    
    def __str__(self):
        return self.name
    
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        
        # Ensure only one default theme
        if self.is_default:
            Theme.objects.filter(is_default=True).update(is_default=False)
        
        super().save(*args, **kwargs)
    
    @classmethod
    def get_active_theme(cls):
        """Get currently active theme"""
        from django.core.cache import cache
        
        theme = cache.get('active_theme')
        if not theme:
            theme = cls.objects.filter(is_default=True, is_active=True).first()
            if not theme:
                theme = cls.objects.filter(is_active=True).first()
            if theme:
                cache.set('active_theme', theme, 3600)  # Cache for 1 hour
        return theme


class RobotsRule(models.Model):
    """
    Robots.txt configuration
    """
    user_agent = models.CharField(max_length=100, default='*')
    disallow = models.TextField(blank=True, help_text='One path per line')
    allow = models.TextField(blank=True, help_text='One path per line')
    crawl_delay = models.IntegerField(blank=True, null=True, help_text='Seconds')
    
    is_active = models.BooleanField(default=True)
    
    class Meta:
        verbose_name = 'Robots.txt Rule'
        verbose_name_plural = 'Robots.txt Rules'
    
    def __str__(self):
        return f"Rule for {self.user_agent}"


class StructuredData(models.Model):
    """
    Schema.org Structured Data Templates
    """
    SCHEMA_CHOICES = [
        ('Organization', 'Organization'),
        ('Product', 'Product'),
        ('Article', 'Article'),
        ('BreadcrumbList', 'Breadcrumb'),
        ('FAQPage', 'FAQ Page'),
        ('Review', 'Review'),
        ('WebSite', 'Website'),
    ]
    
    name = models.CharField(max_length=200)
    schema_type = models.CharField(max_length=50, choices=SCHEMA_CHOICES)
    
    # Can be linked to specific object
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, blank=True, null=True)
    object_id = models.PositiveIntegerField(blank=True, null=True)
    content_object = GenericForeignKey('content_type', 'object_id')
    
    # Schema JSON-LD
    schema_data = models.JSONField(help_text='Schema.org JSON-LD data')
    
    # Apply to pages
    apply_to_all = models.BooleanField(default=False)
    apply_to_urls = models.TextField(blank=True, help_text='One URL per line')
    
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        verbose_name = 'Structured Data'
        verbose_name_plural = 'Structured Data'
    
    def __str__(self):
        return f"{self.name} ({self.schema_type})"
