import 'package:intl/intl.dart';

class KretaAPI {
  // IDP API
  static const login = BaseKreta.kretaIdp + KretaApiEndpoints.token;
  static const logout = BaseKreta.kretaIdp + KretaApiEndpoints.revoke;
  static const nonce = BaseKreta.kretaIdp + KretaApiEndpoints.nonce;
  static const clientId = "kreta-ellenorzo-mobile-android";

  // ELLENORZO API
  static String notes(String iss) =>
      BaseKreta.kreta(iss) + KretaApiEndpoints.notes;
  static String events(String iss) =>
      BaseKreta.kreta(iss) + KretaApiEndpoints.events;
  static String student(String iss) =>
      BaseKreta.kreta(iss) + KretaApiEndpoints.student;
  static String grades(String iss) =>
      BaseKreta.kreta(iss) + KretaApiEndpoints.grades;
  static String absences(String iss) =>
      BaseKreta.kreta(iss) + KretaApiEndpoints.absences;
  static String groups(String iss) =>
      BaseKreta.kreta(iss) + KretaApiEndpoints.groups;
  static String groupAverages(String iss, String uid) =>
      "${BaseKreta.kreta(iss)}${KretaApiEndpoints.groupAverages}?oktatasiNevelesiFeladatUid=$uid";
  static String averages(String iss, String uid) =>
      "${BaseKreta.kreta(iss)}${KretaApiEndpoints.averages}?oktatasiNevelesiFeladatUid=$uid";
  static String timetable(String iss, {DateTime? start, DateTime? end}) =>
      BaseKreta.kreta(iss) +
      KretaApiEndpoints.timetable +
      (start != null && end != null
          ? "?datumTol=${start.toUtc().toIso8601String()}&datumIg=${end.toUtc().toIso8601String()}"
          : "");
  static String exams(String iss) =>
      BaseKreta.kreta(iss) + KretaApiEndpoints.exams;
  static String homework(String iss, {DateTime? start, String? id}) =>
      BaseKreta.kreta(iss) +
      KretaApiEndpoints.homework +
      (id != null ? "/$id" : "") +
      (id == null && start != null
          ? "?datumTol=${DateFormat('yyyy-MM-dd').format(start)}"
          : "");
  static String capabilities(String iss) =>
      BaseKreta.kreta(iss) + KretaApiEndpoints.capabilities;
  static String downloadHomeworkAttachments(
          String iss, String uid, String type) =>
      BaseKreta.kreta(iss) +
      KretaApiEndpoints.downloadHomeworkAttachments(uid, type);
  static String subjects(String iss, String uid) =>
      "${BaseKreta.kreta(iss)}${KretaApiEndpoints.subjects}?oktatasiNevelesiFeladatUid=$uid";
  // Structure:
  // {
  //   "Uid": 000,
  //   "Tantargy": {
  //       "Uid": 000,
  //       "Nev": "Irodalom",
  //       "Kategoria": {
  //          "Uid": "000,magyar_nyelv_es_irodalom",
  //          "Nev": "magyar_nyelv_es_irodalom",
  //          "Leiras": "Magyar nyelv és irodalom"
  //       },
  //       "SortIndex": 0,
  //    },
  //    "Atlag": null, // float
  //    "AtlagAlakulasaIdoFuggvenyeben": Array[], // no idea what this is
  //    "SulyozottOsztalyzatOsszege": null, // int | float
  //    "SulyozottOsztalyzatSzama": null, // int | float
  //    "SortIndex": 0
  // }
  // refer to https://discord.com/channels/1111649116020285532/1111798771513303102/1148368925969612920

