CREATE EXTENSION IF NOT EXISTS pgcrypto;

INSERT INTO gateway_user_groups (
  group_key, name, description, priority,
  recharge_discount_policy, billing_discount_policy, rate_limit_policy, quota_policy, metadata, status
)
VALUES
  (
    'default', 'Default Users', 'Built-in default group for local and synchronized users.', 100,
    '{"discountFactor":1}'::jsonb,
    '{"discountFactor":1}'::jsonb,
    '{"rules":[{"metric":"rpm","limit":60,"windowSeconds":60},{"metric":"tpm_total","limit":120000,"windowSeconds":60},{"metric":"concurrent","limit":3,"leaseTtlSeconds":120}]}'::jsonb,
    '{}'::jsonb,
    '{"seed":"phase1"}'::jsonb,
    'active'
  ),
  (
    'vip', 'VIP Users', 'Higher quota group for future recharge and concurrency policies.', 50,
    '{"discountFactor":0.9}'::jsonb,
    '{"discountFactor":0.95}'::jsonb,
    '{"rules":[{"metric":"rpm","limit":300,"windowSeconds":60},{"metric":"tpm_total","limit":600000,"windowSeconds":60},{"metric":"concurrent","limit":10,"leaseTtlSeconds":120}]}'::jsonb,
    '{}'::jsonb,
    '{"seed":"phase1"}'::jsonb,
    'active'
  )
ON CONFLICT (group_key) DO UPDATE
SET name = EXCLUDED.name,
    description = EXCLUDED.description,
    priority = EXCLUDED.priority,
    recharge_discount_policy = EXCLUDED.recharge_discount_policy,
    billing_discount_policy = EXCLUDED.billing_discount_policy,
    rate_limit_policy = EXCLUDED.rate_limit_policy,
    updated_at = now();

INSERT INTO gateway_tenants (tenant_key, source, external_tenant_id, name, default_user_group_id, metadata, status)
VALUES (
  'default',
  'gateway',
  'default',
  'Default Tenant',
  (SELECT id FROM gateway_user_groups WHERE group_key = 'default'),
  '{"seed":"phase1"}'::jsonb,
  'active'
)
ON CONFLICT (tenant_key) DO UPDATE
SET name = EXCLUDED.name,
    default_user_group_id = EXCLUDED.default_user_group_id,
    updated_at = now();

INSERT INTO model_catalog_providers (
  provider_key, provider_code, display_name, provider_type, icon_path, source, capability_schema, default_rate_limit_policy, metadata, status
)
VALUES
  (
    'openai',
    'openai',
    'OpenAI',
    'openai',
    NULL,
    'server-main.integration-platform',
    '{"chat":true,"imageGeneration":true,"imageEdit":true,"stream":true}'::jsonb,
    '{"rules":[{"metric":"rpm","limit":500,"windowSeconds":60},{"metric":"tpm_total","limit":1000000,"windowSeconds":60},{"metric":"concurrent","limit":20,"leaseTtlSeconds":120}]}'::jsonb,
    '{"seed":"phase1","syncSource":"server-main.integration-platform","sourceCode":"openai"}'::jsonb,
    'active'
  ),
  (
    'gemini',
    'google-gemini',
    'Google Gemini',
    'gemini',
    'https://static.51easyai.com/gemini-color.png',
    'server-main.integration-platform',
    '{"chat":true,"imageGeneration":true,"imageEdit":true,"stream":true}'::jsonb,
    '{"rules":[{"metric":"rpm","limit":500,"windowSeconds":60},{"metric":"tpm_total","limit":1000000,"windowSeconds":60},{"metric":"concurrent","limit":20,"leaseTtlSeconds":120}]}'::jsonb,
    '{"seed":"phase1","syncSource":"server-main.integration-platform","sourceCode":"google-gemini"}'::jsonb,
    'active'
  )
ON CONFLICT (provider_key) DO UPDATE
SET provider_code = EXCLUDED.provider_code,
    display_name = EXCLUDED.display_name,
    provider_type = EXCLUDED.provider_type,
    icon_path = EXCLUDED.icon_path,
    source = EXCLUDED.source,
    capability_schema = EXCLUDED.capability_schema,
    default_rate_limit_policy = EXCLUDED.default_rate_limit_policy,
    metadata = model_catalog_providers.metadata || EXCLUDED.metadata,
    updated_at = now();

