File size: 31,534 Bytes
91a0d7e
a8fd769
 
 
1c11e93
d51e47b
 
a8fd769
d51e47b
de356ae
 
 
241c725
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fb00f28
241c725
 
 
 
 
 
 
 
 
 
 
 
 
fb00f28
241c725
 
 
 
 
 
 
 
 
 
 
de356ae
78301c8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
de356ae
c868d6c
 
 
 
 
 
 
 
5668ab1
 
c868d6c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
241c725
 
5668ab1
 
 
241c725
5668ab1
 
 
241c725
5668ab1
241c725
5668ab1
 
 
 
 
 
 
 
 
 
 
 
 
241c725
5668ab1
241c725
5668ab1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
241c725
 
 
 
cd03ba7
 
 
fe8abb4
 
 
cd03ba7
 
fe8abb4
cd03ba7
 
 
 
fe8abb4
 
 
 
 
 
cd03ba7
 
 
fe8abb4
cd03ba7
 
 
 
 
fe8abb4
 
 
 
 
 
cd03ba7
 
 
fe8abb4
cd03ba7
 
 
 
 
fe8abb4
 
 
 
 
 
cd03ba7
 
 
fe8abb4
cd03ba7
 
 
 
 
 
 
fe8abb4
 
 
 
 
 
cd03ba7
 
 
 
 
 
fe8abb4
cd03ba7
 
 
 
 
 
 
fe8abb4
 
 
 
 
 
cd03ba7
 
fe8abb4
cd03ba7
 
 
 
520b9e2
241c725
 
 
2bef2ae
241c725
 
2bef2ae
ea8d9b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b44807b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bc96b9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f64c5bf
 
 
 
 
 
 
bc96b9a
 
 
 
 
 
 
875b3a0
b44807b
241c725
e6db63d
 
fd06656
 
 
 
 
 
 
 
 
 
e6db63d
 
 
 
 
 
 
 
 
 
 
 
 
 
875b3a0
241c725
875b3a0
 
 
 
 
 
f64c5bf
 
 
 
 
875b3a0
241c725
875b3a0
 
 
 
241c725
063a515
875b3a0
 
 
 
 
 
 
241c725
875b3a0
 
 
5668ab1
875b3a0
241c725
 
 
875b3a0
 
 
 
 
 
 
 
 
 
241c725
522d135
875b3a0
 
52fe894
875b3a0
 
 
 
 
 
 
 
 
 
 
f64c5bf
875b3a0
52fe894
f64c5bf
 
 
 
 
ea8d9b4
 
 
 
241c725
84b1387
 
520b9e2
 
 
 
84b1387
 
 
 
52fe894
6c969bc
1ff0df4
522d135
d51e47b
c0eed81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ae4c2eb
 
 
bef3dc5
c0eed81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34cb5f8
 
a8fd769
8ac4d65
34cb5f8
8ac4d65
 
 
 
 
 
60ce54c
34cb5f8
 
d0e8042
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8ac4d65
 
1da5874
8ac4d65
 
a43e583
1da5874
8ac4d65
 
34cb5f8
d0e8042
8ac4d65
 
 
 
 
 
34cb5f8
 
 
 
 
 
 
 
 
8ac4d65
 
34cb5f8
8ac4d65
 
34cb5f8
 
 
8ac4d65
 
 
ec618b2
34cb5f8
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
from dotenv import load_dotenv
import streamlit as st
import os
import google.generativeai as genai
import random

load_dotenv()
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))

