//Calendar implementation for the HTWK Leipzig timetable. Evaluation and display of the individual dates in iCal format.
//Copyright (C) 2024 HTWKalender support@htwkalender.de

//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU Affero General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.

//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU Affero General Public License for more details.

//You should have received a copy of the GNU Affero General Public License
//along with this program.  If not, see <https://www.gnu.org/licenses/>.

// function to fetch course data from the API

import { Module } from "../model/module.ts";

export async function fetchCourse(): Promise<string[]> {
  if (import.meta.env.SSR) {
    return [];
  }
  const courses: string[] = [];
  await fetch("/api/courses")
    .then((response) => {
      //check if response type is json
      const contentType = response.headers.get("content-type");
      if (contentType && contentType.indexOf("application/json") !== -1) {
        return response.json();
      } else {
        return [];
      }
    })
    .then((coursesResponse) => {
      coursesResponse.forEach((course: string) => courses.push(course));
    });
  return courses;
}

export async function fetchCourseBySemester(
  semester: string,
): Promise<string[]> {
  if (import.meta.env.SSR) {
    return [];
  }
  const courses: string[] = [];
  await fetch("/api/courses/events?semester=" + semester)
    .then((response) => {
      //check if response type is json
      const contentType = response.headers.get("content-type");
      if (contentType && contentType.indexOf("application/json") !== -1) {
        return response.json();
      } else {
        return [];
      }
    })
    .then((coursesResponse) => {
      coursesResponse?.forEach((course: string) => courses.push(course));
    });
  return courses;
}

export async function fetchModulesByCourseAndSemester(
  course: string,
  semester: string,
): Promise<Module[]> {
  if (import.meta.env.SSR) {
    return [];
  }
  const modules: Module[] = [];
  await fetch("/api/course/modules?course=" + course + "&semester=" + semester)
    .then((response) => {
      return response.json();
    })
    .then((modulesResponse) => {
      modulesResponse.forEach((module: Module) =>
        modules.push(
          new Module(
            module.uuid,
            module.name,
            course,
            module.eventType,
            module.name,
            module.prof,
            semester,
            false,
            module.events,
          ),
        ),
      );
    });
  return modules;
}

export async function fetchAllModules(): Promise<Module[]> {
  if (import.meta.env.SSR) {
    return [];
  }
  const modules: Module[] = [];
  await fetch("/api/modules")
    .then((response) => {
      return response.json() as Promise<Module[]>;
    })
    .then((responseModules: Module[]) => {
      responseModules.forEach((module: Module) => {
        modules.push(
          new Module(
            module.uuid,
            module.name,
            module.course,
            module.eventType,
            module.name,
            module.prof,
            module.semester,
            false,
            module.events,
          ),
        );
      });
    });

  return modules;
}
