/**
 * 视频生成模块 - 类型定义
 * 定义视频项目、素材、配置的数据结构
 */

// ============ 核心类型 ============

/** 视频项目状态 */
export type VideoProjectStatus = 'draft' | 'processing' | 'completed' | 'failed';

/** 素材类型 */
export type MaterialType = 'image' | 'audio' | 'template';

/** 转场效果 */
export type TransitionEffect = 'none' | 'fade' | 'slide';

/** 字幕位置 */
export type SubtitlePosition = 'top' | 'bottom' | 'center';

/** 图片配置项 */
export interface ImageConfig {
  url: string;                // 图片URL
  duration: number;           // 显示时长（秒）
  transition: TransitionEffect; // 转场效果
  kenburns?: KenBurnsConfig;  // Ken Burns 效果配置
}

/** Ken Burns 效果配置 */
export interface KenBurnsConfig {
  enabled: boolean;
  minZoom: number;             // 最小缩放 (如 1.0)
  maxZoom: number;             // 最大缩放 (如 1.3)
  panDirection?: 'in' | 'out' | 'left' | 'right' | 'random';
  zoomCurve?: 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out';
}

/** 音频配置 */
export interface AudioConfig {
  url: string;                // 音频URL（必填）
  startTime?: number;         // 音频开始时间（截取）
  endTime?: number;           // 音频结束时间（截取）
  volume: number;             // 音量 0-1
}

/** 背景音乐配置 */
export interface BgmConfig {
  url: string;                // BGM URL
  volume: number;             // 音量 0-1
  loop: boolean;              // 是否循环
  fadeIn?: number;            // 淡入时长（秒）
  fadeOut?: number;           // 淡出时长（秒）
}

/** 字幕配置 */
export interface SubtitleConfig {
  text: string;               // 字幕文本
  fontSize?: number;          // 字体大小
  fontColor?: string;         // 字体颜色
  backgroundColor?: string;   // 背景颜色
  position: SubtitlePosition; // 位置
  margin?: number;            // 边距
  style?: 'normal' | 'bold'; // 样式
}

/** 视频参数 */
export interface VideoParams {
  width: number;               // 视频宽度
  height: number;              // 视频高度
  fps: number;                 // 帧率
  bitrate: string;             // 码率 (如 "2M")
  format: string;              // 格式 (如 "mp4")
}

/** 完整视频配置 */
export interface VideoConfig {
  // 图片配置
  images: ImageConfig[];

  // 音频配置
  audio: AudioConfig;

  // 背景音乐配置（可选）
  bgm?: BgmConfig;

  // 字幕配置（可选）
  subtitle?: SubtitleConfig;

  // 视频参数
  video: VideoParams;

  // Ken Burns 全局配置
  kenburns: KenBurnsConfig;
}

// ============ 数据库模型类型 ============

/** 视频项目（数据库） */
export interface VideoProjectDB {
  id: number;
  userId: number | null;
  title: string;
  description: string | null;
  coverUrl: string | null;
  configJson: string | null;
  outputUrl: string | null;
  duration: number | null;
  fileSize: number | null;
  bookId: number | null;
  chapterId: number | null;  // 直接关联章节
  status: VideoProjectStatus;
  progress: number;
  errorMsg: string | null;
  createdAt: Date;
  updatedAt: Date;
}

/** 视频素材（数据库） */
export interface VideoMaterialDB {
  id: number;
  userId: number | null;
  type: MaterialType;
  name: string;
  url: string;
  thumbnail: string | null;
  tags: string | null;
  category: string | null;
  duration: number | null;
  size: number | null;
  width: number | null;
  height: number | null;
  createdAt: Date;
  updatedAt: Date;
}

// ============ 请求/响应类型 ============

/** 创建视频项目请求 */
export interface CreateVideoProjectRequest {
  title: string;
  description?: string;
  coverUrl?: string;
  config?: VideoConfig;
  bookId?: number;
  chapterId?: number;  // 直接关联章节
}

/** 更新视频项目请求 */
export interface UpdateVideoProjectRequest {
  title?: string;
  description?: string;
  coverUrl?: string;
  config?: VideoConfig;
}

/** 生成视频请求 */
export interface GenerateVideoRequest {
  projectId: number;
}

/** 获取视频项目列表查询 */
export interface GetVideoProjectsQuery {
  userId?: number;
  status?: VideoProjectStatus;
  page?: number;
  pageSize?: number;
}

/** 视频项目响应 */
export interface VideoProjectResponse extends VideoProjectDB {
  config?: VideoConfig;
}

/** 素材列表查询 */
export interface GetMaterialsQuery {
  userId?: number;
  type?: MaterialType;
  category?: string;
  page?: number;
  pageSize?: number;
}

/** 素材响应 */
export interface VideoMaterialResponse {
  id: number;
  userId: number | null;
  type: MaterialType;
  name: string;
  url: string;
  thumbnail: string | null;
  tags?: string[];
  category: string | null;
  duration: number | null;
  size: number | null;
  width: number | null;
  height: number | null;
  createdAt: Date;
  updatedAt: Date;
}

/** 生成进度响应 */
export interface GenerateProgressResponse {
  projectId: number;
  status: VideoProjectStatus;
  progress: number;
  outputUrl?: string;
  duration?: number;
  fileSize?: number;
  errorMsg?: string;
}

// ============ 预设配置 ============

/** 预设视频配置 */
export const PRESET_VIDEO_CONFIGS: Record<string, VideoConfig> = {
  // 竖屏 9:16 (短视频)
  portrait: {
    images: [],
    audio: {
      url: '',
      volume: 1,
    },
    video: {
      width: 720,
      height: 1280,
      fps: 30,
      bitrate: '2M',
      format: 'mp4',
    },
    kenburns: {
      enabled: true,
      minZoom: 1.0,
      maxZoom: 1.2,
    },
  },
  // 横屏 16:9 (横版视频)
  landscape: {
    images: [],
    audio: {
      url: '',
      volume: 1,
    },
    video: {
      width: 1920,
      height: 1080,
      fps: 30,
      bitrate: '4M',
      format: 'mp4',
    },
    kenburns: {
      enabled: true,
      minZoom: 1.0,
      maxZoom: 1.15,
    },
  },
  // 方形 1:1 (社交媒体)
  square: {
    images: [],
    audio: {
      url: '',
      volume: 1,
    },
    video: {
      width: 1080,
      height: 1080,
      fps: 30,
      bitrate: '2M',
      format: 'mp4',
    },
    kenburns: {
      enabled: true,
      minZoom: 1.0,
      maxZoom: 1.25,
    },
  },
};

// ============ 工具函数 ============

/** 解析配置JSON */
export function parseConfig(json: string | null): VideoConfig | null {
  if (!json) return null;
  try {
    return JSON.parse(json);
  } catch {
    return null;
  }
}

/** 序列化配置为JSON */
export function serializeConfig(config: VideoConfig): string {
  return JSON.stringify(config);
}

/** 解析标签JSON */
export function parseTags(tags: string | null): string[] {
  if (!tags) return [];
  try {
    return JSON.parse(tags);
  } catch {
    return [];
  }
}

/** 序列化标签为JSON */
export function serializeTags(tags: string[]): string {
  return JSON.stringify(tags);
}
