from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator


class BlogSettings(models.Model):
    """Singleton blog automation configuration (use BlogSettings.load())."""

    enabled = models.BooleanField(default=False)
    posts_per_week = models.PositiveSmallIntegerField(
        default=3,
        validators=[MinValueValidator(1), MaxValueValidator(7)],
    )
    shopify_blog_id = models.CharField(max_length=64, blank=True, default="")
    store_name = models.CharField(max_length=255, blank=True, default="")
    store_domain = models.CharField(max_length=255, blank=True, default="")
    blog_author_name = models.CharField(
        max_length=255,
        blank=True,
        default="",
        help_text="Byline on Shopify blog articles (avoids default “Shopify API”). Falls back to store name.",
    )

    blog_list_url = models.URLField(blank=True, default="")
    description = models.TextField(blank=True, default="")
    target_audience = models.TextField(blank=True, default="")
    tone_description = models.TextField(
        blank=True, default="Professionell und informativ"
    )
    language = models.CharField(max_length=8, default="de")
    include_images = models.BooleanField(default=True)

    external_blog_inventory = models.JSONField(default=list, blank=True)
    external_blog_inventory_updated_at = models.DateTimeField(null=True, blank=True)
    external_blog_inventory_error = models.TextField(blank=True, default="")

    trending_topics = models.JSONField(default=list, blank=True)
    trending_topics_updated_at = models.DateTimeField(null=True, blank=True)
    trending_topics_error = models.TextField(blank=True, default="")

    last_run_at = models.DateTimeField(null=True, blank=True)
    last_run_status = models.CharField(max_length=32, blank=True, default="")
    last_run_error = models.TextField(blank=True, default="")

    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "Blog settings"
        verbose_name_plural = "Blog settings"

    def __str__(self) -> str:
        return self.store_name or "Blog settings"

    @classmethod
    def load(cls) -> "BlogSettings":
        obj, _ = cls.objects.get_or_create(pk=1)
        return obj

    def as_prompt_config(self) -> dict:
        from blogs.services.inventory_service import gather_existing_coverage

        coverage = gather_existing_coverage(self)
        return {
            "name": self.store_name or "Store",
            "domain": self.store_domain or "",
            "description": self.description,
            "target_audience": self.target_audience,
            "tone_description": self.tone_description,
            "language": self.language,
            "trending_topics": self.trending_topics or [],
            "existing_articles": coverage.get("link_targets", []),
        }


class BlogArticle(models.Model):
    STATUS_PLANNED = "planned"
    STATUS_GENERATING = "generating"
    STATUS_READY = "ready"
    STATUS_PUBLISHING = "publishing"
    STATUS_PUBLISHED = "published"
    STATUS_FAILED = "failed"

    STATUS_CHOICES = [
        (STATUS_PLANNED, "Planned"),
        (STATUS_GENERATING, "Generating"),
        (STATUS_READY, "Ready"),
        (STATUS_PUBLISHING, "Publishing"),
        (STATUS_PUBLISHED, "Published"),
        (STATUS_FAILED, "Failed"),
    ]

    title = models.CharField(max_length=500, blank=True, default="")
    slug = models.SlugField(max_length=200, blank=True, default="")
    content = models.TextField(blank=True, default="")
    meta_title = models.CharField(max_length=120, blank=True, default="")
    meta_description = models.CharField(max_length=320, blank=True, default="")
    tags = models.JSONField(default=list, blank=True)
    locale = models.CharField(max_length=8, default="de")

    target_keyword = models.CharField(max_length=255, blank=True, default="")
    secondary_keywords = models.JSONField(default=list, blank=True)
    scheduled_date = models.DateField(null=True, blank=True)
    calendar_week = models.PositiveSmallIntegerField(null=True, blank=True)

    status = models.CharField(
        max_length=20,
        choices=STATUS_CHOICES,
        default=STATUS_PLANNED,
        db_index=True,
    )
    featured_image_url = models.URLField(blank=True, default="")
    word_count = models.PositiveIntegerField(null=True, blank=True)
    keyword_density = models.DecimalField(
        max_digits=5, decimal_places=2, null=True, blank=True
    )
    internal_links = models.JSONField(default=list, blank=True)

    shopify_article_id = models.CharField(max_length=64, blank=True, default="")
    shopify_article_url = models.URLField(blank=True, default="")
    shopify_metafields = models.JSONField(default=dict, blank=True)

    generation_error = models.TextField(blank=True, default="")
    posted_at = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ["-created_at"]

    def __str__(self) -> str:
        return self.title or f"Article #{self.pk}"


class BlogArticleImage(models.Model):
    article = models.ForeignKey(
        BlogArticle,
        on_delete=models.CASCADE,
        related_name="images",
    )
    image_url = models.URLField(blank=True, default="")
    local_file = models.CharField(
        max_length=512,
        blank=True,
        default="",
        help_text="Relative path under MEDIA_ROOT; cleared after Shopify upload.",
    )
    alt_text = models.TextField(blank=True, default="")
    position = models.CharField(max_length=32, default="inline-1")
    prompt_used = models.TextField(blank=True, default="")
    generation_status = models.CharField(max_length=20, default="pending")
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["position"]

    def __str__(self) -> str:
        return f"{self.article_id} — {self.position}"


class BlogGenerationLog(models.Model):
    article = models.ForeignKey(
        BlogArticle,
        on_delete=models.CASCADE,
        related_name="generation_logs",
    )
    step = models.CharField(max_length=64)
    status = models.CharField(max_length=32)
    details = models.JSONField(default=dict, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["created_at"]
