export interface Usuario {
  id: string;
  username: string;
  email: string;
  nombre: string;
  rol: 'admin' | 'estudiante';
  activo: boolean;
}

export interface Progreso {
  modulo_numero: number;
  ejercicio_id: string;
  completado: boolean;
  puntuacion: number;
}

export interface ProgresoEjercicio {
  ejercicioId: string;
  completado: boolean;
  puntuacion: number;
  fecha: string;
}

export interface ProgresoModulo {
  moduloNumero: number;
  ejercicios: ProgresoEjercicio[];
  porcentaje: number;
}

export interface BadgeCondicion {
  tipo: 'ejercicios_completados' | 'puntuacion_total' | 'modulo_completado';
  valor: number;
  moduloId?: string;
}

export interface Badge {
  id: string;
  titulo: string;
  descripcion: string;
  icono: string;
  desbloqueado: boolean;
  requisito: string;
  condicion?: BadgeCondicion;
  fechaDesbloqueo?: string;
}

export type NivelUsuario = 'Novato' | 'Aprendiz' | 'Experto' | 'Maestro';

export interface ConfiguracionEjercicio {
  dificultad: 'facil' | 'medio' | 'dificil';
  tiempoMaximo?: number;
  intentosMaximos?: number;
  mostrarPistas: boolean;
}

export interface Ejercicio {
  id: string;
  titulo: string;
  descripcion: string;
  tipo: 'quiz' | 'simulador' | 'ejercicio';
  configuracion?: ConfiguracionEjercicio;
  moduloNumero: number;
}

export interface Modulo {
  numero: number;
  titulo: string;
  descripcion: string;
  ejercicios: Ejercicio[];
}

export interface ModuloProgreso {
  numero: number;
  titulo: string;
  porcentaje: number;
  ejerciciosCompletados: number;
  totalEjercicios: number;
}

export interface ResumenProgreso {
  totalPuntuacion: number;
  ejerciciosCompletados: number;
  totalEjercicios: number;
  porcentajeGlobal: number;
  badges: Badge[];
  nivel: NivelUsuario;
  moduloProgreso: ProgresoModulo[];
}

export interface LoginRequest {
  email?: string;
  username?: string;
  password: string;
}

export interface LoginResponse {
  access_token: string;
  refresh_token: string;
  user: Usuario;
}

export interface ApiError {
  message: string;
  code?: string;
}
