"""Crea tablas y carga músicos demo en Venezuela, Chile e Irlanda.

Uso:  python -m app.seed
Todas las cuentas demo usan la contraseña: demo1234

Nota: la media demo son solo VIDEOS (links). Las fotos del portfolio se agregan después vía el
flujo de carga (subida a storage) o generándolas con Replicate — no se siembran placeholders.
"""
from sqlalchemy import select

from app import models
from app.core.database import SessionLocal, init_db
from app.core.security import get_password_hash
from app.services.geo import point

DEMO_PASSWORD = "demo1234"

# Cada músico es un dict para poder incluir espectáculo, experiencia y media sin tuplas gigantes.
DEMO_MUSICIANS = [
    {
        "email": "mariachi.caracas@demo.com", "name": "Jorge Ramírez", "stage": "Mariachi Sol de América",
        "services": ["mariachi", "serenata"], "genres": ["ranchera", "bolero"], "price": 120, "currency": "USD",
        "city": "Caracas", "country": "VE", "lat": 10.4820, "lng": -66.9036, "available": True, "radius": 40,
        "years": 9,
        "show": "Show completo de 45 min con vestuario de charro tradicional, repertorio de 20+ canciones a "
                "elección y momento de dedicatoria en vivo. Opción de entrada sorpresa. Sonido propio incluido.",
        "media": [
            {"kind": "video", "url": "https://www.youtube.com/watch?v=demo-mariachi-1", "provider": "youtube",
             "caption": "\"El Rey\" — en vivo en Guadalajara", "featured": True},
            {"kind": "video", "url": "https://www.instagram.com/reel/demo-mariachi-2", "provider": "instagram",
             "caption": "Entrada sorpresa"},
        ],
    },
    {
        "email": "sax.caracas@demo.com", "name": "Luisa Pérez", "stage": "Luisa Sax",
        "services": ["saxofon", "solista"], "genres": ["jazz", "pop"], "price": 80, "currency": "USD",
        "city": "Caracas", "country": "VE", "lat": 10.4900, "lng": -66.8800, "available": True, "radius": 25,
        "years": 6,
        "show": "Ambientación en vivo para cócteles, cenas y eventos corporativos. Repertorio de jazz, bossa "
                "y pop en versiones instrumentales. 2 sets de 40 min.",
        "media": [
            {"kind": "video", "url": "https://www.youtube.com/watch?v=demo-sax-1", "provider": "youtube",
             "caption": "Set de jazz en vivo", "featured": True},
        ],
    },
    {
        "email": "tambores.caracas@demo.com", "name": "Grupo Tambor Vivo", "stage": "Tambor Vivo",
        "services": ["tambores", "folklorico"], "genres": ["afrovenezolano"], "price": 150, "currency": "USD",
        "city": "Caracas", "country": "VE", "lat": 10.4700, "lng": -66.9200, "available": False, "radius": 40,
        "years": 12,
        "show": "Batería de tambores afrovenezolanos con baile tradicional. Ideal para festivales y "
                "activaciones culturales. Grupo de 6 integrantes.",
        "media": [],
    },
    {
        "email": "gaita.maracaibo@demo.com", "name": "Los Gaiteros del Zulia", "stage": "Gaiteros del Zulia",
        "services": ["gaita", "banda"], "genres": ["gaita"], "price": 200, "currency": "USD",
        "city": "Maracaibo", "country": "VE", "lat": 10.6666, "lng": -71.6124, "available": True, "radius": 60,
        "years": 15,
        "show": "Gaita zuliana tradicional para tus fiestas decembrinas. Repertorio clásico y actual, con "
                "cuatro, furro, tambora y charrasca. Programable con anticipación.",
        "media": [
            {"kind": "video", "url": "https://www.youtube.com/watch?v=demo-gaita-1", "provider": "youtube",
             "caption": "Gaita en vivo", "featured": True},
        ],
    },
    {
        "email": "guitarra.santiago@demo.com", "name": "Camila Soto", "stage": "Camila Guitarra",
        "services": ["guitarrista", "solista"], "genres": ["folk", "pop"], "price": 60000, "currency": "CLP",
        "city": "Santiago", "country": "CL", "lat": -33.4489, "lng": -70.6693, "available": True, "radius": 25,
        "years": 7,
        "show": "Guitarra y voz para matrimonios, ceremonias y eventos íntimos. Covers acústicos a pedido y "
                "repertorio propio. Sonido incluido para hasta 80 personas.",
        "media": [
            {"kind": "video", "url": "https://www.youtube.com/watch?v=demo-guitar-1", "provider": "youtube",
             "caption": "Acústico en ceremonia", "featured": True},
        ],
    },
    {
        "email": "dueto.santiago@demo.com", "name": "Dúo Cordillera", "stage": "Dúo Cordillera",
        "services": ["dueto"], "genres": ["cueca", "bolero"], "price": 90000, "currency": "CLP",
        "city": "Santiago", "country": "CL", "lat": -33.4200, "lng": -70.6100, "available": True, "radius": 30,
        "years": 8,
        "show": "Dúo de voz y guitarra con repertorio de cueca, bolero y música chilena. Perfecto para "
                "fondas, matrimonios y celebraciones familiares.",
        "media": [],
    },
    {
        "email": "dj.santiago@demo.com", "name": "DJ Andes", "stage": "DJ Andes",
        "services": ["dj"], "genres": ["electronica", "reggaeton"], "price": 120000, "currency": "CLP",
        "city": "Santiago", "country": "CL", "lat": -33.4600, "lng": -70.6500, "available": False, "radius": 40,
        "years": 10,
        "show": "DJ para fiestas, cumpleaños y eventos corporativos. Equipo de sonido e iluminación propio. "
                "Sets personalizados según tu público. Hasta 5 horas continuas.",
        "media": [
            {"kind": "video", "url": "https://www.tiktok.com/@djandes/video/demo-dj-1", "provider": "tiktok",
             "caption": "Set en vivo", "featured": True},
        ],
    },
    {
        "email": "violin.dublin@demo.com", "name": "Aoife Byrne", "stage": "Aoife Strings",
        "services": ["violinista", "solista"], "genres": ["celtic", "classical"], "price": 150, "currency": "EUR",
        "city": "Dublín", "country": "IE", "lat": 53.3498, "lng": -6.2603, "available": True, "radius": 25,
        "years": 11,
        "show": "Solo violin for weddings and ceremonies. Celtic and classical repertoire, plus modern "
                "covers on request. Amplification available for larger venues.",
        "media": [
            {"kind": "video", "url": "https://www.youtube.com/watch?v=demo-violin-1", "provider": "youtube",
             "caption": "Celtic set — live", "featured": True},
        ],
    },
    {
        "email": "band.dublin@demo.com", "name": "The Liffey Trio", "stage": "The Liffey Trio",
        "services": ["trio", "banda"], "genres": ["irish folk"], "price": 300, "currency": "EUR",
        "city": "Dublín", "country": "IE", "lat": 53.3400, "lng": -6.2700, "available": True, "radius": 35,
        "years": 14,
        "show": "Traditional Irish trio (fiddle, guitar, bodhrán) for pubs, weddings and private parties. "
                "High-energy sets with sing-alongs. 3 x 45 min sets.",
        "media": [
            {"kind": "video", "url": "https://www.youtube.com/watch?v=demo-trio-1", "provider": "youtube",
             "caption": "Live at the pub", "featured": True},
        ],
    },
]


