# modules/database/writing_progress_mongo_db.py

from .mongo_db import get_collection, insert_document
from datetime import datetime, timezone
import logging

logger = logging.getLogger(__name__)
COLLECTION_NAME = 'writing_progress'

def store_writing_baseline(username, metrics, text):
    """
    Guarda la línea base de escritura de un usuario.
    Args:
        username: ID del usuario
        metrics: Diccionario con métricas iniciales
        text: Texto analizado
    """
    try:
        document = {
            'username': username,
            'type': 'baseline',
            'metrics': metrics,
            'text': text,
            'timestamp': datetime.now(timezone.utc).isoformat(),
            'iteration': 0  # Línea base siempre es iteración 0
        }
        
        # Verificar si ya existe una línea base
        collection = get_collection(COLLECTION_NAME)
        existing = collection.find_one({
            'username': username,
            'type': 'baseline'
        })
        
        if existing:
            # Actualizar línea base existente
            result = collection.update_one(
                {'_id': existing['_id']},
                {'$set': document}
            )
            success = result.modified_count > 0
        else:
            # Insertar nueva línea base
            result = collection.insert_one(document)
            success = result.inserted_id is not None
            
        logger.info(f"Línea base {'actualizada' if existing else 'creada'} para usuario: {username}")
        return success
        
    except Exception as e:
        logger.error(f"Error al guardar línea base: {str(e)}")
        return False

def store_writing_progress(username, metrics, text):
    """
    Guarda una nueva iteración de progreso.
    """
    try:
        # Obtener último número de iteración
        collection = get_collection(COLLECTION_NAME)
        last_progress = collection.find_one(
            {'username': username},
            sort=[('iteration', -1)]
        )
        
        next_iteration = (last_progress['iteration'] + 1) if last_progress else 1
        
        document = {
            'username': username,
            'type': 'progress',
            'metrics': metrics,
            'text': text,
            'timestamp': datetime.now(timezone.utc).isoformat(),
            'iteration': next_iteration
        }
        
        result = collection.insert_one(document)
        success = result.inserted_id is not None
        
        if success:
            logger.info(f"Progreso guardado para {username}, iteración {next_iteration}")
        
        return success
        
    except Exception as e:
        logger.error(f"Error al guardar progreso: {str(e)}")
        return False

def get_writing_baseline(username):
    """
    Obtiene la línea base de un usuario.
    """
    try:
        collection = get_collection(COLLECTION_NAME)
        return collection.find_one({
            'username': username,
            'type': 'baseline'
        })
    except Exception as e:
        logger.error(f"Error al obtener línea base: {str(e)}")
        return None

def get_writing_progress(username, limit=None):
    """
    Obtiene el historial de progreso de un usuario.
    Args:
        username: ID del usuario
        limit: Número máximo de registros a retornar
    """
    try:
        collection = get_collection(COLLECTION_NAME)
        cursor = collection.find(
            {
                'username': username,
                'type': 'progress'
            },
            sort=[('iteration', -1)]
        )
        
        if limit:
            cursor = cursor.limit(limit)
            
        return list(cursor)
        
    except Exception as e:
        logger.error(f"Error al obtener progreso: {str(e)}")
        return []

def get_latest_writing_metrics(username):
    """
    Obtiene las métricas más recientes (línea base o progreso).
    """
    try:
        collection = get_collection(COLLECTION_NAME)
        return collection.find_one(
            {'username': username},
            sort=[('timestamp', -1)]
        )
    except Exception as e:
        logger.error(f"Error al obtener métricas recientes: {str(e)}")
        return None