  // ADMIN API
  static const sendMessage =
      BaseKreta.kretaAdmin + KretaAdminEndpoints.sendMessage;
  static String messages(String endpoint) =>
      BaseKreta.kretaAdmin + KretaAdminEndpoints.messages(endpoint);
  static String message(String id) =>
      BaseKreta.kretaAdmin + KretaAdminEndpoints.message(id);
  static const recipientCategories =
      BaseKreta.kretaAdmin + KretaAdminEndpoints.recipientCategories;
  static const availableCategories =
      BaseKreta.kretaAdmin + KretaAdminEndpoints.availableCategories;
  static const recipientTeachers =
      BaseKreta.kretaAdmin + KretaAdminEndpoints.recipientTeachers;
  static const recipientDirectorate =
      BaseKreta.kretaAdmin + KretaAdminEndpoints.recipientDirectorate;
  static const uploadAttachment =
      BaseKreta.kretaAdmin + KretaAdminEndpoints.uploadAttachment;
  static String downloadAttachment(String id) =>
      BaseKreta.kretaAdmin + KretaAdminEndpoints.downloadAttachment(id);
  static const trashMessage =
      BaseKreta.kretaAdmin + KretaAdminEndpoints.trashMessage;
  static const deleteMessage =
      BaseKreta.kretaAdmin + KretaAdminEndpoints.deleteMessage;
}

class BaseKreta {
  static String kreta(String iss) => "https://$iss.e-kreta.hu";
  static const kretaIdp = "https://idp.e-kreta.hu";
  static const kretaAdmin = "https://eugyintezes.e-kreta.hu";
  static const kretaFiles = "https://files.e-kreta.hu";
}

class KretaApiEndpoints {
  static const token = "/connect/token";
  static const revoke = "/connect/revocation";
  static const nonce = "/nonce";
  static const notes = "/ellenorzo/V3/Sajat/Feljegyzesek";
  static const events = "/ellenorzo/V3/Sajat/FaliujsagElemek";
  static const student = "/ellenorzo/V3/Sajat/TanuloAdatlap";
  static const grades = "/ellenorzo/V3/Sajat/Ertekelesek";
  static const absences = "/ellenorzo/V3/Sajat/Mulasztasok";
  static const groups = "/ellenorzo/V3/Sajat/OsztalyCsoportok";
  static const groupAverages =
      "/ellenorzo/V3/Sajat/Ertekelesek/Atlagok/OsztalyAtlagok";
  static const averages = "/ellenorzo/V3/idk";
  static const timetable = "/ellenorzo/V3/Sajat/OrarendElemek";
  static const exams = "/ellenorzo/V3/Sajat/BejelentettSzamonkeresek";
  static const homework = "/ellenorzo/V3/Sajat/HaziFeladatok";
  // static const homeworkDone = "/ellenorzo/V3/Sajat/HaziFeladatok/Megoldva"; // Removed from the API
  static const capabilities = "/ellenorzo/V3/Sajat/Intezmenyek";
  static String downloadHomeworkAttachments(String uid, String type) =>
      "/ellenorzo/V3/Sajat/Csatolmany/$uid";
  static const subjects =
      "/ellenorzo/V3/Sajat/Ertekelesek/Atlagok/TantargyiAtlagok";
}

class KretaAdminEndpoints {
  //static const messages = "/api/v1/kommunikacio/postaladaelemek/sajat";
  static const sendMessage = "/api/v1/kommunikacio/uzenetek";
  static String messages(String endpoint) =>
      "/api/v1/kommunikacio/postaladaelemek/$endpoint";
  static String message(String id) =>
      "/api/v1/kommunikacio/postaladaelemek/$id";
  static const recipientCategories = "/api/v1/adatszotarak/cimzetttipusok";
  static const availableCategories = "/api/v1/kommunikacio/cimezhetotipusok";
  static const recipientTeachers = "/api/v1/kreta/alkalmazottak/tanar";
  static const recipientDirectorate = "/api/v1/kreta/alkalmazottak/igazgatosag";
  static const uploadAttachment = "/ideiglenesfajlok";
  static String downloadAttachment(String id) =>
      "/api/v1/dokumentumok/uzenetek/$id";
  static const trashMessage = "/api/v1/kommunikacio/postaladaelemek/kuka";
  static const deleteMessage = "/api/v1/kommunikacio/postaladaelemek/torles";
  // profile management
  static const editProfile = "/api/profilapi/saveprofildata";
}