let apiUri = `${window.location.protocol}//${window.location.host.split(':')[0]}:6531`

if(getCookie("apiUri") != ""){
    apiUri = getCookie("apiUri");
}
setCookie("apiUri", apiUri);

function setCookie(cname, cvalue) {
  const d = new Date();
  d.setTime(d.getTime() + (365*24*60*60*1000));
  let expires = "expires="+ d.toUTCString();
  document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/;samesite=strict";
}

function getCookie(cname) {
    let name = cname + "=";
    let decodedCookie = decodeURIComponent(document.cookie);
    let ca = decodedCookie.split(';');
    for(let i = 0; i < ca.length; i++) {
        let c = ca[i];
        while (c.charAt(0) == ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) == 0) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}

async function GetData(uri){
    let request = await fetch(uri, {
        method: 'GET',
        headers: {
            'Accept': 'application/json'
        }
    });
    let json = await request.json();
    return json;
}

async function PostData(uri){
    let request = await fetch(uri, {
        method: 'POST'
    });
    //console.log(request);
}

function DeleteData(uri){
    fetch(uri, {
        method: 'DELETE'
    });
}

async function Ping(){
  let ret = await GetData(`${apiUri}/Ping`);
  return ret;
}

async function GetAvailableControllers(){
    var uri = apiUri + "/Connectors";
    let json = await GetData(uri);
    return json;
}

async function GetPublicationFromConnector(connector, title){
  var uri;
  if(title.includes("http")){
    uri = `${apiUri}/Manga/FromConnector?connector=${connector}&url=${title}`;
  }else{
    uri = `${apiUri}/Manga/FromConnector?connector=${connector}&title=${title}`;
  }
  let json = await GetData(uri);
  return json;
}

async function GetChapters(connector, internalId, language){
    var uri = `${apiUri}/Manga/Chapters?connector=${connector}&internalId=${internalId}&translatedLanguage=${language}`;
    let json = await GetData(uri);
    return json;
}

function GetCoverUrl(internalId){
  return `${apiUri}/Manga/Cover?internalId=${internalId}`;
}

async function GetAllJobs(){
	var uri = `${apiUri}/Jobs`;
	let json = await GetData(uri);
	return json;
}

async function GetRunningJobs(){
    var uri = `${apiUri}/Jobs/Running`;
    let json = await GetData(uri);
    return json;
}

async function GetWaitingJobs(){
    var uri = `${apiUri}/Jobs/Waiting`;
    let json = await GetData(uri);
    return json;
}

async function GetMonitorJobs(){
  var uri = `${apiUri}/Jobs/MonitorJobs`;
  let json = await GetData(uri);
  return json;
}

async function GetProgress(jobId){
    var uri = `${apiUri}/Jobs/Progress?jobId=${jobId}`;
    let json = await GetData(uri);
    return json;
}

async function GetSettings(){
    var uri = `${apiUri}/Settings`;
    let json = await GetData(uri);
    return json;
}

async function GetAvailableNotificationConnectors(){
	var uri = `${apiUri}/NotificationConnectors/Types`;
	let json = await GetData(uri);
	return json;
}

async function GetNotificationConnectors(){
	var uri = `${apiUri}/NotificationConnectors`;
	let json = await GetData(uri);
	return json;
}

async function GetAvailableLibraryConnectors(){
	var uri = `${apiUri}/LibraryConnectors/Types`;
	let json = await GetData(uri);
	return json;
}

async function GetLibraryConnectors(){
	var uri = `${apiUri}/LibraryConnectors`;
	let json = await GetData(uri);
	return json;
}

async function GetRateLimits() {
    var uri = `${apiUri}/Settings/customRequestLimit`
    let json = await GetData(uri);
    return json;
}

function CreateMonitorJob(connector, internalId, language){
    var uri = `${apiUri}/Jobs/MonitorManga?connector=${connector}&internalId=${internalId}&interval=03:00:00&translatedLanguage=${language}`;
    PostData(uri);
}

function CreateDownloadNewChaptersJob(connector, internalId, language){
    var uri = `${apiUri}/Jobs/DownloadNewChapters?connector=${connector}&internalId=${internalId}&translatedLanguage=${language}`;
    PostData(uri);
}

function StartJob(jobId){
    var uri = `${apiUri}/Jobs/StartNow?jobId=${jobId}`;
    PostData(uri);
}

function UpdateDownloadLocation(downloadLocation){
    var uri = `${apiUri}/Settings/UpdateDownloadLocation?downloadLocation=${downloadLocation}`;
    PostData(uri);	
}

function RefreshLibraryMetadata() {
    var uri = `${apiUri}/Jobs/UpdateMetadata`;
    PostData(uri);
}

async function DownloadLogs() {
    var uri = `${apiUri}/LogFile`;

    //Below taken from https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream
    fetch(uri)
    .then((response) => response.body)
    .then((rb) => {
      const reader = rb.getReader();
  
      return new ReadableStream({
        start(controller) {
          // The following function handles each data chunk
          function push() {
            // "done" is a Boolean and value a "Uint8Array"
            reader.read().then(({ done, value }) => {
              // If there is no more data to read
              if (done) {
                console.log("done", done);
                controller.close();
                return;
              }
              // Get the data and send it to the browser via the controller
              controller.enqueue(value);
              // Check chunks by logging to the console
              console.log(done, value);
              push();
            });
          }
  
          push();
        },
      });
    })
    .then((stream) =>
      // Respond with our stream
      new Response(stream, { headers: { "Content-Type": "text/html" } }).text(),
    )
    .then((result) => {
      // Do things with result
      //console.log(result);

      //Below download taken from https://stackoverflow.com/questions/3665115/how-to-create-a-file-in-memory-for-user-to-download-but-not-through-server
      var element = document.createElement('a');
      element.setAttribute('href', 'data:text/plain;charset-utf-8,' + encodeURIComponent(result));
      var newDate = new Date();
      var filename = "Tranga_Logs_" + newDate.today() + "_" + newDate.timeNow() + ".log";
      element.setAttribute('download', filename);
      element.click();
    });
}