story_formulas = {
    "PASA": {
        "description": """
        La fórmula P.A.S.A. es una de las estructuras más efectivas en copywriting, diseñada para crear una conexión emocional profunda que lleva a la acción.

        TEORÍA:
        Esta fórmula se basa en la psicología del dolor y el alivio, siguiendo el principio de que las personas están más motivadas a evitar el dolor que a buscar el placer.

        ESTRUCTURA:
        1. Problema:
           - Identifica un dolor específico y real
           - Debe ser inmediatamente reconocible por la audiencia
           - Se presenta desde la perspectiva del lector
           - Usa lenguaje empático y comprensivo

        2. Agitación:
           - Profundiza en las consecuencias emocionales
           - Explora ramificaciones futuras
           - Aumenta la tensión psicológica
           - Crea un punto de inflexión emocional

        3. Solución:
           - Presenta la respuesta de forma natural
           - Enfoca en beneficios transformacionales
           - Construye credibilidad gradualmente
           - Demuestra el cambio positivo

        4. Acción:
           - Propone el siguiente paso lógico
           - Minimiza la fricción y resistencia
           - Crea sentido de urgencia
           - Ofrece garantías implícitas
        """,
        "examples": [
            {
                "title": "App de Meditación",
                "target": "Profesionales estresados",
                "action": "Descargar la app con 7 días gratis",  # Añadir esta línea
                "story": """
                El insomnio se había convertido en su compañero más fiel. Sara miraba el reloj: 3 AM, otra vez.

                Los días se volvían borrosos, su concentración desaparecía. Las reuniones importantes se convertían en una lucha por mantener los ojos abiertos, mientras su productividad se desplomaba.

                Todo cambió cuando descubrió MeditaApp. Sus ejercicios de respiración guiada y meditaciones nocturnas la ayudaron a encontrar ese interruptor mental que necesitaba para desconectar.

                Descarga MeditaApp hoy y recupera tus noches. Tus primeros 7 días son gratuitos, porque creemos que una noche de buen sueño no tiene precio.
                """
            },
            {
                "title": "Curso de Finanzas Personales",
                "target": "Jóvenes profesionales",
                "action": "Inscribirse al curso con 50% de descuento",
                "story": """
                Cada notificación del banco le provocaba un nudo en el estómago. Miguel evitaba revisar su cuenta, sabiendo que los números rojos lo esperaban.

                Las deudas crecían mientras sus sueños se alejaban. La idea de comprar una casa o empezar un negocio parecía cada vez más inalcanzable, y la ansiedad financiera lo consumía día y noche.

                Entonces encontró FinanzasMaster. El curso no solo le enseñó a manejar su dinero, sino a construir un futuro financiero sólido. En seis meses, eliminó sus deudas y comenzó a ver crecer sus ahorros.

                Únete a FinanzasMaster hoy. Transforma tu relación con el dinero con nuestro programa probado de 12 semanas. Matrícula con 50% de descuento esta semana.
                """
            }
        ]
    },
    
    "ADP": {
    "description": """
    La fórmula A.D.P. (Antes/Después/Puente) es una estructura persuasiva que crea una conexión emocional mostrando la transformación desde el problema hasta la solución.

    TEORÍA:
    Esta fórmula se basa en el contraste entre la situación actual y el resultado deseado, usando tu solución como el puente natural entre ambos estados.

    ESTRUCTURA:
    1. Antes:
       - Describe vívidamente la situación problemática actual
       - Refleja las frustraciones y miedos de la audiencia
       - Identifica los obstáculos que impiden alcanzar objetivos
       - Usa lenguaje empático y descriptivo
       - Crea conexión inmediata con experiencias cotidianas

    2. Después:
       - Pinta el escenario ideal post-solución
       - Describe beneficios tangibles y emocionales
       - Muestra la transformación positiva
       - Enfatiza el contraste con la situación inicial
       - Genera deseo por el resultado prometido

    3. Puente:
       - Presenta tu solución como el camino natural
       - Explica el proceso de transformación
       - Demuestra la viabilidad del cambio
       - Minimiza barreras y objeciones
       - Proporciona pasos claros hacia el resultado
    """,
    "examples": [
        {
            "title": "Mentoría de Copywriting",
            "target": "Emprendedores digitales",
            "action": "Reservar llamada de estrategia gratuita",
            "story": """
            Pasas horas frente a la pantalla, escribiendo y reescribiendo cada palabra. Tus publicaciones parecen perderse en el vacío digital, mientras ves cómo otros logran engagement y ventas con aparente facilidad. La frustración crece con cada post que no genera resultados.

            Imagina despertar cada mañana sabiendo exactamente qué escribir. Tus palabras resuenan con tu audiencia, generando comentarios, compartidos y, lo más importante, ventas consistentes. Tu mensaje se transmite con claridad y autenticidad, atrayendo naturalmente a tus clientes ideales.

            El secreto está en dominar las estructuras probadas de copywriting que transforman palabras en conexiones reales. En nuestra mentoría personalizada, aprenderás exactamente cómo adaptar estas fórmulas a tu voz única. Agenda tu llamada de estrategia gratuita esta semana y descubre cómo podemos transformar tu comunicación en resultados tangibles.
            """
        },
        {
            "title": "App de Productividad",
            "target": "Profesionales multitarea",
            "action": "Descargar versión premium 30 días gratis",
            "story": """
            Las notificaciones no paran de sonar. Entre emails, mensajes y deadlines, tu día se convierte en un caos de tareas incompletas. El estrés se acumula mientras intentas mantener todo bajo control, pero la sensación de estar siempre atrasado no desaparece.

            Visualiza una jornada donde cada tarea fluye naturalmente hacia la siguiente. Tus proyectos avanzan con precisión, las reuniones son productivas, y al final del día, tienes energía para disfrutar de tu tiempo libre. Tu mente está clara y enfocada.

            La diferencia está en tener un sistema que trabaja contigo, no contra ti. Nuestra app integra las mejores prácticas de gestión del tiempo en una interfaz intuitiva que se adapta a tu forma de trabajar. Descarga la versión premium gratis por 30 días y experimenta la diferencia que un sistema personalizado puede hacer en tu productividad.
            """
            }
        ]
    },
    
    "GHA": {
    "description": """
    La fórmula G.H.A. (Gancho-Historia-Acción) es una estructura narrativa poderosa que utiliza el storytelling para crear conexiones emocionales y motivar a la acción.

    TEORÍA:
    Esta fórmula aprovecha el poder de las historias para captar la atención, generar empatía y motivar el cambio, basándose en la identificación con los problemas y dolores de la audiencia.

    ESTRUCTURA:
    1. Gancho:
       - Abre identificando un problema o dolor específico de la audiencia con un titular
       - Que conecta emocionalmente con la frustración o necesidad
       - Genera identificación inmediata con la situación
       - Plantea el escenario desde la perspectiva del dolor actual

    2. Historia:
       - Desarrolla la narrativa mostrando las consecuencias del problema
       - Explora cómo el dolor afecta diferentes aspectos de la vida
       - Mantiene la tensión emocional sobre el problema
       - Introduce el producto como solución natural al dolor
       - Demuestra la transformación positiva posible

    3. Acción:
       - Surge como respuesta natural al deseo de eliminar el dolor
       - Presenta la acción como el puente hacia el beneficio deseado
       - Enfatiza la urgencia de resolver el problema
       - Minimiza las barreras para tomar acción
       - Refuerza los beneficios específicos que se obtendrán
    """,
        "examples": [
            {
                "title": "Congreso de Marketing Digital 2024",
                "target": "Marketers y dueños de negocio",
                "action": "Comprar entrada Early Bird con 40% descuento",
                "story": """
                El evento que convierte estrategias obsoletas en casos de éxito viral
                
                Mis campañas de marketing parecían gritar en un cuarto vacío. Mientras otros conseguían resultados espectaculares, yo seguía atascado con las mismas métricas mediocres. Los cursos online y tutoriales de YouTube solo me daban fragmentos del puzzle.

                Todo cambió cuando asistí a mi primer congreso de marketing. En dos días, aprendí más que en meses de autoaprendizaje. Las conexiones que hice me abrieron puertas que ni sabía que existían, y las estrategias que implementé triplicaron mis resultados en 90 días.

                Asegura tu lugar en el Congreso de Marketing Digital 2024 con precio Early Bird (40% descuento). Incluye acceso a todas las conferencias, networking VIP y grabaciones exclusivas. ¡Últimas 50 entradas disponibles!
                """
            },
            {
                "title": "Curso de Fotografía con Celular",
                "target": "Aficionados a la fotografía con presupuesto limitado",
                "action": "Inscribirse a la masterclass con 50% de descuento",
                "story": """
                Tu celular tiene más potencial que esa cámara profesional que nunca te animaste a comprar
                
                Mi Instagram parecía el muro de los lamentos fotográficos: fotos movidas, mal iluminadas y con zoom digital que las hacía parecer pinturas impresionistas. Cada vez que veía las fotos espectaculares de otros, me convencía de que necesitaba una cámara profesional (que nunca podría pagar).

                Todo cambió cuando descubrí que mi "simple" celular tenía funciones que ni siquiera sabía que existían. Con algunos ajustes básicos y técnicas específicas, mis fotos comenzaron a destacar. Ahora, mis seguidores me preguntan qué cámara uso, y sonrío al decirles que es el mismo celular que uso para pedir comida a domicilio.

                Aprovecha el 50% de descuento en la masterclass de esta semana y descubre el fotógrafo que llevas dentro. Incluye guía de configuración personalizada para tu modelo de celular y acceso a nuestra comunidad privada de fotógrafos móviles.
                """
            },
            {
                "title": "Webinar: Ventas con LinkedIn",
                "target": "Emprendedores y profesionales de ventas",
                "action": "Registrarse al webinar gratuito",
                "story": """
                El perfil de LinkedIn que genera más ventas que un equipo comercial completo

                Pasaba horas enviando mensajes fríos en LinkedIn sin respuesta. Mi perfil parecía más un currículum abandonado que una herramienta de ventas. Mientras otros cerraban deals importantes, yo apenas conseguía algunas vistas a mi perfil.

                La revelación llegó cuando un mentor me mostró cómo había conseguido 15 clientes en un mes solo optimizando su perfil de LinkedIn. Implementé sus estrategias y en dos semanas ya tenía 3 reuniones agendadas con clientes potenciales.

                Regístrate gratis a nuestro webinar este jueves y descubre las 3 estrategias que están revolucionando las ventas en LinkedIn. Incluye plantillas de mensajes probados y guía de optimización de perfil. ¡Plazas limitadas!
                """
            },
            {
                "title": "Silla Ergonómica ProComfort",
                "target": "Profesionales que trabajan desde casa",
                "action": "Comprar con 30% de descuento y envío gratis",
                "story": """
                La silla que transformó mi dolor de espalda en productividad

                Mi espalda me recordaba cada día que trabajar desde la silla del comedor era una mala idea. Los dolores comenzaban a media mañana y para la tarde ya estaba más concentrado en mi postura que en mi trabajo. Los masajes y estiramientos solo eran soluciones temporales.

                Cuando finalmente invertí en una silla ergonómica profesional, el cambio fue inmediato. No solo desapareció el dolor, sino que mi productividad aumentó. Ahora puedo concentrarme en mis proyectos sin interrupciones y terminar mi jornada sintiéndome energizado.

                Aprovecha 30% de descuento en la Silla ProComfort y transforma tu espacio de trabajo. Incluye envío gratuito, garantía de 5 años y guía de ajuste personalizado. ¡Stock limitado!
                """
            },
        ]
    }
}

