"""Données de démonstration pour un environnement de développement vide.

    python manage.py seed_demo

Refuse de s'exécuter si des articles existent déjà (aucune donnée n'est écrasée).
"""

import random
from datetime import timedelta
from io import BytesIO

from django.conf import settings
from django.core.files.uploadedfile import SimpleUploadedFile
from django.core.management.base import BaseCommand, CommandError
from django.utils import timezone
from PIL import Image, ImageDraw

from apps.accounts.models import Role, User
from apps.ads.models import Publicite
from apps.editorial.models import Annonce, Article, Status
from apps.engagement.models import Comment
from apps.medialib.services import create_asset
from apps.taxonomy.models import Category, Tag

CATEGORIES = [
    ("Politique", 1), ("Société", 2), ("Économie", 3), ("Environnement", 4),
    ("Sport", 5), ("Culture", 6), ("International", None),
]
TITLES = [
    "Cotonou accélère la modernisation de son réseau routier",
    "Agriculture : les coopératives du Zou misent sur la transformation locale",
    "Assemblée nationale : le budget 2027 adopté après trois jours de débats",
    "Santé : une campagne de vaccination touche plus de 200 000 enfants",
    "Le port autonome de Cotonou enregistre un trafic record",
    "Environnement : la lagune de Porto-Novo au cœur d'un plan de sauvegarde",
    "Football : les Guépards préparent les éliminatoires de la CAN",
    "Culture : le festival Vodun Days attire un public international",
    "Numérique : les start-up béninoises lèvent des fonds records",
    "Éducation : 1 200 nouvelles salles de classe livrées cette année",
    "Énergie solaire : une centrale de 50 MW inaugurée à Illoupko",
    "Tourisme : la Route des pêches se dote de nouveaux équipements",
]
PALETTE = [(11, 31, 58), (18, 48, 90), (29, 78, 137), (200, 16, 46), (242, 183, 5), (22, 62, 110)]


def fake_image(label, size=(1600, 900)):
    img = Image.new("RGB", size, random.choice(PALETTE))
    d = ImageDraw.Draw(img)
    for i in range(0, size[0], 80):
        d.line([(i, 0), (i - 400, size[1])], fill=(255, 255, 255, 30), width=2)
    d.rectangle([60, size[1] - 160, size[0] - 60, size[1] - 60], fill=(7, 20, 42))
    d.text((90, size[1] - 125), label[:60], fill=(242, 183, 5))
    buf = BytesIO()
    img.save(buf, "JPEG", quality=80)
    return SimpleUploadedFile(f"{label[:30]}.jpg", buf.getvalue(), content_type="image/jpeg")


PARAGRAPH = (
    "<p>Selon les informations recueillies par notre rédaction, cette initiative s'inscrit dans une dynamique "
    "de long terme. Les acteurs de terrain saluent une avancée attendue, tout en appelant à la vigilance sur la mise en œuvre.</p>"
)


class Command(BaseCommand):
    help = "Crée des données de démonstration (développement uniquement)."

    def add_arguments(self, parser):
        parser.add_argument("--force", action="store_true", help="Autoriser hors DEBUG.")

    def handle(self, *args, **opts):
        if not settings.DEBUG and not opts["force"]:
            raise CommandError("Commande réservée au développement (utilisez --force pour passer outre).")
        if Article.objects.exists():
            raise CommandError("Des articles existent déjà : aucune donnée de démonstration n'a été créée.")
        random.seed(42)
        now = timezone.now()

        admin = User.objects.create_superuser("admin@labelinfo.test", "admin1234", name="Administrateur Démo")
        editeur = User.objects.create_user("editeur@labelinfo.test", "editeur1234", name="Awa Dossou", role=Role.EDITEUR,
                                           fonction="Rédactrice en chef", bio="Journaliste depuis 15 ans, spécialiste des questions politiques.")
        redac = User.objects.create_user("redacteur@labelinfo.test", "redacteur1234", name="Koffi Agbo", role=Role.REDACTEUR,
                                         fonction="Reporter")

        cats = [Category.objects.create(nom=n, est_dans_menu=o is not None, ordre=o) for n, o in CATEGORIES]
        tags = [Tag.objects.create(nom=n) for n in ["Bénin", "Cotonou", "Jeunesse", "Innovation", "Afrique de l'Ouest", "Élections"]]

        for i, titre in enumerate(TITLES):
            img = create_asset(fake_image(titre), user=editeur, collection="articles", credit="© Label Info TV")
            statut = Status.PUBLIE if i < 9 else [Status.BROUILLON, Status.RELECTURE, Status.PUBLIE][i - 9]
            publie_le = now - timedelta(hours=i * 7) if statut == Status.PUBLIE else None
            if i == 11:
                publie_le = now + timedelta(days=1)
            a = Article.objects.create(
                titre=titre, resume="Un point complet sur un sujet qui mobilise l'actualité nationale cette semaine.",
                contenu=PARAGRAPH * 4 + "<h2>Les enjeux</h2>" + PARAGRAPH * 2 + "<blockquote><p>« Une étape décisive pour le pays. »</p></blockquote>" + PARAGRAPH,
                categorie=cats[i % len(cats)], auteur=redac if i % 3 == 0 else editeur, statut=statut, publie_le=publie_le,
                image_principale=img, legende_image="Illustration — Label Info TV", est_a_la_une=i < 4, est_flash_info=i < 6, vues=random.randint(50, 5000),
            )
            a.tags.set(random.sample(tags, 2))
            if statut == Status.RELECTURE:
                a.soumis_le = now
                a.save(update_fields=["soumis_le"])
            if statut == Status.PUBLIE and i < 3:
                c = Comment.objects.create(article=a, nom="Lecteur attentif", email="lecteur@example.com",
                                           contenu="Merci pour cet article très clair.", statut=Comment.Status.APPROUVE)
                Comment.objects.create(article=a, parent=c, user=editeur, contenu="Merci pour votre fidélité !", statut=Comment.Status.APPROUVE)
                Comment.objects.create(article=a, nom="Visiteur", email="v@example.com", contenu="Et qu'en est-il des zones rurales ?")

        for i, (t, typ) in enumerate([
            ("Avis de recrutement : journalistes reporters", Annonce.Type.RECRUTEMENT),
            ("Appel d'offres pour la fourniture de matériel audiovisuel", Annonce.Type.APPEL_OFFRES),
            ("Communiqué : lancement de la nouvelle grille de la WebTV", Annonce.Type.COMMUNIQUE),
        ]):
            Annonce.objects.create(titre=t, type=typ, annonceur="Label Info TV", resume="Détails et modalités ci-dessous.",
                                   contenu=PARAGRAPH * 2, contact="contact@labelinfo.tv", statut=Status.PUBLIE,
                                   publie_le=now - timedelta(days=i), date_limite=(now + timedelta(days=20)).date(), auteur=editeur)

        ad_img = create_asset(fake_image("Votre publicité ici", (600, 500)), user=admin, collection="publicites")
        Publicite.objects.create(titre="Campagne démo", annonceur="Partenaire", image=ad_img, lien="https://example.com", position="sidebar")

        self.stdout.write(self.style.SUCCESS(
            "Données de démonstration créées.\n"
            "  admin@labelinfo.test / admin1234 (administrateur)\n"
            "  editeur@labelinfo.test / editeur1234 (éditeur)\n"
            "  redacteur@labelinfo.test / redacteur1234 (rédacteur)"
        ))
