/**
 * route-simulator.ts
 * Simulador automático: cada N segundos avanza un positionId en cada ruta
 * y dispara el ProcessGpsUpdateUseCase. Reemplaza al "pull to refresh" del
 * frontend para que el flujo sea más realista en la demo.
 *
 * Solo simula RUTA-01 por defecto para enfocar la demo, pero se puede
 * activar para todas las rutas si se desea.
 */

import { routes } from "../mocks/routes.mock.js";
import type { ProcessGpsUpdateUseCase } from "../../domain/use-cases/notifications/process-gps-update.use-case.js";

const TICK_INTERVAL_MS = 30_000; // 30 segundos
const SIMULATED_ROUTE_IDS = ["RUTA-01"];

export class RouteSimulator {
  private timer: NodeJS.Timeout | null = null;
  private positionIndexByRoute = new Map<string, number>();

  constructor(private readonly processGpsUpdate: ProcessGpsUpdateUseCase) {}

  start() {
    if (this.timer) return;

    // Inicializa cada ruta en positionId=1 inmediatamente
    void this.tick();

    this.timer = setInterval(() => {
      void this.tick();
    }, TICK_INTERVAL_MS);

    console.log(`RouteSimulator started — tick every ${TICK_INTERVAL_MS / 1000}s`);
  }

  stop() {
    if (this.timer) {
      clearInterval(this.timer);
      this.timer = null;
    }
  }

  private async tick() {
    for (const routeId of SIMULATED_ROUTE_IDS) {
      const route = routes.find((r) => r.routeId === routeId);
      if (!route) continue;

      const index = this.positionIndexByRoute.get(routeId) ?? 0;
      const position = route.positions[index];
      if (!position) continue;

      try {
        await this.processGpsUpdate.execute({
          truckId: String(route.truckId),
          routeId: route.routeId,
          lat: position.lat,
          lng: position.lng,
          speed: position.speed,
          status: route.status,
          positionId: position.positionId,
          timestamp: position.timestamp,
        });
      } catch (err) {
        console.error(`Simulator tick failed for ${routeId}:`, err);
      }

      // Avanza al siguiente; vuelve a empezar al terminar el array
      const nextIndex = (index + 1) % route.positions.length;
      this.positionIndexByRoute.set(routeId, nextIndex);
    }
  }
}
