import { ApplicationFull } from "@shared/types/application";


//  @ts-ignore
const addr = import.meta.env.VITE_APIHOST;

export async function loadApplication(id: number | string, asAdmin: boolean = false): Promise<ApplicationFull | null> {
  const res = await fetch(`${addr}/application/${id}?admin=${asAdmin}`, { credentials: 'include' })
  if (res.status === 204) return null
  if (!res.ok) throw new Error('Failed to load application')
  const json = await res.json()
  // Accept either the object at root or under `application`
  return json;
}

export async function postApplication(val: any) {

  let out = {
    "App": val,
  }
  const res = await fetch(`${addr}/application`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(out),
    credentials: 'include',
  })
  return res;
}

export async function postChatMessage(message: any, post_id: number) {

  const out = {
    message: message
  }

  const response = await fetch(`${addr}/application/${post_id}/comment`, {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(out),
  })

  return await response.json();
}

export async function postAdminChatMessage(message: any, post_id: number) {
  const out = {
    message: message
  }

  const response = await fetch(`${addr}/application/${post_id}/adminComment`, {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(out),
  })

  return await response.json();
}

export async function getAllApplications(): Promise<ApplicationFull> {
  const res = await fetch(`${addr}/application/all`, {
    credentials: 'include',
  })

  if (res.ok) {
    return res.json()
  } else {
    console.error("Something went wrong approving the application")
  }
}

export async function loadMyApplications(): Promise<ApplicationFull> {
  const res = await fetch(`${addr}/application/meList`, { credentials: 'include' })

  if (res.ok) {
    return res.json()
  } else {
    console.error("Something went wrong approving the application")
  }
}

export async function getMyApplication(id: number): Promise<ApplicationFull> {
  const res = await fetch(`${addr}/application/me/${id}`, { credentials: 'include' })
  if (res.status === 204) return null
  if (res.status === 403) throw new Error("Unauthorized");
  if (!res.ok) throw new Error('Failed to load application')
  const json = await res.json()
  // Accept either the object at root or under `application`
  return json;
}

export async function approveApplication(id: Number) {
  const res = await fetch(`${addr}/application/approve/${id}`, { method: 'POST', credentials: 'include' })

  if (!res.ok) {
    console.error("Something went wrong approving the application")
  }
}

export async function denyApplication(id: Number) {
  const res = await fetch(`${addr}/application/deny/${id}`, { method: 'POST', credentials: 'include' })

  if (!res.ok) {
    console.error("Something went wrong denying the application")
  }
}

export async function restartApplication() {
  const res = await fetch(`${addr}/application/restart`, {
    method: 'POST',
    credentials: 'include'
  })

  if (!res.ok) {
    console.error("Something went wrong restarting your application")
  }
}

export async function getCoC(): Promise<string> {
  const res = await fetch(`${addr}/application/coc`, {
    method: "GET",
    credentials: 'include',
  });
  if (res.ok) {
    const out = res.json();
    if (!out) {
      return null;
    }
    return out;
  } else {
    return null;
  }
}