"""
Transcript temizleme ve NLP işleme modülü
"""
import re
import html
import spacy
from typing import List, Dict


class TranscriptCleaner:
    """Transcript temizleme ve SBD sınıfı"""
    
    def __init__(self, model_name: str = "en_core_web_sm"):
        """
        Args:
            model_name: SpaCy model adı
        """
        try:
            self.nlp = spacy.load(model_name)
        except OSError:
            print(f"Model {model_name} not found. Loading default...")
            self.nlp = spacy.load("en_core_web_sm")
    
    def remove_artifacts(self, text: str) -> str:
        """Artifact'ları kaldır"""
        # Zaman kodlarını kaldır [00:00:00]
        text = re.sub(r'\[\d{2}:\d{2}:\d{2}\]', '', text)
        
        # Konuşma dışı etiketleri kaldır
        text = re.sub(r'\[(Music|Applause|Laughter|Music playing)\]', '', text, flags=re.IGNORECASE)
        
        # Aşırı boşlukları temizle
        text = re.sub(r'\s+', ' ', text)
        
        return text.strip()
    
    def detect_sentence_boundaries(self, fragments: List[Dict]) -> List[str]:
        """
        Fragment'ları birleştir ve cümle sınırlarını tespit et
        
        Args:
            fragments: Transcript fragment listesi [{"text": "...", "start": 0.0, ...}]
        
        Returns:
            Cümle listesi
        """
        # Fragment'ları birleştir
        full_text = ' '.join([f['text'] for f in fragments])
        
        # Artifact'ları kaldır
        full_text = self.remove_artifacts(full_text)
        
        # SpaCy ile işle
        doc = self.nlp(full_text)
        
        # Cümleleri çıkar
        sentences = [sent.text.strip() for sent in doc.sents if sent.text.strip()]
        
        return sentences
    
    def create_paragraphs(self, sentences: List[str], 
                         sentences_per_paragraph: int = 3) -> List[str]:
        """
        Cümleleri paragraflara böl
        
        Args:
            sentences: Cümle listesi
            sentences_per_paragraph: Paragraf başına cümle sayısı
        
        Returns:
            Paragraf listesi
        """
        paragraphs = []
        current_paragraph = []
        
        for sentence in sentences:
            current_paragraph.append(sentence)
            
            if len(current_paragraph) >= sentences_per_paragraph:
                paragraphs.append(' '.join(current_paragraph))
                current_paragraph = []
        
        # Kalan cümleleri ekle
        if current_paragraph:
            paragraphs.append(' '.join(current_paragraph))
        
        return paragraphs
    
    def wrap_html(self, paragraphs: List[str]) -> str:
        """Paragrafları HTML'e sar"""
        html_paragraphs = [f"<p>{p}</p>" for p in paragraphs]
        return '\n'.join(html_paragraphs)
    
    def escape_xml_entities(self, text: str) -> str:
        """XML entity escaping (kritik!)"""
        # Önce & karakterlerini escape et (diğerlerinden önce!)
        text = text.replace('&', '&amp;')
        text = text.replace('<', '&lt;')
        text = text.replace('>', '&gt;')
        text = text.replace('"', '&quot;')
        text = text.replace("'", '&apos;')
        
        # &amp;'yi tekrar düzelt (zaten escape edilmiş olanlar için)
        text = text.replace('&amp;amp;', '&amp;')
        text = text.replace('&amp;lt;', '&lt;')
        text = text.replace('&amp;gt;', '&gt;')
        text = text.replace('&amp;quot;', '&quot;')
        text = text.replace('&amp;apos;', '&apos;')
        
        return text
    
    def clean_transcript(self, fragments: List[Dict], 
                       sentences_per_paragraph: int = 3) -> tuple[str, str]:
        """
        Tam transcript temizleme pipeline'ı
        
        Returns:
            (raw_text, clean_html) tuple
        """
        # Raw text (sadece birleştirilmiş)
        raw_text = ' '.join([f['text'] for f in fragments])
        
        # SBD ile cümleleri çıkar
        sentences = self.detect_sentence_boundaries(fragments)
        
        # Paragraflara böl
        paragraphs = self.create_paragraphs(sentences, sentences_per_paragraph)
        
        # HTML'e sar
        # feedgen zaten XML escaping yapıyor, bu yüzden escape_xml_entities çağrısını kaldırdık
        clean_html = self.wrap_html(paragraphs)
        
        return raw_text, clean_html

