import { addDays, format } from "date-fns";

import { getApiToken } from "../config";
import { Calendar, CalendarApi, CalendarApiResponse } from "../definitions/models";
import createAxiosInstance from "./axios";

const mapCalendar = (data: CalendarApiResponse): Calendar[] => {
  const items = data.data.map(({ id, title, description, date, route, status }: CalendarApi) => {
    return {
      date,
      description,
      documentId: id,
      route,
      title,
      status,
    } as unknown as Calendar;
  });

  return items;
};

const fetchEvents = async (path: string): Promise<{ calendar: Calendar[] }> => {
  const ACCESS_TOKEN = getApiToken();
  const axiosStrava = createAxiosInstance(ACCESS_TOKEN);

  const { data } = await axiosStrava.get<CalendarApiResponse>(path);

  const calendar = mapCalendar(data);

  return {
    calendar,
  };
};

export const getCalendar = async ({
  fields = "*",
  limit = 10,
  page = 0,
}: {
  fields: string;
  limit?: number;
  page?: number;
}): Promise<Calendar[]> => {
  try {
    const filters = `limit=${limit}${page ? `&page=${page}` : ""}`;

    const { calendar } = await fetchEvents(`/items/calendar?${filters}&fields=${fields}`);
    return calendar;
  } catch (error) {
    console.error("Error al obtener eventos del calendario:", error);
    throw new Error("Error al obtener eventos del calendario.");
  }
};

export const getUpcomingRoutes = async ({
  fields = "*",
  limit = 10,
  page = 0,
  sort = "date",
}: {
  fields: string;
  limit?: number;
  page?: number;
  sort?: string;
}): Promise<Calendar[]> => {
  try {
    // Obtener la fecha actual
    const today = new Date();
    const tomorrow = format(addDays(today, 1), "yyyy-MM-dd");

    // Crear los filtros para obtener solo las rutas futuras
    const pageQuery = page ? `&page=${page}` : "";

    const filters = [`limit=${limit}`, `filter[date][_gte]=${tomorrow}`, `sort=${sort}`, pageQuery].join("&");

    const { calendar } = await fetchEvents(`/items/calendar?${filters}&fields=${fields}`);
    return calendar;
  } catch (error) {
    console.error("Error al obtener eventos del calendario:", error);
    throw new Error("Error al obtener eventos del calendario.");
  }
};
