/**
 * Provider Utilities
 *
 * 提供商工具函数
 */

import { createOpenAI } from '@ai-sdk/openai';
import type { ConnectionTestResult, ProviderFactory } from './types.js';

/**
 * 测试提供商连接
 * 通过简单的模型列表请求测试连接是否正常
 */
export async function testProviderConnection(
  factory: ProviderFactory,
  apiKey: string,
  baseUrl?: string,
  testModel?: string
): Promise<ConnectionTestResult> {
  const startTime = Date.now();

  try {
    // 创建模型实例
    const getModel = factory({ apiKey, baseUrl });
    const model = getModel(testModel ?? 'test');

    // 尝试获取模型信息（这会触发连接验证）
    // 由于不同提供商的验证方式不同，这里使用一个简单的方法
    // 实际上只是验证工厂函数能否正常创建模型
    if (!model) {
      return {
        success: false,
        error: 'Failed to create model instance',
      };
    }

    const latency = Date.now() - startTime;

    return {
      success: true,
      latency,
    };
  } catch (error) {
    return {
      success: false,
      error: error instanceof Error ? error.message : 'Unknown error',
      latency: Date.now() - startTime,
    };
  }
}

/**
 * 测试 OpenAI 兼容 API 连接
 * 通过 /v1/models 端点测试
 */
export async function testOpenAICompatibleConnection(
  apiKey: string,
  baseUrl: string
): Promise<ConnectionTestResult> {
  const startTime = Date.now();

  try {
    // 构建 models 端点 URL
    const modelsUrl = baseUrl.endsWith('/')
      ? `${baseUrl}models`
      : `${baseUrl}/models`;

    const response = await fetch(modelsUrl, {
      method: 'GET',
      headers: {
        Authorization: `Bearer ${apiKey}`,
        'Content-Type': 'application/json',
      },
    });

    const latency = Date.now() - startTime;

    if (!response.ok) {
      return {
        success: false,
        error: `HTTP ${response.status}: ${response.statusText}`,
        latency,
      };
    }

    return {
      success: true,
      latency,
    };
  } catch (error) {
    return {
      success: false,
      error: error instanceof Error ? error.message : 'Network error',
      latency: Date.now() - startTime,
    };
  }
}

/**
 * 创建 OpenAI 兼容的提供商工厂
 * 用于自定义 OpenAI 兼容服务（如 Ollama、vLLM 等）
 */
export function createOpenAICompatibleFactory(baseUrl: string): ProviderFactory {
  return ({ apiKey }) => {
    const client = createOpenAI({
      apiKey: apiKey || 'dummy-key', // 某些本地服务不需要 key
      baseURL: baseUrl,
    });
    return (model) => client(model);
  };
}

/**
 * 验证提供商 ID 格式
 */
export function isValidProviderId(id: string): boolean {
  // 只允许字母、数字、连字符和下划线
  return /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(id);
}

/**
 * 验证 URL 格式
 */
export function isValidUrl(url: string): boolean {
  try {
    new URL(url);
    return true;
  } catch {
    return false;
  }
}