def run() -> None:
    init_db()
    db = SessionLocal()
    created = 0
    try:
        for m in DEMO_MUSICIANS:
            if db.scalar(select(models.User).where(models.User.email == m["email"])):
                continue  # ya existe, no duplicar

            user = models.User(
                email=m["email"],
                password_hash=get_password_hash(DEMO_PASSWORD),
                full_name=m["name"],
                role="musico",
                country=m["country"],
            )
            db.add(user)
            db.flush()  # obtiene user.id

            profile = models.MusicianProfile(
                user_id=user.id,
                stage_name=m["stage"],
                bio=f"{m['stage']} — {m['city']}.",
                show_description=m["show"],
                years_experience=m["years"],
                service_types=m["services"],
                genres=m["genres"],
                base_price=m["price"],
                currency=m["currency"],
                travel_radius_km=m["radius"],
                is_available=m["available"],
                location=point(m["lat"], m["lng"]),
                city=m["city"],
                country=m["country"],
                rating=4.8,
                reviews_count=24,
            )
            db.add(profile)
            db.flush()  # obtiene profile.id

            for i, media in enumerate(m.get("media", [])):
                db.add(models.MediaItem(
                    musician_id=profile.id,
                    kind=media["kind"],
                    url=media["url"],
                    provider=media.get("provider", "upload"),
                    caption=media.get("caption"),
                    position=i,
                    is_featured=media.get("featured", False),
                ))
            created += 1

        db.commit()
        print(f"Seed OK — {created} músicos demo creados. Contraseña: {DEMO_PASSWORD}")
    finally:
        db.close()


if __name__ == "__main__":
    run()