def generate_headline_for_story(model, story, formula_type, product, target_audience, mood):
    """Función para generar un titular basado en la historia y la fórmula seleccionada"""

def generate_headline_for_story(model, story, formula_type, product, target_audience, mood):
    """Función para generar un titular basado en la historia"""

    formula_prompts = {
        "GPS": f"""
        INSTRUCCIONES: Genera ÚNICAMENTE UN TITULAR siguiendo la fórmula GPS:
        1. Meta: ¿Qué desea lograr {target_audience}?
        2. Periodo: ¿En qué marco temporal o situación cotidiana?
        3. Superación: Usa un conector con toque de humor (sin, incluso si, aunque, etc.)

        IMPORTANTE:
        - Retorna SOLO el titular, sin explicaciones
        - No uses etiquetas ni números
        - No expliques la fórmula usada

        Historia a titular:
        {story}
        """,
        "AIDA": f"""
        INSTRUCCIONES: Genera ÚNICAMENTE UN TITULAR siguiendo la fórmula AIDA:
        1. Atención: Usa un gancho poderoso
        2. Interés: Desarrolla el gancho inicial
        3. Deseo: Amplifica la emoción
        4. Acción: Cierre natural

        IMPORTANTE:
        - Retorna SOLO el titular, sin explicaciones
        - No uses etiquetas ni números
        - No expliques la fórmula usada

        Historia a titular:
        {story}
        """,
        "4U": f"""
        INSTRUCCIONES: Genera ÚNICAMENTE UN TITULAR siguiendo la fórmula 4U:
        1. Útil: Beneficio práctico
        2. Urgente: Motivador de acción
        3. Único: Diferenciador memorable
        4. Ultra-específico: Detalles precisos

        IMPORTANTE:
        - Retorna SOLO el titular, sin explicaciones
        - No uses etiquetas ni números
        - No expliques la fórmula usada

        Historia a titular:
        {story}
        """,
        "Númerica Suprema": f"""
        INSTRUCCIONES: Genera ÚNICAMENTE UN TITULAR siguiendo la Fórmula Numérica Suprema:
        1. Artículo plural (Los/Las)
        2. Número específico
        3. Adjetivo emocional
        4. Palabra clave en plural
        5. Razón
        6. Promesa

        IMPORTANTE:
        - Retorna SOLO el titular, sin explicaciones
        - No uses etiquetas ni números
        - No expliques la fórmula usada

        Historia a titular:
        {story}
        """
    }

    # Usar el prompt predeterminado si la fórmula no está en el diccionario
    headline_prompt = formula_prompts.get(formula_type, f"""
    INSTRUCCIONES: Genera ÚNICAMENTE UN TITULAR persuasivo y memorable en español.
    El titular debe:
    - Conectar con {target_audience}
    - Mantener un tono {mood}
    - Ser conciso y memorable
    - No mencionar directamente "{product}"
    - Generar curiosidad y deseo de leer más

    IMPORTANTE:
    - Retorna SOLO el titular, sin explicaciones
    - No uses etiquetas ni números
    - No expliques la fórmula usada

    Historia a titular:
    {story}
    """)

    response = model.generate_content([headline_prompt])
    if response and response.parts:
        return response.parts[0].text.strip()
    return None

