import { NewProject, Project } from "../Types/Project";
import { NewUser, User } from "../Types/Users";

// Defines all the methods that an instance of the API must implement
interface API {
  /** Register a new user */
  registerUser(user: NewUser): Promise<User>;
  /** Remove a user */
  removeUser(username: string): Promise<User>;
  /** Create a project */
  createProject(project: NewProject): Promise<Project>;
  /** Renew the token */
  renewToken(token: string): Promise<string>;
}

// Export an instance of the API
export const api: API = {
  async registerUser(user: NewUser): Promise<User> {
    return fetch("/api/register", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(user),
    }).then((res) => res.json() as Promise<User>);
  },

  async removeUser(username: string): Promise<User> {
    return fetch("/api/userdelete", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(username),
    }).then((res) => res.json() as Promise<User>);
  },

  async createProject(project: NewProject): Promise<Project> {
    return fetch("/api/project", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(project),
    }).then((res) => res.json() as Promise<Project>);
  },

  async renewToken(token: string): Promise<string> {
    return fetch("/api/loginrenew", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        Authorization: "Bearer " + token,
      },
    }).then((res) => res.json() as Promise<string>);
  },
};
