import '../utils/icons';

interface ModelField {
  name: string;
  label: string;
  type: 'text' | 'select' | 'number';
  required: boolean;
  placeholder?: string;
  options?: string[];
  default?: string | number;
  description?: string;
}

interface ModelProvider {
  id: string;
  name: string;
  icon: string;
  fields: ModelField[];
  models?: string[];
  description?: string;
}

// Define the available model providers and their configuration fields
export const modelProviders: ModelProvider[] = [
  {
    id: 'openai',
    name: 'OpenAI',
    icon: 'ai-providers:openai',
    description: 'Integration with OpenAI API (GPT models)',
    fields: [
      {
        name: 'apiKey',
        label: 'API Key',
        type: 'text',
        required: true,
        placeholder: 'sk-...',
      },
      {
        name: 'model',
        label: 'Model',
        type: 'select',
        required: true,
        options: [
          'gpt-5.4',
          'gpt-5.4-mini',
          'gpt-5.2',
          'gpt-5.1',
          'gpt-5.1-mini',
          'gpt-4.1',
          'gpt-4.1-mini',
          'gpt-4o',
          'gpt-4o-mini',
          'o4-mini',
          'o3',
          'o3-mini',
          'o1',
          'o1-mini',
        ],
        default: 'gpt-4.1',
      },
    ],
  },
  {
    id: 'azure',
    name: 'Azure OpenAI',
    icon: 'ai-providers:azure',
    description: 'Integration with Azure OpenAI Service',
    fields: [
      {
        name: 'apiKey',
        label: 'API Key',
        type: 'text',
        required: true,
        placeholder: 'Your Azure OpenAI API key',
      },
      {
        name: 'endpoint',
        label: 'Endpoint',
        type: 'text',
        required: true,
        placeholder: 'https://your-resource.openai.azure.com',
        description:
          'The base URL of your Azure OpenAI resource (e.g. https://your-resource.openai.azure.com). Do NOT include any path like /openai/v1/chat/completions.',
      },
      {
        name: 'deploymentName',
        label: 'Deployment Name',
        type: 'text',
        required: true,
        placeholder: 'Your deployment name',
        description: 'The name of your model deployment in Azure',
      },
      {
        name: 'model',
        label: 'Model',
        type: 'select',
        required: true,
        options: [
          'gpt-5.4',
          'gpt-5.2',
          'gpt-5.1',
          'gpt-4.1',
          'gpt-4.1-mini',
          'gpt-4o',
          'gpt-4o-mini',
          'o4-mini',
          'o3',
          'o3-mini',
        ],
        default: 'gpt-4o',
        description: 'The model used by your Azure OpenAI deployment',
      },
    ],
    models: [
      'gpt-5.4',
      'gpt-5.2',
      'gpt-5.1',
      'gpt-4.1',
      'gpt-4.1-mini',
      'gpt-4o',
      'gpt-4o-mini',
      'o4-mini',
      'o3',
      'o3-mini',
    ],
  },
  {
    id: 'anthropic',
    name: 'Anthropic',
    icon: 'ai-providers:anthropic',
    description: 'Integration with Anthropic Claude models',
    fields: [
      {
        name: 'apiKey',
        label: 'API Key',
        type: 'text',
        required: true,
        placeholder: 'sk-ant-...',
      },
      {
        name: 'model',
        label: 'Model',
        type: 'select',
        required: true,
        options: [
          'claude-opus-4-6',
          'claude-sonnet-4-6',
          'claude-haiku-4-5-20251001',
          'claude-3-7-sonnet-20250219',
        ],
        default: 'claude-sonnet-4-6',
      },
    ],
  },
  {
    id: 'mistral',
    name: 'Mistral AI',
    icon: 'ai-providers:mistral',
    description: 'Integration with Mistral AI models',
    fields: [
      {
        name: 'apiKey',
        label: 'API Key',
        type: 'text',
        required: true,
        placeholder: 'Your Mistral API key',
      },
      {
        name: 'model',
        label: 'Model',
        type: 'select',
        required: true,
        options: [
          'mistral-large-latest',
          'mistral-medium-latest',
          'mistral-small-latest',
          'magistral-medium-2507',
          'magistral-small-2507',
          'codestral-latest',
        ],
        default: 'mistral-large-latest',
      },
    ],
  },
  {
    id: 'gemini',
    name: 'Google Gemini',
    icon: 'ai-providers:google',
    description: 'Integration with Google Gemini models',
    fields: [
      {
        name: 'apiKey',
        label: 'API Key',
        type: 'text',
        required: true,
        placeholder: 'Your Google API key',
      },
      {
        name: 'model',
        label: 'Model',
        type: 'select',
        required: true,
        options: [
          'gemini-3-pro-preview',
          'gemini-2.5-pro',
          'gemini-2.5-flash',
          'gemini-2.5-flash-lite',
        ],
        default: 'gemini-2.5-flash',
      },
    ],
  },
  {
    id: 'deepseek',
    name: 'DeepSeek',
    icon: 'ai-providers:deepseek',
    description: 'Integration with DeepSeek models',
    fields: [
      {
        name: 'apiKey',
        label: 'API Key',
        type: 'text',
        required: true,
        placeholder: 'Your DeepSeek API key',
      },
      {
        name: 'model',
        label: 'Model',
        type: 'select',
        required: true,
        options: ['deepseek-chat', 'deepseek-reasoner'],
        default: 'deepseek-chat',
      },
    ],
  },
  {
    id: 'vllm',
    name: 'vLLM (OpenAI-compatible)',
    icon: 'ai-providers:local',
    description: 'Integration with vLLM or any OpenAI-compatible endpoint',
    fields: [
      {
        name: 'apiKey',
        label: 'API Key',
        type: 'text',
        required: false,
        placeholder: 'sk-noop (leave blank if vLLM has no auth)',
      },
      {
        name: 'baseUrl',
        label: 'Base URL',
        type: 'text',
        required: true,
        placeholder: 'http://vllm-server:8000/v1',
        description: 'Full URL including /v1 — e.g. http://host:8000/v1',
      },
      {
        name: 'model',
        label: 'Model',
        type: 'text',
        required: true,
        placeholder: 'meta-llama/Llama-3.1-8B-Instruct',
        description: 'Must match --served-model-name passed to vLLM',
      },
    ],
  },
  {
    id: 'local',
    name: 'Local Models',
    icon: 'ai-providers:local',
    description: 'Integration with locally hosted models (Ollama or similar)',
    fields: [
      {
        name: 'apiKey',
        label: 'API Key',
        type: 'text',
        required: false,
        placeholder: 'Your Local Model API key',
      },
      {
        name: 'baseUrl',
        label: 'Base URL',
        type: 'text',
        required: true,
        placeholder: 'http://localhost:11434',
        default: 'http://localhost:11434',
      },
      {
        name: 'model',
        label: 'Model',
        type: 'text',
        required: true,
        placeholder: 'llama3.1',
        default: 'llama3.1',
      },
    ],
    models: [
      'llama3.1',
      'llama3.2',
      'deepseek-r1',
      'gemma3',
      'gemma2',
      'mistral',
      'qwen3',
      'qwen2.5',
      'phi4',
      'phi3',
    ],
  },
];

// Function to get provider by ID
export function getProviderById(id: string): ModelProvider | undefined {
  return modelProviders.find(provider => provider.id === id);
}

// Function to get fields for a specific provider
export function getProviderFields(providerId: string): ModelField[] {
  const provider = getProviderById(providerId);
  return provider ? provider.fields : [];
}

// Function to get default configuration for a provider
export function getDefaultConfig(providerId: string): Record<string, string | number> {
  const fields = getProviderFields(providerId);
  const config: Record<string, string | number> = {};

  fields.forEach(field => {
    if (field.default !== undefined) {
      config[field.name] = field.default;
    }
  });

  return config;
}
