import { z } from 'zod';

const EvidenceRefSchema = z.object({
  sourceType: z.enum(['study_metric', 'review_metric', 'quiz_metric', 'active_recall', 'feynman', 'knowledge_progress']),
  metricKey: z.string().min(1).max(100),
  entityId: z.string().max(255).optional(),
  windowStart: z.string().optional(),
  windowEnd: z.string().optional(),
});

const StrengthSchema = z.object({
  title: z.string().min(1).max(255),
  description: z.string().min(1).max(1000),
  evidenceRefs: z.array(EvidenceRefSchema).min(1).max(5),
});

const WeaknessSchema = z.object({
  title: z.string().min(1).max(255),
  description: z.string().min(1).max(1000),
  knowledgePointId: z.string().max(255).optional().nullable(),
  evidenceRefs: z.array(EvidenceRefSchema).min(1).max(5),
});

const TrendSchema = z.object({
  metricKey: z.string().min(1).max(100),
  direction: z.enum(['improving', 'declining', 'stable']),
  description: z.string().min(1).max(500),
  evidenceRefs: z.array(EvidenceRefSchema).min(1).max(3),
});

const RiskSchema = z.object({
  title: z.string().min(1).max(255),
  severity: z.enum(['low', 'medium', 'high']),
  description: z.string().min(1).max(1000),
  evidenceRefs: z.array(EvidenceRefSchema).min(1).max(3),
});

const RecommendationSchema = z.object({
  actionType: z.string().min(1).max(100),
  title: z.string().min(1).max(255),
  reason: z.string().min(1).max(1000),
  priority: z.number().int().min(0).max(10),
  estimatedMinutes: z.number().int().min(1).max(480).optional(),
  targetType: z.string().max(32).optional().nullable(),
  targetId: z.string().max(255).optional().nullable(),
  evidenceRefs: z.array(EvidenceRefSchema).min(1).max(3),
});

export const LearningAnalysisResultSchema = z.object({
  summary: z.string().min(1).max(500),
  strengths: z.array(StrengthSchema).min(0).max(3),
  weaknesses: z.array(WeaknessSchema).min(0).max(5),
  trends: z.array(TrendSchema).min(0).max(3),
  risks: z.array(RiskSchema).min(0).max(3),
  recommendations: z.array(RecommendationSchema).min(1).max(5),
  confidence: z.number().min(0).max(1),
  insufficientData: z.boolean(),
  dataQualityNotes: z.string().max(500).optional(),
});

export type LearningAnalysisResult = z.infer<typeof LearningAnalysisResultSchema>;
