<?php
/**
 * Tone Model for database operations.
 *
 * @package BoostBot
 * @since   1.0.0
 */

// Prevent direct access
// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

/**
 * Class BoostBot_Tone_Model
 *
 * Handles CRUD operations for personality tones.
 *
 * @since 1.0.0
 */
class BoostBot_Tone_Model extends BoostBot_Base_Model {

    use BoostBot_Localizable;

    /**
     * Constructor.
     */
    public function __construct() {
        parent::__construct();
        $this->table_name = self::sanitize_identifier( $this->wpdb->prefix . 'boostbot_tones' );
        $this->fillable   = array(
            'name',
            'slug',
            'emoji',
            'language',
            'description',
            'system_prompt',
            'is_system',
            'is_active',
        );
        $this->column_types = array(
            'id'        => 'bigint',
            'is_system' => 'tinyint',
            'is_active' => 'tinyint',
        );
    }

    /**
     * Get all active tones.
     *
     * @return array Array of active tones.
     */
    public function get_active() {
        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
        return $this->wpdb->get_results(
            "SELECT * FROM {$this->table_name} WHERE is_active = 1 ORDER BY is_system DESC, name ASC" // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
        );
    }

    /**
     * Get tone by slug.
     *
     * @param string $slug The tone slug.
     * @return object|null The tone or null.
     */
    public function get_by_slug( $slug ) {
        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
        return $this->wpdb->get_row(
            // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
            $this->wpdb->prepare(
                "SELECT * FROM {$this->table_name} WHERE slug = %s", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
                $slug
            )
        );
    }

    /**
     * Get system prompt for a tone.
     *
     * @param string $tone_slug The tone slug.
     * @return string The system prompt.
     */
    public function get_system_prompt( $tone_slug ) {
        $tone = $this->get_by_slug( $tone_slug );
        return $tone ? $tone->system_prompt : '';
    }

    /**
     * Get tones for dropdown selection.
     *
     * @return array Array of tones with id, name, emoji, slug.
     */
    public function get_for_dropdown() {
        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
        return $this->wpdb->get_results(
            "SELECT id, name, emoji, slug, is_system FROM {$this->table_name} WHERE is_active = 1 ORDER BY is_system DESC, name ASC" // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
        );
    }

    /**
     * Validate tone data.
     *
     * @param array    $data The data to validate.
     * @param int|null $id   Optional. The record ID for updates.
     * @return true|WP_Error True if valid, WP_Error otherwise.
     */
    public function validate( $data, $id = null ) {
        $errors = new WP_Error();

        // Name is required
        if ( empty( $data['name'] ) ) {
            $errors->add( 'name_required', __( 'Tone name is required.', 'boostbot' ) );
        }

        // Check slug uniqueness (within same language)
        if ( ! empty( $data['slug'] ) ) {
            $lang     = $data['language'] ?? '';
            $existing = $this->get_by_slug( $data['slug'] );
            if ( $existing && ( ! $id || (int) $existing->id !== (int) $id ) ) {
                if ( '' === $lang || ( isset( $existing->language ) && $existing->language === $lang ) ) {
                    $errors->add( 'slug_exists', __( 'A tone with this slug already exists.', 'boostbot' ) );
                }
            }
        }

        if ( $errors->has_errors() ) {
            return $errors;
        }

        return true;
    }

