// Tipos del motor de resolución de flujo v3 (ADR-005).
// Módulo aislado de lib/types.ts (v2) a propósito — el componente de
// producción (survey-form.tsx) no importa nada de aquí todavía. 4D decide
// cómo conviven o se unifican los dos juegos de tipos.

export type ConditionalAction = 'show' | 'hide'

export type ConditionalRule =
  | { if_question: string; op: 'eq'; value: string; action: ConditionalAction }
  | { if_question: string[]; op: 'eq_any'; value: string; action: ConditionalAction }
  | { if_question: string; op: 'not_in'; value: string[]; action: ConditionalAction }
  | { if_question: string; op: 'contains'; value: string; action: ConditionalAction }
  | { if_question: string; op: 'eq_sole'; value: string; action: ConditionalAction }

export type QuestionType =
  | 'text_short' | 'text_long' | 'single_choice' | 'multiple_choice'
  | 'rating' | 'nps' | 'matrix' | 'ranking' | 'date' | 'slider' | 'yes_no' | 'section'

export interface QuestionOption {
  value: string
  label: string
}

export interface Question {
  id: string
  code: string
  type: QuestionType
  prompt: string
  position: number
  is_sensitive: boolean
  required: boolean
  hint: string | null
  options: QuestionOption[] | null
  max_select: number | null
  conditional_rules: ConditionalRule[] | null
  /** true solo en la pregunta que genera instancias (4.1 en v3). */
  instance_generator: boolean
  /** code de la pregunta generadora de la que depende esta fila (4.2/4.3 → '4.1'); null si no aplica. */
  instance_of: string | null
}

export interface FormSchema {
  /** Filas de `questions` ordenadas por position; incluye type='section'. */
  questions: Question[]
}

/** Valor de una respuesta: string (single_choice/text/yes_no) o array (multiple_choice). */
export type AnswerValue = string | string[] | number | null

/**
 * Respuestas keyed por `${code}:${instance_id}`. Las preguntas normales usan
 * instance_id='default'; las preguntas de instancia (instance_of) usan el id
 * de su instancia (ej. 'familiar_1'), igual que `answers.instance_id` (Etapa 4A).
 */
export type FormAnswers = Record<string, AnswerValue>

export type ScreenKind = 'section' | 'question' | 'end'

export interface Screen {
  /** ID estable. Nunca usar el índice de este array para identificar la pantalla actual. */
  id: string
  kind: ScreenKind
  /** null solo para kind='end'. */
  question: Question | null
  /** id de instancia si la pantalla es una pregunta de instancia; null si no aplica. */
  instanceId: string | null
}

export interface WizardState {
  answers: FormAnswers
  currentScreenId: string
}