//Following date-time code taken from: https://stackoverflow.com/questions/10211145/getting-current-date-and-time-in-javascript
// For todays date;
Date.prototype.today = function () { 
    return ((this.getDate() < 10)?"0":"") + this.getDate() +"/"+(((this.getMonth()+1) < 10)?"0":"") + (this.getMonth()+1) +"/"+ this.getFullYear();
}

// For the time now
Date.prototype.timeNow = function () {
     return ((this.getHours() < 10)?"0":"") + this.getHours() +"_"+ ((this.getMinutes() < 10)?"0":"") + this.getMinutes() +"_"+ ((this.getSeconds() < 10)?"0":"") + this.getSeconds();
}

//Komga
function UpdateKomga(komgaUrl, komgaAuth){
    var uri = `${apiUri}/LibraryConnectors/Update?libraryConnector=Komga&komgaUrl=${komgaUrl}&komgaAuth=${komgaAuth}`;
    PostData(uri);
}

function ResetKomga(){
    var uri = `${apiUri}/LibraryConnectors/Reset?libraryConnector=Komga`;
    PostData(uri);
}

function TestKomga(komgaUrl, komgaAuth){
    var uri = `${apiUri}/LibraryConnectors/Test?libraryConnector=Komga&komgaUrl=${komgaUrl}&komgaAuth=${komgaAuth}`;
    PostData(uri);
}


//Kavita
function UpdateKavita(kavitaUrl, kavitaUsername, kavitaPassword){
    var uri = `${apiUri}/LibraryConnectors/Update?libraryConnector=Kavita&kavitaUrl=${kavitaUrl}&kavitaUsername=${kavitaUsername}&kavitaPassword=${kavitaPassword}`;
    PostData(uri);
}

function ResetKavita(){
    var uri = `${apiUri}/LibraryConnectors/Reset?libraryConnector=Kavita`;
    PostData(uri);
}

function TestKavita(kavitaUrl, kavitaUsername, kavitaPassword){
    var uri = `${apiUri}/LibraryConnectors/Test?libraryConnector=Kavita&kavitaUrl=${kavitaUrl}&kavitaUsername=${kavitaUsername}&kavitaPassword=${kavitaPassword}`;
    PostData(uri);
}

//Gotify
function UpdateGotify(gotifyUrl, gotifyAppToken){
    var uri = `${apiUri}/NotificationConnectors/Update?notificationConnector=Gotify&gotifyUrl=${gotifyUrl}&gotifyAppToken=${gotifyAppToken}`;
    PostData(uri);
}

function ResetGotify(){
    var uri = `${apiUri}/NotificationConnectors/Reset?notificationConnector=Gotify`;
    PostData(uri);
}

function TestGotify(gotifyUrl, gotifyAppToken){
    var uri = `${apiUri}/NotificationConnectors/Test?notificationConnector=Gotify&gotifyUrl=${gotifyUrl}&gotifyAppToken=${gotifyAppToken}`;
    PostData(uri);
}

//LunaSea
function UpdateLunaSea(lunaseaWebhook){
    var uri = `${apiUri}/NotificationConnectors/Update?notificationConnector=LunaSea&lunaseaWebhook=${lunaseaWebhook}`;
    PostData(uri);
}

function ResetLunaSea(){
    var uri = `${apiUri}/NotificationConnectors/Reset?notificationConnector=LunaSea`;
    PostData(uri);
}

function TestLunaSea(lunaseaWebhook){
    var uri = `${apiUri}/NotificationConnectors/Test?notificationConnector=LunaSea&lunaseaWebhook=${lunaseaWebhook}`;
    PostData(uri);
}

//Ntfy
function UpdateNtfy(ntfyEndpoint, ntfyAuth){
    var uri = `${apiUri}/NotificationConnectors/Update?notificationConnector=Ntfy&ntfyUrl=${ntfyEndpoint}&ntfyAuth=${ntfyAuth}`;
    PostData(uri);
}

function ResetNtfy(){
    var uri = `${apiUri}/NotificationConnectors/Reset?notificationConnector=Ntfy`;
    PostData(uri);
}

function TestNtfy(ntfyEndpoint, ntfyAuth){
    var uri = `${apiUri}/NotificationConnectors/Test?notificationConnector=Ntfy&ntfyUrl=${ntfyEndpoint}&ntfyAuth=${ntfyAuth}`;
    PostData(uri);
}

function UpdateUserAgent(userAgent){
    var uri = `${apiUri}/Settings/userAgent?userAgent=${userAgent}`;
    PostData(uri);
}

function UpdateRateLimit(byteValue, rateLimit) {
    var uri = `${apiUri}/Settings/customRequestLimit?requestType=${byteValue}&requestsPerMinute=${rateLimit}`;
    PostData(uri);
}

function RemoveJob(jobId){
    var uri = `${apiUri}/Jobs?jobId=${jobId}`;
    DeleteData(uri);
}

function CancelJob(jobId){
    var uri = `${apiUri}/Jobs/Cancel?jobId=${jobId}`;
    PostData(uri);
}

async function GetLogmessages(count){
	var uri = `${apiUri}/LogMessages?count=${count}`;
	let json = await GetData(uri);
    console.log(json);
	return json;
}