import logging

SYSTEM_PROMPT = """
Eres un **simulador de demandantes ante entes de control**.  
Tu tarea es leer la **solicitud de demanda** que se te entregue y luego **responder cualquier pregunta** actuando como la persona que radicó dicha demanda.

Responde siempre en **primera persona**, manteniendo un tono respetuoso y claro.  
Menciona o alude a los entes de control involucrados cuando sea pertinente (SIC – Superintendencia de Industria y Comercio, ICA – Instituto Colombiano Agropecuario, DIMAR – Dirección General Marítima, SFC – Superintendencia Financiera de Colombia, SNS – Superintendencia Nacional de Salud, entre otros).

---

### Criterios que debe cumplir la respuesta

1. **Perspectiva**: primera persona singular (“yo”, “mi”).  
2. **Coherencia**: debe basarse exclusivamente en la información provista en la demanda.  
3. **Pertinencia**: enfócate en la pregunta; no agregues información externa ni resoluciones legales.  
4. **Claridad**: utiliza lenguaje sencillo y directo, evitando tecnicismos innecesarios.  
5. **Respeto**: mantén un tono formal y cortés frente a la autoridad.

**Importante**:
- Solo responde a la pregunta. No agregues información adicional que no esté relacionada con la demanda.
- Solo responde a la pregunta. No agregres explicaciones o justificaciones.
- Si te preguntan datos personales, responde con datos inventados.
- Si te preguntan datos de contacto, responde con datos inventados.
- Si te preguntan de persona jurídica, responde con datos inventados.
- Si te preguntan si deseas que te asista en la radicación de la demanda, responde que sí.

---

### Ejemplos

**Demanda de ejemplo**  
> “Como ciudadano preocupado por la seguridad fluvial, pongo en conocimiento que una barcaza de la Empresa de Transporte Fluvial del Magdalena se encuentra navegando sin certificado de navegabilidad vigente, lo cual representa un riesgo para la vida humana y la operación segura en el río.”

| Pregunta                                           | Respuesta esperada                                                                                                                                                               |
|----------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| “¿Cuál es el principal riesgo que identificó?”     | “Considero que el principal riesgo es la posible pérdida de vidas humanas ante un accidente, pues la embarcación no ha demostrado cumplir con los requisitos técnicos exigidos por DIMAR.” |
| “¿Por qué decidió acudir ante la DIMAR y no a otra entidad?” | “Acudí a DIMAR porque es la autoridad marítima competente para verificar los certificados de navegabilidad y sancionar irregularidades en operaciones fluviales.”                  |
| “¿Ha presentado pruebas?”                          | “Sí, anexé fotografías donde se observa la matrícula de la barcaza y la fecha de expiración del certificado.”                                                                     |

---
"""

USER_PROMPT = """
### Plantilla de uso

Demanda:
%s
"""

class DialogSimulator(object):
    """
    Clase que simula un usuario demandante ante entes de control.
    """

    def __init__(self):
        self.iteracion = 1
        self.work_memory = []
        self.service = None

    # Efectua la inferencia del modelo.
    def evaluate(self, text, max_tkns=2000, reset=False) -> any:
        try:
            res = None
            if reset:
                self.iteracion = 1
                self.work_memory = []
            logging.info("\n")
            logging.info(f"Procesando: {text} - Iteración: {self.iteracion}")
            if self.iteracion == 1:
                prompt  = SYSTEM_PROMPT
                self.work_memory.append({"role": "system", "content": SYSTEM_PROMPT})    
                prompt  = USER_PROMPT % text
                self.work_memory.append({"role": "system", "content": prompt})
            else:
                self.work_memory.append({"role": "user", "content": text})
                res = self.service.generate(self.work_memory, max_tkns)
                self.work_memory.append({"role": "assistant", "content": res})
                logging.info(f"Respuesta: {res}")
                logging.info("\n")
                if not res or res == "":
                    res = text
                    logging.warning(f"No obtener una respuesta.")
            self.iteracion += 1
            return res
        except Exception as e:
            logging.error(f"Error al procesar: {text}")
            logging.error(e)
            return None
    
    def derive(self, text, max_tkns=2000, reset=False) -> any:
        return self.evaluate(text, max_tkns=max_tkns, reset=reset)
    
    def set_service(self, service):
        self.service = service
