
"""
Funcții helper și utilitare pentru Page Asist
"""
import re
import os
import json
from typing import List, Dict
from datetime import datetime
from pathlib import Path
from docx import Document
from docx.shared import RGBColor, Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from .database import ConversationDB


CONVERSATIONS_DIR = Path(__file__).parent.parent / "conversations"
CONVERSATIONS_DIR.mkdir(exist_ok=True)


def norm_text(s: str) -> str:
    """Normalizare text pentru comparație"""
    s = s.lower()
    s = re.sub(r'\s+', ' ', s).strip()
    return s


def extrage_fraze_idei(text: str) -> List[str]:
    """
    Extrage fraze/idei din text pentru registru de unicitate
    Împarte pe punct/linie nouă/bullet și returnează fraze curate
    """
    chunks = re.split(r'[.\n•\-\u2022;]+', text)
    out = []
    for c in chunks:
        t = norm_text(c)
        if len(t) >= 5:
            out.append(t)
    return out


def get_role_color_hex(rol: str) -> str:
    """Returnează codul hex al culorii pentru un rol"""
    colors = {
        'generator': '#10b981',    # verde
        'critic': '#ef4444',        # roșu
        'moderator': '#3b82f6',     # albastru
        'sintetizator': '#f59e0b'   # galben
    }
    return colors.get(rol.lower(), '#6b7280')  # gri default


def hex_to_rgb(hex_color: str) -> tuple:
    """Convertește hex color la RGB pentru python-docx"""
    hex_color = hex_color.lstrip('#')
    return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))


def generate_conversation_filename(subiect: str, timestamp: datetime = None) -> str:
    """Generează nume fișier pentru conversație"""
    if timestamp is None:
        timestamp = datetime.now()
    
    # Curăță subiectul pentru nume fișier
    subiect_curat = re.sub(r'[^\w\s-]', '', subiect)
    subiect_curat = re.sub(r'[-\s]+', '_', subiect_curat)
    subiect_curat = subiect_curat[:50]  # Limitează lungimea
    
    timestamp_str = timestamp.strftime("%Y-%m-%d_%H-%M")
    return f"{timestamp_str}_{subiect_curat}"


def save_conversation_txt(conversation_data: dict, filename: str = None) -> str:
    """
    Salvează conversația în format TXT
    Returns: calea completă a fișierului salvat
    """
    if filename is None:
        filename = generate_conversation_filename(conversation_data['subiect'])
    
    filepath = CONVERSATIONS_DIR / f"{filename}.txt"
    
    with open(filepath, 'w', encoding='utf-8') as f:
        f.write("=" * 80 + "\n")
        f.write(f"Page Asist - Conversație Multi-AI\n")
        f.write("=" * 80 + "\n\n")
        
        f.write(f"Subiect: {conversation_data['subiect']}\n")
        f.write(f"Data: {conversation_data['start_time']}\n")
        f.write(f"Număr runde: {conversation_data['numar_runde']}\n")
        f.write(f"Număr agenți: {len(conversation_data['agenti'])}\n\n")
        
        f.write("-" * 80 + "\n")
        f.write("Agenți configurați:\n")
        f.write("-" * 80 + "\n")
        for i, agent in enumerate(conversation_data['agenti'], 1):
            f.write(f"{i}. {agent['url']} - {agent['rol'].upper()} ({agent['model']})\n")
        f.write("\n")
        
        f.write("=" * 80 + "\n")
        f.write("CONVERSAȚIE\n")
        f.write("=" * 80 + "\n\n")
        
        current_round = 0
        for msg in conversation_data['mesaje']:
            if msg.get('type') == 'round_start':
                current_round = msg.get('round', 0)
                f.write("\n" + "=" * 80 + "\n")
                f.write(f"RUNDA {current_round}\n")
                f.write("=" * 80 + "\n\n")
            elif msg.get('type') == 'message':
                timestamp = msg.get('timestamp', '')
                agent_role = msg.get('agent_role', '').upper()
                agent_url = msg.get('agent_url', '')
                content = msg.get('content', '')
                tokens = msg.get('tokens', 'N/A')
                idei_noi = msg.get('idei_noi', 0)
                
                f.write(f"[{timestamp}] {agent_role} @ {agent_url}\n")
                f.write(f"Tokeni: {tokens} | Idei noi: {idei_noi}\n")
                f.write("-" * 80 + "\n")
                f.write(f"{content}\n\n")
        
        f.write("=" * 80 + "\n")
        f.write(f"Statistici finale:\n")
        f.write(f"Total mesaje: {conversation_data['total_mesaje']}\n")
        f.write(f"Total idei unice: {conversation_data['total_idei_unice']}\n")
        f.write("=" * 80 + "\n")
    
    return str(filepath)