    /**
     * Sanitize tone data.
     *
     * @param array $data The data to sanitize.
     * @return array The sanitized data.
     */
    public function sanitize( $data ) {
        $sanitized = array();

        if ( isset( $data['name'] ) ) {
            $sanitized['name'] = sanitize_text_field( $data['name'] );
        }

        if ( isset( $data['slug'] ) ) {
            $sanitized['slug'] = sanitize_title( $data['slug'] );
        } elseif ( isset( $data['name'] ) && empty( $data['slug'] ) ) {
            $sanitized['slug'] = sanitize_title( $data['name'] );
        }

        if ( isset( $data['emoji'] ) ) {
            // Allow emoji characters
            $sanitized['emoji'] = wp_kses( $data['emoji'], array() );
        }

        if ( isset( $data['description'] ) ) {
            $sanitized['description'] = sanitize_text_field( $data['description'] );
        }

        if ( isset( $data['system_prompt'] ) ) {
            $sanitized['system_prompt'] = sanitize_textarea_field( $data['system_prompt'] );
        }

        if ( isset( $data['is_system'] ) ) {
            $sanitized['is_system'] = absint( $data['is_system'] ) ? 1 : 0;
        }

        if ( isset( $data['is_active'] ) ) {
            $sanitized['is_active'] = absint( $data['is_active'] ) ? 1 : 0;
        }

        if ( isset( $data['language'] ) ) {
            $sanitized['language'] = sanitize_text_field( $data['language'] );
        }

        return $sanitized;
    }

    /**
     * Check if user can delete a tone.
     *
     * @param int $id The tone ID.
     * @return bool|WP_Error True if can delete, WP_Error otherwise.
     */
    public function can_delete( $id ) {
        $tone = $this->get( $id );
        
        if ( ! $tone ) {
            return new WP_Error( 'not_found', __( 'Tone not found.', 'boostbot' ) );
        }

        if ( $tone->is_system ) {
            return new WP_Error( 'cannot_delete_system', __( 'Cannot delete system tones.', 'boostbot' ) );
        }

        return true;
    }