def generate_story(formula_type, target_audience, product, action, mood, length, story_topic=None):
    """Función unificada para generar historias"""
    model = genai.GenerativeModel("gemini-2.0-flash")

    if formula_type not in story_formulas:
        raise ValueError("Fórmula no válida")

    # Añadir instrucciones de naturalidad al inicio del prompt
    natural_instruction = f"""
IMPORTANTE - NATURALIDAD EN LA HISTORIA:
- NO menciones "{product}" de forma literal o forzada
- Introduce el producto/servicio de manera sutil y orgánica en la narrativa
- Evita que suene como una fórmula publicitaria
- La solución debe surgir naturalmente de la historia
- Usa variaciones y descripciones naturales en lugar del nombre exacto
- La historia debe fluir como una conversación real, no como un anuncio

Por ejemplo, si el producto es "Webinar sobre Yoga":
❌ "Entonces descubrí el Webinar sobre Yoga"
✅ "Encontré estas clases en línea donde aprendí a conectar con mi cuerpo"

Si es un curso:
❌ "Me inscribí en el Curso de Marketing Digital"
✅ "Comencé a aprender sobre el mundo del marketing en línea"
"""
    
    # Análisis del público objetivo
    audience_analysis = f"""
ANÁLISIS DEL PÚBLICO OBJETIVO: {target_audience}

INSTRUCCIONES DE ANÁLISIS:
1. Dolores y Problemas:
   - Identifica los problemas cotidianos específicos de {target_audience}
   - Reconoce sus frustraciones y miedos más profundos
   - Analiza las consecuencias emocionales de estos problemas
   - Considera el impacto en su vida diaria

2. Creencias y Valores:
   - Comprende sus creencias limitantes
   - Identifica sus aspiraciones y sueños
   - Reconoce sus valores fundamentales
   - Entiende sus motivaciones principales

3. Situaciones de Vida:
   - Visualiza sus rutinas diarias
   - Identifica momentos de tensión o conflicto
   - Reconoce sus contextos sociales y profesionales
   - Comprende sus responsabilidades y presiones

4. Puntos de Dolor Específicos:
   - Problemas prácticos: [analiza sus dificultades concretas]
   - Dolores emocionales: [identifica sus preocupaciones más profundas]
   - Miedos: [reconoce sus temores principales]
   - Frustraciones: [entiende sus obstáculos recurrentes]

CONTEXTO NARRATIVO:
- Si hay story_topic ("{story_topic if story_topic else 'No especificado'}"),
  úsalo como escenario o contexto para desarrollar la historia
- El protagonista debe reflejar fielmente las características de {target_audience}
- Los problemas y situaciones deben ser 100% reconocibles por la audiencia
- La transformación debe abordar directamente sus dolores específicos
"""
    
