import { z } from 'zod';
import { HealthCheckSchema } from './template.schema.js';

const SecretRefSchema = z.object({
  name: z.string().min(1),
  key: z.string().min(1),
});

export const ServerEnvEntrySchema = z.object({
  name: z.string().min(1).max(100),
  value: z.string().optional(),
  valueFrom: z.object({
    secretRef: SecretRefSchema,
  }).optional(),
}).refine(
  (e) => (e.value !== undefined) !== (e.valueFrom !== undefined),
  { message: 'Exactly one of value or valueFrom must be set' },
);

export type ServerEnvEntry = z.infer<typeof ServerEnvEntrySchema>;

export const CreateMcpServerSchema = z.object({
  name: z.string().min(1).max(100).regex(/^[a-z0-9-]+$/, 'Name must be lowercase alphanumeric with hyphens'),
  description: z.string().max(1000).default(''),
  packageName: z.string().max(200).optional(),
  runtime: z.string().max(50).optional(),
  dockerImage: z.string().max(200).optional(),
  transport: z.enum(['STDIO', 'SSE', 'STREAMABLE_HTTP']).default('STDIO'),
  repositoryUrl: z.string().url().optional(),
  externalUrl: z.string().url().optional(),
  command: z.array(z.string()).optional(),
  containerPort: z.number().int().min(1).max(65535).optional(),
  replicas: z.number().int().min(0).max(10).default(1),
  env: z.array(ServerEnvEntrySchema).default([]),
  healthCheck: HealthCheckSchema.optional(),
});

export const UpdateMcpServerSchema = z.object({
  description: z.string().max(1000).optional(),
  packageName: z.string().max(200).nullable().optional(),
  runtime: z.string().max(50).nullable().optional(),
  dockerImage: z.string().max(200).nullable().optional(),
  transport: z.enum(['STDIO', 'SSE', 'STREAMABLE_HTTP']).optional(),
  repositoryUrl: z.string().url().nullable().optional(),
  externalUrl: z.string().url().nullable().optional(),
  command: z.array(z.string()).nullable().optional(),
  containerPort: z.number().int().min(1).max(65535).nullable().optional(),
  replicas: z.number().int().min(0).max(10).optional(),
  env: z.array(ServerEnvEntrySchema).optional(),
  healthCheck: HealthCheckSchema.nullable().optional(),
});

export type CreateMcpServerInput = z.infer<typeof CreateMcpServerSchema>;
export type UpdateMcpServerInput = z.infer<typeof UpdateMcpServerSchema>;
