import { z } from '@hono/zod-openapi';

// 视频状态枚举
export const VodVideoStatus = {
  PENDING: 0,
  PROCESSING: 1,
  COMPLETED: 2,
  FAILED: 3
} as const;

// 实体完整Schema（用于响应）
export const VodVideoSchema = z.object({
  id: z.coerce.number<number>().int('必须是整数').positive('必须是正整数').openapi({
    description: '视频ID',
    example: 1
  }),
  title: z.string().min(1, '标题不能为空').max(255, '标题最多255个字符').openapi({
    description: '视频标题',
    example: '示例视频标题'
  }),
  description: z.string().max(2000, '描述最多2000个字符').nullable().openapi({
    description: '视频描述',
    example: '这是一个示例视频描述'
  }),
  fileId: z.string().min(1, '文件ID不能为空').max(255, '文件ID最多255个字符').openapi({
    description: 'VOD文件ID',
    example: 'file_1234567890'
  }),
  videoUrl: z.string().url('视频地址格式不正确').max(500, '视频地址最多500个字符').openapi({
    description: '视频播放地址',
    example: 'https://vod.example.com/video.mp4'
  }),
  coverUrl: z.string().url('封面地址格式不正确').max(500, '封面地址最多500个字符').nullable().openapi({
    description: '封面图片地址',
    example: 'https://vod.example.com/cover.jpg'
  }),
  duration: z.coerce.number<number>().int('必须是整数').min(0, '时长不能为负数').openapi({
    description: '视频时长（秒）',
    example: 3600
  }),
  size: z.coerce.number<number>().int('必须是整数').min(0, '大小不能为负数').openapi({
    description: '视频大小（字节）',
    example: 1024000
  }),
  status: z.coerce.number<number>().int('必须是整数').min(0, '最小值为0').max(3, '最大值为3').openapi({
    description: '视频状态（0: 待处理, 1: 处理中, 2: 已完成, 3: 失败）',
    example: 2
  }),
  createdBy: z.coerce.number<number>().int('必须是整数').positive('必须是正整数').nullable().openapi({
    description: '创建人ID',
    example: 1
  }),
  updatedBy: z.coerce.number<number>().int('必须是整数').positive('必须是正整数').nullable().openapi({
    description: '更新人ID',
    example: 1
  }),
  createdAt: z.coerce.date<Date>('创建时间格式不正确').openapi({
    description: '创建时间',
    example: '2024-01-01T12:00:00Z'
  }),
  updatedAt: z.coerce.date<Date>('更新时间格式不正确').openapi({
    description: '更新时间',
    example: '2024-01-01T12:00:00Z'
  })
});

// 创建DTO Schema（用于创建请求验证）
export const CreateVodVideoDto = z.object({
  title: z.string().min(1, '标题不能为空').max(255, '标题最多255个字符').openapi({
    description: '视频标题',
    example: '示例视频标题'
  }),
  description: z.string().max(2000, '描述最多2000个字符').nullable().optional().openapi({
    description: '视频描述（选填）',
    example: '这是一个示例视频描述'
  }),
  fileId: z.string().min(1, '文件ID不能为空').max(255, '文件ID最多255个字符').openapi({
    description: 'VOD文件ID',
    example: 'file_1234567890'
  }),
  videoUrl: z.string().url('视频地址格式不正确').max(500, '视频地址最多500个字符').openapi({
    description: '视频播放地址',
    example: 'https://vod.example.com/video.mp4'
  }),
  coverUrl: z.string().url('封面地址格式不正确').max(500, '封面地址最多500个字符').nullable().optional().openapi({
    description: '封面图片地址（选填）',
    example: 'https://vod.example.com/cover.jpg'
  }),
  duration: z.coerce.number<number>().int('必须是整数').min(0, '时长不能为负数').default(0).openapi({
    description: '视频时长（秒）',
    example: 3600
  }),
  size: z.coerce.number<number>().int('必须是整数').min(0, '大小不能为负数').default(0).openapi({
    description: '视频大小（字节）',
    example: 1024000
  }),
  status: z.coerce.number<number>().int('必须是整数').min(0, '最小值为0').max(3, '最大值为3').default(0).openapi({
    description: '视频状态（0: 待处理, 1: 处理中, 2: 已完成, 3: 失败）',
    example: 0
  })
});

// 更新DTO Schema（用于更新请求验证）
export const UpdateVodVideoDto = z.object({
  title: z.string().min(1, '标题不能为空').max(255, '标题最多255个字符').optional().openapi({
    description: '视频标题',
    example: '更新后的视频标题'
  }),
  description: z.string().max(2000, '描述最多2000个字符').nullable().optional().openapi({
    description: '视频描述',
    example: '更新后的视频描述'
  }),
  fileId: z.string().min(1, '文件ID不能为空').max(255, '文件ID最多255个字符').optional().openapi({
    description: 'VOD文件ID',
    example: 'file_updated_1234567890'
  }),
  videoUrl: z.string().url('视频地址格式不正确').max(500, '视频地址最多500个字符').optional().openapi({
    description: '视频播放地址',
    example: 'https://vod.example.com/updated_video.mp4'
  }),
  coverUrl: z.string().url('封面地址格式不正确').max(500, '封面地址最多500个字符').nullable().optional().openapi({
    description: '封面图片地址',
    example: 'https://vod.example.com/updated_cover.jpg'
  }),
  duration: z.coerce.number<number>().int('必须是整数').min(0, '时长不能为负数').optional().openapi({
    description: '视频时长（秒）',
    example: 1800
  }),
  size: z.coerce.number<number>().int('必须是整数').min(0, '大小不能为负数').optional().openapi({
    description: '视频大小（字节）',
    example: 512000
  }),
  status: z.coerce.number<number>().int('必须是整数').min(0, '最小值为0').max(3, '最大值为3').optional().openapi({
    description: '视频状态（0: 待处理, 1: 处理中, 2: 已完成, 3: 失败）',
    example: 2
  })
});