/**
 * set-my-address.use-case.ts
 * Asigna una colonia al usuario logueado. Valida que la colonia exista
 * en el catálogo y resuelve el routeId asociado.
 *
 * Cumple "validación de domicilio dentro de zona permitida" del reto:
 * si la colonia no está en el catálogo, no se acepta.
 */

import { SetAddressDtoValidator } from "../../dtos/index.js";
import { CustomError } from "../../errors/custom.error.js";
import { colonias } from "../../../data/mocks/colonias.mock.js";
import { upsertUser, users } from "../../../data/mocks/users.mock.js";

export interface SetMyAddressResponse {
  colonia: string;
  routeId: string;
  horarioEstimado: string;
}

export class SetMyAddressUseCase {
  execute(
    userId: number,
    userName: string,
    userEmail: string,
    data: unknown,
  ): SetMyAddressResponse {
    const dto = SetAddressDtoValidator.validate(data);

    const match = colonias.find(
      (c) => c.colonia.toLowerCase() === dto.colonia.toLowerCase(),
    );
    if (!match) {
      throw CustomError.badRequest(
        `La colonia "${dto.colonia}" no está dentro de la zona de cobertura`,
      );
    }

    const existing = users.find((u) => u.id === userId);
    upsertUser({
      id: userId,
      name: existing?.name ?? userName,
      email: existing?.email ?? userEmail,
      colonia: match.colonia,
      routeId: match.routeId,
    });

    return {
      colonia: match.colonia,
      routeId: match.routeId,
      horarioEstimado: match.horarioEstimado,
    };
  }
}
