#!/usr/bin/env node
/**
 * test_model_switch.js
 * Тест переключения модели через Supabase.
 * 
 * Использование:
 *   node test_model_switch.js                          # интерактивно выбрать модель
 *   node test_model_switch.js "Sonnet 4.5"             # конкретная модель, без промпта
 *   node test_model_switch.js "Sonnet 4.5" "привет"    # переключить модель и отправить промпт
 * 
 * Переменные окружения (опционально, иначе используются встроенные):
 *   SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, MOBILE_TOKEN
 */

const { createClient } = require('@supabase/supabase-js');
const readline = require('readline');

// ---- Config ----
const SUPABASE_URL = process.env.SUPABASE_URL || 'https://dtaegtkfdwgdbyolcxht.supabase.co';
const SUPABASE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_ANON_KEY || 'sb_publishable__giFEuM62kLTFecXfufGIw_a-Dv9y6O';
const CLIENT_TYPE = null; // DB allows only 'cursor' or null

// Full model list (matches CURSOR_AVAILABLE_MODELS in extension.js)
const MODELS = [
    'Auto',
    'Composer 1',
    'Sonnet 4.5',
    'Sonnet 4.5 Thinking',
    'Opus 4.5',
    'Opus 4.5 Thinking',
    'Opus 4.1',
    'Gemini 3 Pro',
    'GPT-5',
    'GPT-5.1',
    'GPT-5 High',
    'GPT-5.1 High',
    'GPT-5 Codex',
    'GPT-5 Codex High',
    'GPT-5.1 Codex',
    'GPT-5.1 Codex High',
    'Grok',
    'GPT-4',
    'Sonnet 4',
    'Sonnet 4 Thinking',
];

async function getToken(supabase) {
    if (process.env.MOBILE_TOKEN) return process.env.MOBILE_TOKEN;
    // Try to read from last active connection signal in Supabase
    const { data } = await supabase
        .from('messages')
        .select('user_id')
        .eq('role', 'agent')
        .ilike('content', 'SYSTEM: Connection established%')
        .order('created_at', { ascending: false })
        .limit(1);
    if (data && data.length > 0) return data[0].user_id;
    return null;
}

async function pickModelInteractive() {
    return new Promise((resolve) => {
        console.log('\nДоступные модели:');
        MODELS.forEach((m, i) => console.log(`  ${String(i).padStart(2)}. ${m}`));
        const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
        rl.question('\nВведи номер или название модели: ', (answer) => {
            rl.close();
            const idx = parseInt(answer, 10);
            if (!isNaN(idx) && MODELS[idx]) {
                resolve(MODELS[idx]);
            } else {
                const found = MODELS.find(m => m.toLowerCase() === answer.trim().toLowerCase());
                resolve(found || answer.trim());
            }
        });
    });
}

async function main() {
    const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);

    let modelName = process.argv[2] || null;
    const promptText = process.argv[3] || null;

    if (!modelName) {
        modelName = await pickModelInteractive();
    }

    const token = await getToken(supabase);
    if (!token) {
        console.error('❌ Не удалось определить MOBILE_TOKEN. Задай MOBILE_TOKEN=xxx или подключись через приложение.');
        process.exit(1);
    }
    console.log(`\n🔗 User token: ${token.substring(0, 8)}...`);
    console.log(`🎯 Модель: ${modelName}`);

    // Insert a pending user message with model field
    const payload = {
        user_id: token,
        role: 'user',
        content: promptText || `[SYSTEM TEST] Switch to model: ${modelName}`,
        status: 'pending',
        client_type: CLIENT_TYPE,
        model: modelName === 'Auto' ? null : modelName,
    };

    // If no promptText — just send a silent model switch signal (no actual prompt)
    if (!promptText) {
        payload.content = `[MODEL SWITCH TEST] Switching to: ${modelName}`;
        payload.model = modelName === 'Auto' ? null : modelName;
        payload.status = 'pending'; // Extension will pick this up as a prompt
    }

    console.log(`\n📤 Отправляю в Supabase...`);
    console.log(`   role: ${payload.role}`);
    console.log(`   status: ${payload.status}`);
    console.log(`   model: ${payload.model || '(Auto)'}`);
    console.log(`   content: "${payload.content.substring(0, 80)}"`);

    const { data, error } = await supabase.from('messages').insert(payload).select().single();

    if (error) {
        console.error(`\n❌ Ошибка: ${error.message}`);
        process.exit(1);
    }

    console.log(`\n✅ Сообщение отправлено! ID: ${data.id}`);
    console.log(`\nЖди в output канале Cursor: [MODEL] Switching before prompt...`);
    console.log(`Потом ответ придёт обратно в Supabase и появится в Output Channel.`);
    process.exit(0);
}

main().catch(e => {
    console.error('Fatal:', e.message);
    process.exit(1);
});