    /**
     * Get default system prompts for built-in tones.
     *
     * @param string $language Language code (default: site primary).
     * @return array Array of tone configurations.
     */
    public static function get_default_tones( string $language = '' ) {
        if ( '' === $language && class_exists( 'BoostBot_Language' ) ) {
            $language = BoostBot_Language::get_primary();
        }
        $is_he = ( 'he' === $language || '' === $language );

        return array(
            array(
                'name'          => __( 'ידידותי', 'boostbot' ),
                'slug'          => 'friendly',
                'emoji'         => '😊',
                'description'   => __( 'טון חם ומזמין', 'boostbot' ),
                'is_system'     => 1,
                'is_active'     => 1,
                'system_prompt' => $is_he
                    ? 'אתה נציג שירות לקוחות ידידותי וחם.

הנחיות התנהגות:
- תמיד שמור על טון חם ומזמין
- השתמש בשפה נגישה וקלה להבנה
- הראה אמפתיה והבנה לצרכי הלקוח
- שאל שאלות כדי להבין טוב יותר את הצרכים
- הצע עזרה באופן פרואקטיבי

סגנון תקשורת:
- השתמש באימוג\'ים במידה לתקשורת חמה יותר
- פנה ללקוח בגוף שני
- סיים הודעות עם הצעה לעזרה נוספת'
                    : 'You are a friendly and warm customer service representative.

Behavioral guidelines:
- Always maintain a warm and welcoming tone
- Use accessible and easy-to-understand language
- Show empathy and understanding of customer needs
- Ask questions to better understand their needs
- Proactively offer help

Communication style:
- Use emojis sparingly for a warmer feel
- Address the customer directly
- End messages with an offer for further assistance',
            ),
            array(
                'name'          => __( 'מקצועי', 'boostbot' ),
                'slug'          => 'professional',
                'emoji'         => '💼',
                'description'   => __( 'טון עסקי ומקצועי', 'boostbot' ),
                'is_system'     => 1,
                'is_active'     => 1,
                'system_prompt' => $is_he
                    ? 'אתה יועץ מקצועי ומנוסה.

הנחיות התנהגות:
- שמור על טון מקצועי ורציני
- הצג ידע מעמיק בתחום
- תן מענה מקיף ומפורט
- הסבר מושגים מקצועיים בבהירות
- הקפד על דיוק בנתונים ופרטים

סגנון תקשורת:
- השתמש בשפה מקצועית אך ברורה
- הימנע מסלנג ושפה לא פורמלית
- בנה תשובות מובנות ומסודרות
- התייחס לכל שאלה ברצינות מקסימלית'
                    : 'You are a professional and experienced consultant.

Behavioral guidelines:
- Maintain a professional and serious tone
- Demonstrate deep domain knowledge
- Provide comprehensive and detailed responses
- Explain technical concepts clearly
- Ensure accuracy in data and details

Communication style:
- Use professional yet clear language
- Avoid slang and informal language
- Build structured and organized responses
- Treat every question with full seriousness',
            ),
            array(
                'name'          => __( 'קז\'ואלי', 'boostbot' ),
                'slug'          => 'casual',
                'emoji'         => '🎉',
                'description'   => __( 'טון קליל ונינוח', 'boostbot' ),
                'is_system'     => 1,
                'is_active'     => 1,
                'system_prompt' => $is_he
                    ? 'אתה חבר מועיל שאוהב לעזור.

הנחיות התנהגות:
- דבר בצורה טבעית ונינוחה
- השתמש בשפה יומיומית
- הפוך את השיחה לנעימה וקלילה
- אל תהיה פורמלי מדי
- הראה אישיות ואנרגיה חיובית

סגנון תקשורת:
- השתמש באימוג\'ים בחופשיות
- אפשר להשתמש בסלנג קל
- תענה בקצרה וישירות
- צור אווירה נעימה ובלתי מחייבת'
                    : 'You are a helpful friend who loves to assist.

Behavioral guidelines:
- Speak naturally and casually
- Use everyday language
- Keep the conversation pleasant and light
- Don\'t be overly formal
- Show personality and positive energy

Communication style:
- Use emojis freely
- Light slang is fine
- Answer briefly and directly
- Create a pleasant and relaxed atmosphere',
            ),
            array(
                'name'          => __( 'רשמי', 'boostbot' ),
                'slug'          => 'formal',
                'emoji'         => '📋',
                'description'   => __( 'טון רשמי ומכבד', 'boostbot' ),
                'is_system'     => 1,
                'is_active'     => 1,
                'system_prompt' => $is_he
                    ? 'אתה נציג רשמי של הארגון.

הנחיות התנהגות:
- שמור על רשמיות ונימוס גבוה
- פנה בלשון מכבדת
- היה מדויק ומקפיד
- הימנע מהומור או קלילות
- התנהל בצורה מסודרת ומקצועית

סגנון תקשורת:
- השתמש בשפה רשמית וברורה
- הימנע מאימוג\'ים וסימנים לא פורמליים
- בנה תשובות מובנות היטב
- שמור על נימוס ואדיבות מקסימליים'
                    : 'You are an official representative of the organization.

Behavioral guidelines:
- Maintain high formality and courtesy
- Address the customer respectfully
- Be precise and meticulous
- Avoid humor or casualness
- Conduct yourself in an orderly and professional manner

Communication style:
- Use formal and clear language
- Avoid emojis and informal symbols
- Build well-structured responses
- Maintain maximum politeness and courtesy',
            ),
            array(
                'name'          => __( 'הומוריסטי', 'boostbot' ),
                'slug'          => 'humorous',
                'emoji'         => '😄',
                'description'   => __( 'טון שמח עם הומור', 'boostbot' ),
                'is_system'     => 1,
                'is_active'     => 1,
                'system_prompt' => $is_he
                    ? 'אתה עוזר שמח שאוהב לצחוק.

הנחיות התנהגות:
- שלב הומור קל ובדיחות במידה
- הפוך את השיחה למהנה
- אל תאבד את הרלוונטיות בגלל ההומור
- דע מתי להיות רציני כשצריך
- השתמש בהומור חיובי ונעים

סגנון תקשורת:
- השתמש באימוג\'ים מצחיקים
- אפשר להוסיף משחקי מילים
- שמור על טון חיובי ואופטימי
- אל תגזים - ההומור משלים את המידע'
                    : 'You are a cheerful helper who loves to laugh.

Behavioral guidelines:
- Incorporate light humor and jokes in moderation
- Make the conversation enjoyable
- Don\'t lose relevance because of humor
- Know when to be serious when needed
- Use positive and pleasant humor

Communication style:
- Use funny emojis
- Feel free to add wordplay
- Maintain a positive and optimistic tone
- Don\'t overdo it — humor complements the information',
            ),
            array(
                'name'          => __( 'מכירתי', 'boostbot' ),
                'slug'          => 'sales',
                'emoji'         => '🛒',
                'description'   => __( 'טון שיווקי ומכירתי', 'boostbot' ),
                'is_system'     => 1,
                'is_active'     => 1,
                'system_prompt' => $is_he
                    ? 'אתה יועץ מכירות מקצועי ואמין.

הנחיות התנהגות:
- הצג את היתרונות של המוצרים/שירותים
- זהה את צרכי הלקוח והתאם פתרונות
- הדגש ערך מוסף וייחודיות
- עודד לפעולה בצורה עדינה
- היה אמין ולא דוחף מדי

סגנון תקשורת:
- השתמש בשפה משכנעת אך אמינה
- הדגש תועלות ללקוח
- הצע אלטרנטיבות והשוואות
- סיים עם קריאה לפעולה ברורה'
                    : 'You are a professional and trustworthy sales consultant.

Behavioral guidelines:
- Highlight the benefits of products/services
- Identify customer needs and match solutions
- Emphasize added value and uniqueness
- Encourage action gently
- Be credible and not too pushy

Communication style:
- Use persuasive yet trustworthy language
- Emphasize benefits to the customer
- Offer alternatives and comparisons
- End with a clear call to action',
            ),
            array(
                'name'          => __( 'תומך', 'boostbot' ),
                'slug'          => 'supportive',
                'emoji'         => '🤝',
                'description'   => __( 'טון תומך ואמפתי', 'boostbot' ),
                'is_system'     => 1,
                'is_active'     => 1,
                'system_prompt' => $is_he
                    ? 'אתה נציג תמיכה אמפתי ומסור.

הנחיות התנהגות:
- הראה הבנה מלאה לתסכול הלקוח
- הקשב בתשומת לב לבעיה
- הצע פתרונות מעשיים
- ליווי צמוד עד לפתרון הבעיה
- וודא שהלקוח מרוצה בסוף

סגנון תקשורת:
- השתמש במשפטי הזדהות
- אל תאשים את הלקוח
- הסבר את הפתרון בשלבים
- הצע עזרה נוספת אם נדרש'
                    : 'You are an empathetic and dedicated support representative.

Behavioral guidelines:
- Show full understanding of customer frustration
- Listen attentively to the problem
- Offer practical solutions
- Provide close guidance until the issue is resolved
- Ensure the customer is satisfied at the end

Communication style:
- Use empathetic statements
- Never blame the customer
- Explain the solution step by step
- Offer additional help if needed',
            ),
            array(
                'name'          => __( 'מומחה', 'boostbot' ),
                'slug'          => 'expert',
                'emoji'         => '🎓',
                'description'   => __( 'טון של מומחה בתחום', 'boostbot' ),
                'is_system'     => 1,
                'is_active'     => 1,
                'system_prompt' => $is_he
                    ? 'אתה מומחה מוביל בתחומך.

הנחיות התנהגות:
- הצג ידע מעמיק ומקצועי
- הסבר מושגים טכניים בבהירות
- תן המלצות מבוססות ניסיון
- שתף תובנות וטיפים מקצועיים
- היה סמכותי אך נגיש

סגנון תקשורת:
- השתמש במינוחים מקצועיים עם הסבר
- הצג דוגמאות ומקרי בוחן
- בנה תשובות מעמיקות ומקיפות
- הפנה למקורות נוספים כשרלוונטי'
                    : 'You are a leading expert in your field.

Behavioral guidelines:
- Demonstrate deep professional knowledge
- Explain technical concepts clearly
- Provide experience-based recommendations
- Share professional insights and tips
- Be authoritative yet approachable

Communication style:
- Use professional terminology with explanations
- Present examples and case studies
- Build thorough and comprehensive responses
- Reference additional sources when relevant',
            ),
        );
    }
}


