<?php

class AIEngine {

    /*
    ============================================
    STOPWORDS
    ============================================
    */

    private static $stopwords = [

        'de',
        'la',
        'el',
        'los',
        'las',
        'un',
        'una',
        'unos',
        'unas',
        'y',
        'o',
        'a',
        'que',
        'qué',
        'cual',
        'cuál',
        'cuales',
        'cuáles',
        'son',
        'es',
        'hay',
        'me',
        'quiero',
        'necesito',
        'para',
        'con',
        'sin',
        'por',
        'del',
        'al',
        'en',
        'cómo',
        'como',
        'cuanto',
        'cuánto',
        'tienen',
        'teneis',
        'tengo',
        'puedo'

    ];

    /*
    ============================================
    LIMPIAR TEXTO
    ============================================
    */

    public static function clean($text){

        $text = strip_tags($text);

        $text = html_entity_decode($text);

        $text = strtolower($text);

        $text = preg_replace('/[^a-zA-Z0-9áéíóúñü\s]/u', ' ', $text);

        $text = preg_replace('/\s+/', ' ', $text);

        return trim($text);
    }

    /*
    ============================================
    EXTRAER KEYWORDS
    ============================================
    */

    public static function extractKeywords($question){

        $question = self::clean($question);

        $words = explode(" ", $question);

        $keywords = [];

        foreach($words as $word){

            $word = trim($word);

            if(strlen($word) < 3){
                continue;
            }

            if(in_array($word, self::$stopwords)){
                continue;
            }

            $keywords[] = $word;
        }

        return array_unique($keywords);
    }

    /*
    ============================================
    SIMILITUD SIMPLE
    ============================================
    */

    public static function similarity($a, $b){

        similar_text($a, $b, $percent);

        return $percent;
    }

    /*
    ============================================
    EXTRAER TEXTO RELEVANTE
    ============================================
    */

    public static function extractRelevant($text, $question){

        $text = self::clean($text);

        $keywords = self::extractKeywords($question);

        $sentences = preg_split(
            '/(\.|\n|\|)/',
            $text
        );

        $matches = [];

        foreach($sentences as $sentence){

            $sentence_clean = trim(
                strtolower($sentence)
            );

            if(strlen($sentence_clean) < 5){
                continue;
            }

            $score = 0;

            foreach($keywords as $keyword){

                /*
                ============================================
                MATCH DIRECTO
                ============================================
                */

                if(
                    strpos(
                        $sentence_clean,
                        $keyword
                    ) !== false
                ){
                    $score += 5;
                }

                /*
                ============================================
                MATCH FLEXIBLE
                ============================================
                */

                $words_sentence = explode(
                    " ",
                    $sentence_clean
                );

                foreach($words_sentence as $sw){

                    $similarity =
                    self::similarity(
                        $keyword,
                        $sw
                    );

                    if($similarity > 75){
                        $score += 2;
                    }
                }
            }

            /*
            ============================================
            BONUS COMERCIAL
            ============================================
            */

            if(
                strpos($sentence_clean, 'tarifa') !== false
                ||
                strpos($sentence_clean, 'precio') !== false
                ||
                strpos($sentence_clean, 'promoción') !== false
                ||
                strpos($sentence_clean, 'permanencia') !== false
            ){
                $score += 3;
            }

            if($score > 0){

                $matches[] = [
                    'score' => $score,
                    'text'  => trim($sentence)
                ];
            }
        }

        /*
        ============================================
        ORDENAR POR SCORE
        ============================================
        */

        usort($matches, function($a, $b){

            return $b['score'] - $a['score'];

        });

        /*
        ============================================
        ELIMINAR DUPLICADOS
        ============================================
        */

        $used = [];

        $final = [];

        foreach($matches as $m){

            if(count($final) >= 8){
                break;
            }

            if(in_array($m['text'], $used)){
                continue;
            }

            $used[] = $m['text'];

            $final[] = $m['text'];
        }

        return $final;
    }

    /*
    ============================================
    DETECTAR INTENCIÓN
    ============================================
    */

    public static function detectIntent($question){

        $q = strtolower($question);

        if(
            strpos($q, 'precio') !== false
            ||
            strpos($q, 'tarifa') !== false
        ){
            return "pricing";
        }

        if(
            strpos($q, 'promoc') !== false
        ){
            return "promotion";
        }

        if(
            strpos($q, 'permanencia') !== false
        ){
            return "permanence";
        }

        if(
            strpos($q, 'hola') !== false
            ||
            strpos($q, 'buenas') !== false
        ){
            return "greeting";
        }

        return "general";
    }

    /*
    ============================================
    RESPUESTA CONVERSACIONAL
    ============================================
    */

    public static function buildAnswer(
        $title,
        $campaign,
        $category,
        $relevantTexts,
        $question = ''
    ){

        $intent =
        self::detectIntent($question);

        /*
        ============================================
        INTRO
        ============================================
        */

        $intro = "";

        switch($intent){

            case "greeting":

                $intro = "
                <p>
                👋 Hola, encantado de ayudarte.
                Puedes consultarme tarifas, promociones,
                contratos y soporte comercial.
                </p>
                ";

            break;

            case "pricing":

                $intro = "
                <p>
                💡 Claro, encontré información relacionada
                con precios y tarifas eléctricas.
                </p>
                ";

            break;

            case "promotion":

                $intro = "
                <p>
                🚀 Estas son las promociones que encontré.
                </p>
                ";

            break;

            case "permanence":

                $intro = "
                <p>
                📄 Encontré información relacionada
                con permanencias y condiciones.
                </p>
                ";

            break;

            default:

                $intro = "
                <p>
                🤖 Encontré información que podría ayudarte.
                </p>
                ";
        }

        /*
        ============================================
        HTML
        ============================================
        */

        $html = "

        <div class='result-card'>

            <div class='result-title'>
                " . htmlspecialchars($title) . "
            </div>

            <div class='result-meta'>
                Campaña:
                " . htmlspecialchars($campaign) . "
                |
                Categoría:
                " . htmlspecialchars($category) . "
            </div>

            <div class='result-content'>

                $intro
        ";

        if(empty($relevantTexts)){

            $html .= "
            <p>
            No encontré coincidencias exactas,
            pero intenta preguntarme usando
            otras palabras.
            </p>
            ";

        } else {

            $html .= "<ul>";

            foreach($relevantTexts as $text){

                $html .= "
                <li style='margin-bottom:10px;'>
                    " . htmlspecialchars($text) . "
                </li>
                ";
            }

            $html .= "</ul>";

            /*
            ============================================
            CIERRE CONVERSACIONAL
            ============================================
            */

            $html .= "
            <p style='margin-top:20px;font-weight:600;'>
                ¿Quieres que te ayude a comparar
                tarifas o recomendar una opción?
            </p>
            ";
        }

        $html .= "
            </div>

        </div>
        ";

        return $html;
    }
}

?>