// Global variables
let global_project_list;
let current_project = "";
let active_camera_project = null; // ID du projet actuellement utilisé par la caméra

function formatDate(isoString) {
  const date = new Date(isoString);

  const options = {
    year: "numeric",
    month: "long",
    day: "numeric",
    hour: "numeric",
    minute: "numeric",
    second: "numeric",
    timeZoneName: "short",
  };

  return date.toLocaleString("en-US", options);
}
// Function to get data from API

function getAllProject() {
  return $.ajax({
    url: api_url.concat("/projects"),
    method: "GET",
    dataType: "json"
  }).then((data) => {
    return data;
  });
}

function getSingleProject(id) {
  return $.ajax({
    url: api_url.concat("/projects/"+id),
    method: "GET",
    dataType: "json"
  }).then((data) => {
    return data;
  });
}

async function getDataMetrics(projectId){
  try {
    const response = await $.ajax({
      url: api_url.concat(`/projects/${projectId}/measurements`),
      method: "GET",
      dataType: "json",
    });
    return response;
  } catch (error) {
    console.log("no data for this project")
    return error.status;
  }
}


async function getDataProjectVideosFromApi(id) {
  try {
    const response = await $.ajax({
      url: api_url.concat(`/projects/${id}/videos`),
      method: "GET",
      dataType: "json",
    });
    // If the request is successful, store the data in the cache and return it
    return response;
  } catch (error) {
    return(error.status)
  }
}

async function getDataVideoFromApi(id) {
  try {
    const response = await $.ajax({
      url: api_url.concat(`/videos/${id}`),
      method: "GET",
      dataType: "json",
    });
    // If the request is successful, store the data in the cache and return it
    return response;
  } catch (error) {
    alert("Error fetching data:", error);
    throw error; // Re-throw the error to handle it outside the function if needed
  }
}

async function postNewVideo(project_id, measurements_id, name_video, resolution, duration) {
  try {
    const measures = JSON.stringify(measurements_id);
    const mydata = JSON.stringify({
      project_id: project_id,
      measurement_ids: measures, // Ensure this matches the expected field name
      name: name_video,
      resolution: resolution,
      duration: duration
    });

    const response = await $.ajax({
      url: api_url.concat(`/videos/`),
      method: "POST",
      dataType: "json",
      contentType: "application/json",
      data: mydata
    });

    alert("Video posted successfully:", response);
  } catch (error) {
    alert("Error posting video:", error);
    throw error;
  }
}
async function PostNewProject(nameProject, description){
  try {
    if(description.length==0){
      description="Non renseignée"
    }
    const mydata = JSON.stringify({
      name: nameProject,
      description: description
    });
    const response = await $.ajax({
      url: api_url.concat(`/projects`),
      method: "POST",
      dataType: "json",
      contentType: "application/json",
      data: mydata
    });

    alert("Video posted successfully:", response);
    location.reload();
  } catch (error) {
    alert("Error posting video:", error);
    throw error;
  }
}

async function deleteProject(id){
  try {
      const response = await $.ajax({
        url: api_url.concat(`/projects/${id}`),
        method: "DELETE",
      }).then(()=>{
        alert("Projet supprimé avec succès")
        location.reload();
      })
  } catch (error) {
    alert("Error deleting project, project id :"+ id+"\n error :"+error);
    throw error;
  }
}
async function deleteVideo(id){
  try {
      const response = await $.ajax({
        url: api_url.concat(`/videos/${id}`),
        method: "DELETE",
      }).then(()=>{
        alert("Video supprimé avec succès")
        location.reload();
      })
  } catch (error) {
    alert("Error deleting video, video id :"+ id+"\n error :"+error);
    throw error;
  }
}

async function renderVideo(id){
  try {
    const mydata = JSON.stringify({
      info:"none"
    });
    const response = await $.ajax({
      url: api_url.concat(`/videos/render/`+id),
      method: "POST",
      dataType: "json",
      contentType: "application/json",
      data: mydata
    });

    alert("Video rendered successfully:", response);
  } catch (error) {
    alert("Error rendering video:", error);
    throw error;
  }
}

async function start_timelapse(id,frequency,nbimages){
  try {
    // Vérifier si un autre projet est déjà actif avec la caméra
    if (active_camera_project !== null && active_camera_project !== id) {
      const confirmation = confirm(`Un autre projet (ID: ${active_camera_project}) est déjà en cours avec la caméra. Voulez-vous arrêter ce projet et configurer la caméra pour le projet actuel?`);
      if (!confirmation) {
        alert("Configuration annulée. La caméra reste configurée pour le projet précédent.");
        return false;
      }
      // Si l'utilisateur confirme, on continue et on va redéfinir active_camera_project
    }
    
    // Utilisation de plusieurs formats possibles pour garantir que le backend reçoit l'ID
    const mydata = JSON.stringify({
      project_id: id,   // Format avec underscore (convention standard REST)
      projectId: id,    // Format camelCase 
      id: id,           // Format simple
      interval: frequency,
      nb_images: nbimages 
    });
    
    console.log("Données envoyées à /procedure/start:", mydata); // Log pour débogage
    
    const response = await $.ajax({
      url: api_url.concat(`/procedure/start`),
      method: "POST",
      dataType: "json",
      contentType: "application/json",
      data: mydata
    });

    // Définir ce projet comme le projet actif pour la caméra
    active_camera_project = id;
    
    alert("Configuration de la caméra réussie");
    return response;
  } catch (error) {
    console.error("Erreur détaillée:", error); // Log plus détaillé de l'erreur
    alert("Erreur lors de la configuration de la caméra: " + error);
    throw error;
  }
}

async function stopCamera(id){
  try {
    const mydata = JSON.stringify({
      info:"None"
    });
    const response = await $.ajax({
      url: api_url.concat(`/procedure/stop`),
      method: "POST",
      dataType: "json",
      contentType: "application/json",
      data: mydata
    });

    // Réinitialiser le statut du projet actif sur la caméra
    active_camera_project = null;
    
    alert("La caméra a été arrêtée avec succès");
    return response;
  } catch (error) {
    alert("Erreur lors de l'arrêt de la caméra : " + error);
    throw error;
  }
}

async function manualUpload(imageFile, projectId, timestamp, temperature, humidity) {
  try {
    // Vérifier que l'upload est fait pour le projet actif de la caméra
    if (active_camera_project === null) {
      alert("Aucun projet n'est actif avec la caméra. Veuillez configurer un projet avant d'effectuer un upload manuel.");
      return false;
    }
    
    if (projectId !== active_camera_project) {
      alert(`L'upload manuel n'est possible que pour le projet actif (ID: ${active_camera_project}). Vous essayez d'uploader pour le projet ${projectId}.`);
      return false;
    }
    
    // Create FormData to send the file and metadata
    const formData = new FormData();
    formData.append('image', imageFile);
    formData.append('projectId', projectId);
    formData.append('timestamp', timestamp);
    formData.append('temperature', temperature);
    formData.append('humidity', humidity);

    const response = await $.ajax({
      url: api_url.concat("/camera/upload"),
      method: "POST",
      data: formData,
      processData: false,  // Prevents jQuery from converting FormData to string
      contentType: false,  // Lets browser set the content type with boundary
    });

    alert("Image téléchargée avec succès");
    return response;
  } catch (error) {
    alert("Erreur lors du téléchargement de l'image : " + error);
    throw error;
  }
}