INSERT INTO base_model_catalog (
  provider_id, provider_key, canonical_model_key, provider_model_name, model_type, display_name,
  capabilities, base_billing_config, default_rate_limit_policy, metadata, status
)
VALUES
  (
    (SELECT id FROM model_catalog_providers WHERE provider_key = 'openai'),
    'openai',
    'openai:gpt-4o-mini',
    'gpt-4o-mini',
    'chat',
    'GPT-4o mini',
    '{"stream":true,"vision":true,"inputModalities":["text","image"],"outputModalities":["text"],"maxInputTokens":128000}'::jsonb,
    '{"textInputPer1k":0.15,"textOutputPer1k":0.6,"currency":"resource"}'::jsonb,
    '{"rules":[{"metric":"rpm","limit":300,"windowSeconds":60},{"metric":"tpm_total","limit":500000,"windowSeconds":60},{"metric":"concurrent","limit":10,"leaseTtlSeconds":120}]}'::jsonb,
    '{"seed":"phase1"}'::jsonb,
    'active'
  ),
  (
    (SELECT id FROM model_catalog_providers WHERE provider_key = 'openai'),
    'openai',
    'openai:gpt-image-1',
    'gpt-image-1',
    'image',
    'GPT Image 1',
    '{"imageGeneration":true,"imageEdit":true,"inputModalities":["text","image","mask"],"outputModalities":["image"],"sizes":["1024x1024","1024x1536","1536x1024"],"qualities":["low","medium","high"]}'::jsonb,
    '{"imageBase":5,"editBase":6,"currency":"resource","qualityWeights":{"low":0.7,"standard":1,"medium":1,"high":1.4},"sizeWeights":{"1024x1024":1,"1024x1536":1.35,"1536x1024":1.35}}'::jsonb,
    '{"rules":[{"metric":"rpm","limit":60,"windowSeconds":60},{"metric":"concurrent","limit":4,"leaseTtlSeconds":180}]}'::jsonb,
    '{"seed":"phase1"}'::jsonb,
    'active'
  ),
  (
    (SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini'),
    'gemini',
    'gemini:gemini-2.5-flash',
    'gemini-2.5-flash',
    'chat',
    'Gemini 2.5 Flash',
    '{"stream":true,"vision":true,"inputModalities":["text","image"],"outputModalities":["text"],"maxInputTokens":1048576}'::jsonb,
    '{"textInputPer1k":0.1,"textOutputPer1k":0.4,"currency":"resource"}'::jsonb,
    '{"rules":[{"metric":"rpm","limit":300,"windowSeconds":60},{"metric":"tpm_total","limit":500000,"windowSeconds":60},{"metric":"concurrent","limit":10,"leaseTtlSeconds":120}]}'::jsonb,
    '{"seed":"phase1"}'::jsonb,
    'active'
  ),
  (
    (SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini'),
    'gemini',
    'gemini:gemini-2.5-flash-image',
    'gemini-2.5-flash-image',
    'image',
    'Gemini 2.5 Flash Image',
    '{"imageGeneration":true,"imageEdit":true,"inputModalities":["text","image","mask"],"outputModalities":["image"],"sizes":["1024x1024","1024x1536","1536x1024"],"qualities":["standard","high"]}'::jsonb,
    '{"imageBase":4,"editBase":5,"currency":"resource","qualityWeights":{"standard":1,"high":1.35},"sizeWeights":{"1024x1024":1,"1024x1536":1.3,"1536x1024":1.3}}'::jsonb,
    '{"rules":[{"metric":"rpm","limit":60,"windowSeconds":60},{"metric":"concurrent","limit":4,"leaseTtlSeconds":180}]}'::jsonb,
    '{"seed":"phase1"}'::jsonb,
    'active'
  )
ON CONFLICT (canonical_model_key) DO UPDATE
SET provider_id = EXCLUDED.provider_id,
    provider_key = EXCLUDED.provider_key,
    provider_model_name = EXCLUDED.provider_model_name,
    model_type = EXCLUDED.model_type,
    display_name = EXCLUDED.display_name,
    capabilities = EXCLUDED.capabilities,
    base_billing_config = EXCLUDED.base_billing_config,
    default_rate_limit_policy = EXCLUDED.default_rate_limit_policy,
    updated_at = now();

INSERT INTO integration_platforms (
  provider, platform_key, name, base_url, auth_type, credentials, config,
  default_pricing_mode, default_discount_factor, retry_policy, rate_limit_policy, priority, status
)
VALUES
  (
    'openai', 'openai-simulation', 'OpenAI Simulation',
    'https://api.openai.com/v1', 'bearer',
    '{"mode":"simulation"}'::jsonb,
    '{"testMode":true,"seed":"phase1"}'::jsonb,
    'inherit_discount', 1,
    '{"enabled":true,"maxAttempts":2,"retryOn":["rate_limit","timeout","server_error","network"]}'::jsonb,
    '{"rules":[{"metric":"rpm","limit":120,"windowSeconds":60},{"metric":"tpm_total","limit":240000,"windowSeconds":60},{"metric":"concurrent","limit":6,"leaseTtlSeconds":120}]}'::jsonb,
    900,
    'enabled'
  ),
  (
    'gemini', 'gemini-simulation', 'Gemini Simulation',
    'https://generativelanguage.googleapis.com', 'api_key',
    '{"mode":"simulation"}'::jsonb,
    '{"testMode":true,"seed":"phase1"}'::jsonb,
    'inherit_discount', 1,
    '{"enabled":true,"maxAttempts":2,"retryOn":["rate_limit","timeout","server_error","network"]}'::jsonb,
    '{"rules":[{"metric":"rpm","limit":120,"windowSeconds":60},{"metric":"tpm_total","limit":240000,"windowSeconds":60},{"metric":"concurrent","limit":6,"leaseTtlSeconds":120}]}'::jsonb,
    910,
    'enabled'
  )
ON CONFLICT (platform_key) DO UPDATE
SET name = EXCLUDED.name,
    base_url = EXCLUDED.base_url,
    auth_type = EXCLUDED.auth_type,
    credentials = EXCLUDED.credentials,
    config = EXCLUDED.config,
    default_pricing_mode = EXCLUDED.default_pricing_mode,
    default_discount_factor = EXCLUDED.default_discount_factor,
    retry_policy = EXCLUDED.retry_policy,
    rate_limit_policy = EXCLUDED.rate_limit_policy,
    priority = EXCLUDED.priority,
    status = EXCLUDED.status,
    updated_at = now();

INSERT INTO platform_models (
  platform_id, base_model_id, model_name, model_alias, model_type, display_name,
  capabilities, pricing_mode, billing_config, retry_policy, rate_limit_policy, enabled
)
SELECT p.id, b.id, b.provider_model_name, b.canonical_model_key, b.model_type, b.display_name,
       b.capabilities, 'inherit_discount', b.base_billing_config,
       '{"enabled":true,"maxAttempts":2}'::jsonb,
       b.default_rate_limit_policy,
       true
FROM integration_platforms p
JOIN base_model_catalog b ON b.provider_key = p.provider
WHERE p.platform_key IN ('openai-simulation', 'gemini-simulation')
ON CONFLICT (platform_id, model_name, model_type) DO UPDATE
SET base_model_id = EXCLUDED.base_model_id,
    model_alias = EXCLUDED.model_alias,
    display_name = EXCLUDED.display_name,
    capabilities = EXCLUDED.capabilities,
    pricing_mode = EXCLUDED.pricing_mode,
    billing_config = EXCLUDED.billing_config,
    retry_policy = EXCLUDED.retry_policy,
    rate_limit_policy = EXCLUDED.rate_limit_policy,
    enabled = EXCLUDED.enabled,
    updated_at = now();

INSERT INTO model_pricing_rules (scope_type, scope_id, resource_type, unit, base_price, currency, base_weight, dynamic_weight)
SELECT 'base_model', b.id, item.resource_type, item.unit, item.base_price, 'resource', item.base_weight, item.dynamic_weight
FROM base_model_catalog b
JOIN (
  VALUES
    ('openai:gpt-4o-mini', 'text_input', '1k_tokens', 0.15::numeric, '{}'::jsonb, '{}'::jsonb),
    ('openai:gpt-4o-mini', 'text_output', '1k_tokens', 0.60::numeric, '{}'::jsonb, '{}'::jsonb),
    ('openai:gpt-image-1', 'image', 'image', 5.00::numeric, '{"mode":"generation"}'::jsonb, '{"quality":true,"size":true}'::jsonb),
    ('openai:gpt-image-1', 'image_edit', 'image', 6.00::numeric, '{"mode":"edit"}'::jsonb, '{"quality":true,"size":true}'::jsonb),
    ('gemini:gemini-2.5-flash', 'text_input', '1k_tokens', 0.10::numeric, '{}'::jsonb, '{}'::jsonb),
    ('gemini:gemini-2.5-flash', 'text_output', '1k_tokens', 0.40::numeric, '{}'::jsonb, '{}'::jsonb),
    ('gemini:gemini-2.5-flash-image', 'image', 'image', 4.00::numeric, '{"mode":"generation"}'::jsonb, '{"quality":true,"size":true}'::jsonb),
    ('gemini:gemini-2.5-flash-image', 'image_edit', 'image', 5.00::numeric, '{"mode":"edit"}'::jsonb, '{"quality":true,"size":true}'::jsonb)
) AS item(canonical_model_key, resource_type, unit, base_price, base_weight, dynamic_weight)
  ON item.canonical_model_key = b.canonical_model_key
WHERE NOT EXISTS (
  SELECT 1
  FROM model_pricing_rules existing
  WHERE existing.scope_type = 'base_model'
    AND existing.scope_id = b.id
    AND existing.resource_type = item.resource_type
    AND existing.unit = item.unit
);