# Definir el system prompt dentro de la función
    system_prompt = """You are a world-class copywriter, specialized in crafting persuasive stories that emotionally connect with readers and drive them to action.

FORMAT RULES:
- Story must be structured in clear paragraphs
- Each section must flow naturally into the next
- No explicit section labels
- Maintain consistent tone throughout
- Include smooth transitions between parts
- Story must feel complete and cohesive

IMPORTANT STRUCTURE INSTRUCTIONS:
- The selected formula MUST be applied to the entire story
- Review and follow the structure detailed in story_formulas[formula_type]["description"]
- Use the examples in story_formulas[formula_type]["examples"] as inspiration
- Formula provides the framework, tone provides the emotional layer
- Both must work together seamlessly

IMPORTANT:
- Each story must be unique and memorable
- Avoid clichés and generic scenarios
- Maintain a credible and authentic voice
- Adapt language to target audience
- Focus on emotional transformation
- Follow formula structure while maintaining selected tone
- Never explicitly label sections
- Integrate product and call-to-action organically

STORY STRUCTURE GUIDELINES:
1. Study the formula description carefully
2. Review provided examples for style and flow
3. Maintain similar paragraph length and structure
4. Use consistent emotional intensity
5. Mirror the narrative progression
6. Adapt content for target audience while keeping formula essence

TONE AND STYLE:
- Selected tone must remain consistent
- Tone modifies HOW the story is told
- Formula provides structure, tone provides emotion
- Both elements must complement each other
- Maintain voice appropriate for target audience

LANGUAGE INSTRUCTIONS:
- Generate the story in Spanish
- Use natural, fluent Spanish
- Maintain cultural relevance for Spanish-speaking audiences
- Ensure idioms and expressions are appropriate for Spanish
- Keep all story content in Spanish, only system instructions are in English

KEY ELEMENTS TO INCLUDE:
- Emotional hooks that grab attention
- Relatable situations and characters
- Sensory details and vivid descriptions
- Natural problem-solution progression
- Organic product integration
- Compelling but subtle call-to-action"""

    story_instruction = f"{system_prompt}\n\n{audience_analysis}\n\n"

    # Instrucciones específicas para GHA cuando hay story_topic
    if formula_type == "GHA" and story_topic:
        story_instruction += f"""
        STORY TOPIC INTEGRATION GUIDELINES:
        - The story topic "{story_topic}" MUST be the central theme of the narrative
        - Build the entire story around this specific topic/experience
        - Use the topic as the main hook to capture attention
        - Weave the product naturally into this specific narrative
        - Ensure the story feels authentic to the given topic
        - Maintain the emotional core of the topic throughout

    REQUIRED STORY ELEMENTS:
1. Opening hook must directly relate to "{story_topic}"
2. Story must maintain focus on this specific topic/experience
3. Product integration should feel natural within this context
4. Character development should align with the topic
5. Emotional journey must connect to the specific situation
6. Resolution should tie topic and product together seamlessly

STORY STRUCTURE FOR THIS TOPIC:
1. Hook: Begin with a compelling aspect of {story_topic}
2. Development: Explore the challenges/emotions related to this specific situation
3. Integration: Show how {product} naturally fits into this context
4. Resolution: Demonstrate transformation while staying true to the topic
"""
    
    # Añadir instrucciones sobre el producto y beneficios
    story_instruction += f"""
PRODUCT INTEGRATION GUIDELINES:
- Evita menciones obvias de {product}
- Enfócate en despertar interés genuino mostrando beneficios transformacionales
- Integra el producto de manera natural en la narrativa
- Destaca cómo el producto mejora la vida del protagonista
- Mantén el tono {mood} al describir los beneficios

IMPORTANT REMINDER:
- The entire story must be written in Spanish
- Use natural expressions and cultural references appropriate for Spanish-speaking audiences
- Ensure the story flows naturally in Spanish
"""

    # Instrucciones de estudio de ejemplos
    story_instruction += f"""
IMPORTANTE: Estudia cuidadosamente estos ejemplos de la fórmula seleccionada.
Cada ejemplo representa el estilo y estructura a seguir, adaptados al tono {mood}:
"""

    # Seleccionar ejemplos aleatorios
    random_examples = random.sample(story_formulas[formula_type]['examples'],
                                  min(3, len(story_formulas[formula_type]['examples'])))

    # Agregar ejemplos seleccionados
    story_instruction += "\nEJEMPLOS DE LA FÓRMULA A SEGUIR:\n"
    for i, example in enumerate(random_examples, 1):
        story_instruction += f"""
Ejemplo {i}:
Título: {example['title']}
Audiencia: {example['target']}
Acción: {example['action']}
Historia:
{example['story']}
"""

    # Agregar instrucciones específicas
    story_instruction += """
INSTRUCCIONES ESPECÍFICAS:
1. Mantén la misma estructura y longitud que los ejemplos anteriores
2. Usa el mismo tono y estilo de escritura, adaptado al mood especificado
3. Replica los patrones de construcción de frases y transiciones
4. Conserva el nivel de especificidad y detalle en las descripciones
5. Adapta el contenido para la audiencia manteniendo la esencia de los ejemplos
6. Integra los beneficios del producto de manera sutil y convincente
7. Asegura que la transformación del protagonista sea creíble y emotiva
"""

    # Agregar la descripción de la fórmula
    story_instruction += f"\nFÓRMULA A SEGUIR:\n{story_formulas[formula_type]['description']}\n\n"

    # Recordatorio final
    story_instruction += f"""
RECORDATORIO FINAL:
1. Sigue la estructura de la fórmula seleccionada
2. Aplica el tono {mood} de manera consistente
3. Mantén la coherencia narrativa
4. Asegura que la historia refleje una transformación auténtica
5. Integra {product} y sus beneficios de forma natural
6. Culmina con un llamado a la acción convincente: {action}

GENERA AHORA:
Crea una historia persuasiva de {length} palabras en español que siga fielmente el estilo y estructura de los ejemplos mostrados,
manteniendo un tono {mood} y enfocándote en la transformación que {product} puede traer a la vida de {target_audience}.

IMPORTANT FINAL REMINDER:
- Write the complete story in Spanish
- Ensure natural flow and cultural relevance
- Maintain authentic Spanish expressions and tone
"""

    # Asegúrate de que las instrucciones de naturalidad estén al inicio del prompt
    story_instruction = f"{natural_instruction}\n\n{story_instruction}"
    
    response = model.generate_content([story_instruction])
    if response and response.parts:
        story = response.parts[0].text.strip()
        # Generar el titular usando una fórmula aleatoria
        formula_types = ["GPS", "AIDA", "4U", "Númerica Suprema"]
        selected_formula = random.choice(formula_types)
        headline = generate_headline_for_story(model, story, selected_formula, product, target_audience, mood)
        # Combinar titular y historia
        if headline:
            return f"# {headline}\n\n{story}"
        return story
    raise ValueError("No se pudo generar la historia")
    