def save_conversation_docx(conversation_data: dict, filename: str = None) -> str:
    """
    Salvează conversația în format DOCX cu formatare colorată
    Returns: calea completă a fișierului salvat
    """
    if filename is None:
        filename = generate_conversation_filename(conversation_data['subiect'])
    
    filepath = CONVERSATIONS_DIR / f"{filename}.docx"
    
    doc = Document()
    
    # Titlu
    title = doc.add_heading('Page Asist - Conversație Multi-AI', 0)
    title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    
    # Informații generale
    doc.add_heading('Informații Conversație', level=1)
    info = doc.add_paragraph()
    info.add_run(f"Subiect: ").bold = True
    info.add_run(f"{conversation_data['subiect']}\n")
    info.add_run(f"Data: ").bold = True
    info.add_run(f"{conversation_data['start_time']}\n")
    info.add_run(f"Număr runde: ").bold = True
    info.add_run(f"{conversation_data['numar_runde']}\n")
    info.add_run(f"Număr agenți: ").bold = True
    info.add_run(f"{len(conversation_data['agenti'])}\n")
    
    # Agenți
    doc.add_heading('Agenți Configurați', level=1)
    for i, agent in enumerate(conversation_data['agenti'], 1):
        p = doc.add_paragraph(style='List Number')
        p.add_run(f"{agent['url']} - ").bold = True
        
        role_run = p.add_run(f"{agent['rol'].upper()}")
        role_run.bold = True
        rgb = hex_to_rgb(get_role_color_hex(agent['rol']))
        role_run.font.color.rgb = RGBColor(*rgb)
        
        p.add_run(f" ({agent['model']})")
    
    # Conversație
    doc.add_heading('Conversație', level=1)
    
    current_round = 0
    for msg in conversation_data['mesaje']:
        if msg.get('type') == 'round_start':
            current_round = msg.get('round', 0)
            doc.add_heading(f'Runda {current_round}', level=2)
        
        elif msg.get('type') == 'message':
            timestamp = msg.get('timestamp', '')
            agent_role = msg.get('agent_role', '')
            agent_url = msg.get('agent_url', '')
            content = msg.get('content', '')
            tokens = msg.get('tokens', 'N/A')
            idei_noi = msg.get('idei_noi', 0)
            
            # Header mesaj cu culoare
            header = doc.add_paragraph()
            header_run = header.add_run(f"[{timestamp}] {agent_role.upper()} @ {agent_url}")
            header_run.bold = True
            rgb = hex_to_rgb(get_role_color_hex(agent_role))
            header_run.font.color.rgb = RGBColor(*rgb)
            header_run.font.size = Pt(11)
            
            # Statistici
            stats = doc.add_paragraph()
            stats.add_run(f"Tokeni: {tokens} | Idei noi: {idei_noi}").italic = True
            stats.style = 'Intense Quote'
            
            # Conținut
            content_para = doc.add_paragraph(content)
            content_para.style = 'Body Text'
            
            # Separator
            doc.add_paragraph()
    
    # Statistici finale
    doc.add_heading('Statistici Finale', level=1)
    stats_final = doc.add_paragraph()
    stats_final.add_run(f"Total mesaje: ").bold = True
    stats_final.add_run(f"{conversation_data['total_mesaje']}\n")
    stats_final.add_run(f"Total idei unice: ").bold = True
    stats_final.add_run(f"{conversation_data['total_idei_unice']}\n")
    
    doc.save(filepath)
    return str(filepath)


def load_conversation_metadata() -> List[dict]:
    """
    Încarcă metadatele tuturor conversațiilor salvate din baza de date
    """
    conversations = []
    
    try:
        # Încarcă din baza de date
        db_conversations = ConversationDB.get_all_conversations()
        
        for conv in db_conversations:
            conversations.append({
                'id': conv.id,
                'subiect': conv.subiect,
                'start_time': conv.start_time.isoformat() if conv.start_time else 'N/A',
                'end_time': conv.end_time.isoformat() if conv.end_time else None,
                'numar_runde': conv.numar_runde,
                'numar_agenti': conv.numar_agenti,
                'total_mesaje': conv.total_mesaje
            })
    except Exception as e:
        print(f"Eroare la încărcarea conversațiilor din baza de date: {e}")
        
        # Fallback la metoda veche cu fișiere JSON
        for file in CONVERSATIONS_DIR.glob("*.json"):
            try:
                with open(file, 'r', encoding='utf-8') as f:
                    data = json.load(f)
                    conversations.append({
                        'id': file.stem,
                        'subiect': data.get('subiect', 'N/A'),
                        'start_time': data.get('start_time', 'N/A'),
                        'end_time': data.get('end_time'),
                        'numar_runde': data.get('numar_runde', 0),
                        'numar_agenti': len(data.get('agenti', [])),
                        'total_mesaje': data.get('total_mesaje', 0)
                    })
            except Exception as e:
                print(f"Eroare la încărcarea {file}: {e}")
                continue
        
    return conversations


def save_conversation_json(conversation_data: dict, filename: str = None) -> str:
    """
    Salvează metadatele conversației în format JSON
    """
    if filename is None:
        filename = generate_conversation_filename(conversation_data['subiect'])
    
    filepath = CONVERSATIONS_DIR / f"{filename}.json"
    
    with open(filepath, 'w', encoding='utf-8') as f:
        json.dump(conversation_data, f, ensure_ascii=False, indent=2, default=str)
    
    return str(filepath)
