// Tipos para la gestión de proyectos de series animadas

export interface Project {
  id: string;
  name: string;
  slug: string;
  createdAt: string;
  updatedAt: string;
  status: ProjectStatus;
  currentStep: ProjectStep;
}

export type ProjectStatus = 'draft' | 'in_progress' | 'completed';

export type ProjectStep = 
  | 'idea_motriz'
  | 'personajes'
  | 'capitulos';

// Idea Motriz
export interface IdeaMotriz {
  concepto: string;
  ideaMotrizCentral: string;
  formato: {
    capitulos: number;
    duracionMinutos: number;
  };
  narrativa: string;
  expansion: string;
  valores: string[];
  personajesSecundarios: string;
  protagonistas: ProtagonistaResumen[];
  antagonista: {
    nombre: string;
    descripcion: string;
    representacionVisual: string;
    mision: string;
  };
  estructuraGuion: EstructuraActo[];
  estiloVisual?: string;
}

export interface ProtagonistaResumen {
  nombre: string;
  rol: string;
  utileria: string;
  mecanica: string;
}

export interface EstructuraActo {
  numero: number;
  nombre: string;
  duracionMin: number;
  duracionMax: number;
  descripcion: string;
}

// Personajes
export interface Personaje {
  id: string;
  nombre: string;
  tipo: 'protagonista' | 'aliado' | 'antagonista';
  especie: string; // Ej: "gato", "búho", "zorro"
  aparienciaFisica: string; // Descripción detallada: color, tamaño, rasgos distintivos
  rolPrincipal: string;
  personalidad: string;
  habilidadInnata: string;
  utileriaVisual: string;
  mecanicaNarrativa: string;
  comunicacion: string;
  avanceHabilidad: string;
  imagePrompt?: string;
  imageUrl?: string;
}

export interface ReglasCooperacion {
  descripcion: string;
  condiciones: string[];
}

// Capítulos
export interface Capitulo {
  id: string;
  numero: number;
  titulo: string;
  virtudGanada: string;
  status: CapituloStatus;
  currentStep: CapituloStep;
}

export type CapituloStatus = 'draft' | 'guion' | 'escaleta' | 'prompts' | 'assets' | 'completed';

export type CapituloStep = 
  | 'guion_conductor'
  | 'escaleta'
  | 'prompts'
  | 'imagenes'
  | 'videos';

// Guión Conductor
export interface GuionConductor {
  titulo: string;
  virtudGanada: string;
  duracionTotal: string;
  nudoDelMundo: string;
  aliado: {
    nombre: string;
    descripcion: string;
  };
  gemaGanada: string;
  actos?: ActoGuion[];
  contenidoMarkdown?: string;
}

export interface ActoGuion {
  numero: number;
  nombre: string;
  tiempoInicio: string;
  tiempoFin: string;
  segmentos: SegmentoGuion[];
}

export interface SegmentoGuion {
  id: string;
  nombre: string;
  tiempo: string;
  accionVisualClave: string;
  disenoFondo: string;
  disenoSonido: string;
}

// Pre-Escaleta (esqueleto de planos computado desde el guión)
export interface PreEscaletaSegmento {
  segmentoId: string;       // e.g. "I.1"
  nombre: string;           // e.g. "La Alerta de Coco"
  actoNumero: number;
  segmentoIndex: number;    // index within the acto
  tiempo: string;           // e.g. "0:00-1:00"
  duracionSegundos: number;
  totalPlanos: number;
  planos: PreEscaletaPlano[];
}

export interface PreEscaletaPlano {
  id: string;               // e.g. "plano-001"
  numeroPlano: string;      // e.g. "1.1.1"
  nombre: string;           // placeholder name
  segmentoId: string;
  tiempoSegundos: number;   // always 5
}

export interface PreEscaleta {
  capitulo: string;
  duracionTotalSegundos: number;
  totalPlanos: number;
  segmentos: PreEscaletaSegmento[];
}

// Escaleta (Desglose de planos)
export interface Escaleta {
  capitulo: string;
  virtudGanada: string;
  planos?: PlanoEscaleta[];
  duracionTotalSegundos?: number;
  contenidoMarkdown?: string;
}

export interface PersonajeEnPlano {
  personajeId: string;
  nombre: string;
  emocion: EmotionVariant;
}

export interface PlanoEscaleta {
  id: string;
  numeroPlano: string;
  segmentoGuion: string;
  tiempoSegundos: number;
  accionDescripcion: string;
  indicacionesSonido: string;
  promptImagen?: string;
  personajesEnPlano?: string[];
  personajesDetalle?: PersonajeEnPlano[];
  imagenUrl?: string;
  videoUrl?: string;
}

// Fondo de referencia (imagen de escenario para consistencia visual)
export interface FondoReferencia {
  id: string;
  segmentoId: string;
  nombre: string;
  descripcion: string;
  promptGeneracion: string;
  imagenUrl?: string;
}

// Prompt compuesto de sub-campos editables
export interface PromptComposition {
  personajes: string;
  accion: string;
  luz: string;
  camara: string;
  optica: string;
  tipoPlano: string;
  estilo: string;
  custom: string;
}

// Plano con prompt e imágenes de referencia (output de prompts generation)
export interface ReferenceAsset {
  personajeId: string;
  nombre: string;
  emocion: string;
  tposeFrontUrl?: string;
  tposeSideUrl?: string;
  tposeBackUrl?: string;
  emotionUrl?: string;
}

export interface PlanoConPrompt extends PlanoEscaleta {
  promptComposition?: PromptComposition;
  promptImagen: string;
  referenceAssets: ReferenceAsset[];
  fondoId?: string;
  imagenUrl?: string;
}

// Character Assets (para Nano Banana Pro)
export type CharacterAssetType = 'tpose' | 'emotion' | 'pose';
export type TposeVariant = 'front' | 'side' | 'back';
export type EmotionVariant = 'alegria' | 'tristeza' | 'sorpresa' | 'miedo' | 'enfado' | 'neutral';

export interface CharacterAsset {
  id: string;
  type: CharacterAssetType;
  variant: string; // TposeVariant | EmotionVariant | custom pose name
  label: string;
  prompt: string;
  imageUrl?: string;
  isBase?: boolean; // true for the canonical reference image
  status: 'pending' | 'prompt_ready' | 'generating' | 'generated';
}

export interface CharacterAssetsData {
  assets: CharacterAsset[];
  baseLocked: boolean; // true once user approves the base image
}

// Estado del Wizard
export interface WizardState {
  projectId: string;
  currentStep: number;
  steps: WizardStep[];
}

export interface WizardStep {
  id: string;
  name: string;
  status: 'pending' | 'current' | 'completed' | 'error';
  data?: any;
}

// Respuestas LLM
export interface LLMGenerationRequest {
  type: 'idea_motriz' | 'personajes' | 'guion' | 'escaleta' | 'prompts';
  context: Record<string, any>;
  userInput?: string;
}

export interface LLMGenerationResponse {
  success: boolean;
  data?: any;
  error?: string;
}