# Inicializar la aplicación Streamlit
st.set_page_config(page_title="Generador de Historias", page_icon=":pencil:", layout="wide")

# Ocultar elementos de la interfaz
st.markdown("""
    <style>
        
        /* Reducir espacio superior */
        .block-container {
            padding-top: 1rem;
            padding-bottom: 5rem;
        }

        /* Ajustar espaciado del título */
        h1 {
            margin-top: -2rem;
            padding-top: 0.5rem;
        }

        /* Ajustar espaciado del subtítulo */
        h4 {
            margin-top: 0.5rem;
            padding-top: 0rem;
        }
    </style>
""", unsafe_allow_html=True)

# Título y subtítulo
st.markdown("<h1 style='text-align: center;'>Story Genius Maker</h1>", unsafe_allow_html=True)
st.markdown("<h3 style='text-align: center;'>Teje historias inolvidables en segundos, guiado por la magia de la inteligencia artificial que da vida a tus ideas en relatos cautivadores.</h3>", unsafe_allow_html=True)

# Añadir CSS personalizado para el botón
st.markdown("""
    <style>
    div.stButton > button {
        background-color: #FFCC00;
        color: black;
        width: 90%;
        height: 60px;
        font-weight: bold;
        font-size: 22px;
        text-transform: uppercase;
        border: 1px solid #000000;
        border-radius: 8px;
        display: block;
        margin: 0 auto;
    }
    div.stButton > button:hover {
        background-color: #FFD700;
        color: black;
    }
    </style>
""", unsafe_allow_html=True)

