import { cli, Strategy } from '@jackwener/opencli/registry';
import { selectorError, TimeoutError } from '@jackwener/opencli/errors';
import {
    buildChatwiseInjectTextJs,
    buildChatwiseMessageCountJs,
    buildChatwiseResponseAfterJs,
    requirePositiveTimeout,
} from './utils.js';
export const askCommand = cli({
    site: 'chatwise',
    name: 'ask',
    access: 'write',
    description: 'Send a prompt and wait for the AI response (send + wait + read)',
    domain: 'localhost',
    strategy: Strategy.UI,
    browser: true,
    args: [
        { name: 'text', required: true, positional: true, help: 'Prompt to send' },
        { name: 'timeout', type: 'int', required: false, help: 'Max seconds to wait (default: 30)', default: 30 },
    ],
    columns: ['Role', 'Text'],
    func: async (page, kwargs) => {
        const text = kwargs.text;
        const timeout = requirePositiveTimeout(kwargs.timeout);
        // Snapshot content length
        const beforeLen = await page.evaluate(buildChatwiseMessageCountJs());
        // Send message
        const injected = await page.evaluate(buildChatwiseInjectTextJs(text));
        if (!injected)
            throw selectorError('ChatWise input element');
        await page.wait(0.5);
        await page.pressKey('Enter');
        // Poll for response
        const pollInterval = 2;
        const maxPolls = Math.ceil(timeout / pollInterval);
        let response = '';
        for (let i = 0; i < maxPolls; i++) {
            await page.wait(pollInterval);
            const result = await page.evaluate(buildChatwiseResponseAfterJs(beforeLen, text));
            if (result) {
                const next = String(result).trim();
                if (next === response) break;
                response = next;
            }
        }
        if (!response) {
            throw new TimeoutError('ChatWise response', timeout, 'Confirm ChatWise is done generating, then retry with a larger --timeout if needed.');
        }
        return [
            { Role: 'User', Text: text },
            { Role: 'Assistant', Text: response },
        ];
    },
});
