import { z } from 'zod';

export const AgentStatusSchema = z.enum(['draft', 'active', 'deprecated', 'archived']);
export const AgentVisibilitySchema = z.enum(['private', 'internal', 'public']);

export const AgentDefinitionSchema = z.object({
  id: z.string().min(1),
  productId: z.string().min(1),
  key: z.string().min(1),
  name: z.string().min(1),
  description: z.string().optional(),
  ownerTeam: z.string().optional(),
  status: AgentStatusSchema,
  visibility: AgentVisibilitySchema,
  currentVersion: z.number().int().positive().default(1),
  tags: z.array(z.string()).default([]),
  metadata: z.record(z.unknown()).optional(),
  createdAt: z.string(),
  updatedAt: z.string(),
});

export type AgentDefinitionDoc = z.infer<typeof AgentDefinitionSchema> & {
  _ts?: number;
  _etag?: string;
};

export const AgentVersionSchema = z.object({
  id: z.string().min(1),
  agentId: z.string().min(1),
  productId: z.string().min(1),
  version: z.number().int().positive(),
  status: z.enum(['draft', 'published', 'deprecated']).default('draft'),
  prompt: z.string().min(1),
  systemInstructions: z.string().optional(),
  modelPolicy: z
    .object({
      provider: z.string().optional(),
      model: z.string().optional(),
      temperature: z.number().optional(),
      maxTokens: z.number().optional(),
    })
    .optional(),
  toolBindings: z.array(z.string()).default([]),
  config: z.record(z.unknown()).optional(),
  changeSummary: z.string().optional(),
  createdBy: z.string().min(1),
  createdAt: z.string(),
});

export type AgentVersionDoc = z.infer<typeof AgentVersionSchema> & {
  _ts?: number;
  _etag?: string;
};

export const CreateAgentSchema = z.object({
  key: z.string().min(1),
  name: z.string().min(1),
  description: z.string().optional(),
  ownerTeam: z.string().optional(),
  visibility: AgentVisibilitySchema.default('internal'),
  tags: z.array(z.string()).default([]),
  metadata: z.record(z.unknown()).optional(),
  initialVersion: z
    .object({
      prompt: z.string().min(1),
      systemInstructions: z.string().optional(),
      modelPolicy: z
        .object({
          provider: z.string().optional(),
          model: z.string().optional(),
          temperature: z.number().optional(),
          maxTokens: z.number().optional(),
        })
        .optional(),
      toolBindings: z.array(z.string()).default([]),
      config: z.record(z.unknown()).optional(),
      changeSummary: z.string().optional(),
    })
    .optional(),
});

export const UpdateAgentSchema = z.object({
  name: z.string().min(1).optional(),
  description: z.string().optional(),
  ownerTeam: z.string().optional(),
  status: AgentStatusSchema.optional(),
  visibility: AgentVisibilitySchema.optional(),
  tags: z.array(z.string()).optional(),
  metadata: z.record(z.unknown()).optional(),
  currentVersion: z.number().int().positive().optional(),
});

export const CreateAgentVersionSchema = z.object({
  prompt: z.string().min(1),
  systemInstructions: z.string().optional(),
  modelPolicy: z
    .object({
      provider: z.string().optional(),
      model: z.string().optional(),
      temperature: z.number().optional(),
      maxTokens: z.number().optional(),
    })
    .optional(),
  toolBindings: z.array(z.string()).default([]),
  config: z.record(z.unknown()).optional(),
  changeSummary: z.string().optional(),
  status: z.enum(['draft', 'published', 'deprecated']).default('draft'),
});

export const ListAgentsQuerySchema = z.object({
  status: AgentStatusSchema.optional(),
  visibility: AgentVisibilitySchema.optional(),
  limit: z.coerce.number().min(1).max(100).default(20),
});

export type ListAgentsQuery = z.infer<typeof ListAgentsQuerySchema>;