# Crear las columnas para el diseño (40% para la izquierda, 60% para la derecha)
col1, col2 = st.columns([2, 3])

# Cambiar el comportamiento del slider cuando se seleccione "GHA"
with col1:
    target_audience = st.text_input("Público objetivo",
                                   placeholder="¿A quién está dirigido tu mensaje?")
    product = st.text_input("Producto/Servicio",
                           placeholder="¿Qué estás ofreciendo?")
    action = st.text_area("Llamado a la acción",
                         placeholder="¿Qué acción específica debe tomar tu audiencia?")

    # Personalización adicional
    with st.expander("Personaliza tu historia"):
        # Código de selección de fórmula movido aquí
        available_formulas = list(story_formulas.keys())
        formula_display_names = []
        formula_mapping = {}

        for formula in available_formulas:
            display_name = '.'.join(list(formula)) if formula.isupper() else formula
            formula_display_names.append(display_name)
            formula_mapping[display_name] = formula

        formula = st.radio(
            "Selecciona la fórmula para generar tu historia:",
            formula_display_names
        )

        selected_formula = formula_mapping[formula]

        # Resto de las opciones de personalización
        mood = st.selectbox("Tono de la historia:",
                           ["Emocional", "Triste", "Feliz", "Horror", "Comedia", "Romántico"])

        if selected_formula == "GHA":
            length = st.slider("Longitud de la historia (palabras):",
                             min_value=50, max_value=150, value=100, step=10)
        else:
            length = st.slider("Longitud de la historia (palabras):",
                             min_value=50, max_value=150, value=100, step=10)

    # Campo story_topic fuera del expander pero dependiente de la fórmula seleccionada
    story_topic = None
    if selected_formula == "GHA":
        story_topic = st.text_area(
            "De qué quieres que trate la historia",
            placeholder="Explica si hay algo específico sobre lo que te gustaría contar (puede ser una vivencia personal, película, cuento, personaje ficticio, etc.)."
        )

    # Botón para generar contenido
    submit = st.button("Generar mi historia")

# Mostrar el contenido generado en la columna derecha (col2)
with col2:
    if submit:
        if target_audience and product and action:
            try:
                # Verificar si es GHA y necesita story_topic
                if selected_formula == "GHA":
                    if story_topic:
                        response = generate_story(selected_formula, target_audience, product,
                                               action, mood, length, story_topic)
                    else:
                        st.error("Por favor, completa todos los campos requeridos para la fórmula G.H.A.")
                        response = ""
                else:
                    response = generate_story(selected_formula, target_audience, product,
                                           action, mood, length)

                if response:
                    st.subheader("Historia generada:")
                    st.write(response)
            except ValueError as e:
                st.error(f"Error: {str(e)}")
        else:
            st.error("Por favor, completa todos los campos requeridos (Público objetivo, Producto y Acción).")