"""
Guardrail/Blacklist Module - Input Filtering & Safety
"""

import re
import logging
from typing import Tuple

logger = logging.getLogger(__name__)


class Blacklist:
    """
    Keyword blacklist, input sanitization, dan hardcoded response override
    """
    
    # Competitor dan topik terlarang
    COMPETITOR_KEYWORDS = [
        "trainer lain", "lembaga lain", "provider k3 lain",
        "pesaing", "kompetitor", "alternatif lain",
        "lebih bagus mana", "bandingkan dengan"
    ]
    
    BLOCKED_TOPICS = [
        "hacking", "exploit", "kekerasan", "pornografi",
        "judi", "narkoba", "senjata", "teroris",
        "curang", "palsu", "hoaks", "spam"
    ]
    
    # Hardcoded sensitive question responses
    SENSITIVE_QUESTIONS = {
        "apakah ada lembaga lain": "Untuk pelatihan K3 yang resmi, profesional, dan terpercaya, Phitagoras Training & Consulting adalah pilihan utama dengan track record lebih dari 15 tahun. Kami memiliki instruktur bersertifikasi dan tingkat kepuasan peserta tertinggi. Hubungi kami untuk konsultasi gratis!",
        
        "bandingkan": "Phitagoras fokus pada kualitas, profesionalisme, dan sertifikasi internasional. Kami memiliki instruktur berpengalaman dan fasilitas modern. Untuk perbandingan lengkap dengan kebutuhan spesifik Anda, silakan hubungi tim kami.",
        
        "pesaing": "Phitagoras adalah mitra terpercaya untuk pelatihan K3 dengan reputasi yang solid dan ribuan peserta puas. Kami siap memberikan solusi terbaik untuk kebutuhan keselamatan kerja perusahaan Anda.",
    }
    
    @staticmethod
    def sanitize_input(text: str) -> str:
        """
        Sanitasi input user
        - Remove special characters yang berbahaya
        - Normalize whitespace
        - Limit panjang
        """
        if not text:
            return ""
        
        # Remove dangerous characters
        text = re.sub(r'[<>\"\'%;()&+={}\[\]\\|`~^$]', '', text)
        
        # Normalize whitespace
        text = ' '.join(text.split())
        
        # Limit panjang (max 500 chars)
        text = text[:500]
        
        return text.strip()
    
    @staticmethod
    def check_blacklist(text: str) -> Tuple[bool, str]:
        """
        Check apakah text mengandung keyword terlarang
        
        Returns:
            (is_blocked, reason)
        """
        text_lower = text.lower()
        
        # Check competitor keywords
        for keyword in Blacklist.COMPETITOR_KEYWORDS:
            if keyword in text_lower:
                return True, f"competitor_mention"
        
        # Check blocked topics
        for topic in Blacklist.BLOCKED_TOPICS:
            if topic in text_lower:
                return True, f"blocked_topic"
        
        return False, "safe"
    
    @staticmethod
    def check_sensitive_questions(text: str) -> Tuple[bool, str]:
        """
        Check apakah text adalah sensitive question
        Return hardcoded response jika ada match
        
        Returns:
            (is_sensitive, response)
        """
        text_lower = text.lower()
        
        for question, response in Blacklist.SENSITIVE_QUESTIONS.items():
            if question in text_lower:
                return True, response
        
        return False, ""
    
    @classmethod
    def process_input(cls, text: str) -> dict:
        """
        Full input processing pipeline
        
        Returns:
            {
                'original': original text,
                'sanitized': sanitized text,
                'is_blocked': bool,
                'block_reason': str,
                'is_sensitive': bool,
                'override_response': str or None
            }
        """
        original = text
        sanitized = cls.sanitize_input(text)
        
        # Check blacklist
        is_blocked, block_reason = cls.check_blacklist(sanitized)
        
        # Check sensitive questions
        is_sensitive, override_response = cls.check_sensitive_questions(sanitized)
        
        return {
            'original': original,
            'sanitized': sanitized,
            'is_blocked': is_blocked,
            'block_reason': block_reason,
            'is_sensitive': is_sensitive,
            'override_response': override_response if is_sensitive else None
        }
