import axios from "axios";
import {
  ActivationParams,
  UpdateProductParams,
  AddProductParams,
  LoginParams,
  RegistrationParams,
} from "../../Interfaces/Interfaces";
import { useDispatch } from "react-redux";
import { SetUser } from "../../Features/Redux/Slices/LoggedInUserSlice/LoggedInUserSlice";
import { toggle_login } from "../../Features/Redux/Slices/Login/LoginSlice";

// Note APIs

export function GetProducts() {
  const token = JSON.parse(localStorage.getItem("token") || "{}");
  return axios
    .get("http://localhost:8000/api/v1/products/", {
      headers: {
        Authorization: "Token " + token,
      },
    })
    .then((response) => {
      return response.data;
    });
}

export function GetNote(id: number) {
  const token = JSON.parse(localStorage.getItem("token") || "{}");
  return axios
    .get("http://localhost:8000/api/v1/products/" + id + "/", {
      headers: {
        Authorization: "Token " + token,
      },
    })
    .then((response) => {
      return response.data;
    });
}

export function UpdateProduct(note: UpdateProductParams) {
  const token = JSON.parse(localStorage.getItem("token") || "{}");
  return axios
    .patch("http://localhost:8000/api/v1/products/" + note.id + "/", note, {
      headers: {
        Authorization: "Token " + token,
      },
    })
    .then((response) => {
      return response.data;
    })
    .catch((error) => {
      console.log("Error updating product", error.response);
      return error;
    });
}

export function AddProduct(note: AddProductParams) {
  const token = JSON.parse(localStorage.getItem("token") || "{}");
  return axios
    .post("http://localhost:8000/api/v1/products/", note, {
      headers: {
        Authorization: "Token " + token,
      },
    })
    .then((response) => {
      return response.data;
    })
    .catch((error) => {
      console.log("Error adding product", error.response);
      return error;
    });
}

export function DeleteProduct(id: number) {
  const token = JSON.parse(localStorage.getItem("token") || "{}");
  return axios
    .delete("http://localhost:8000/api/v1/products/" + id + "/", {
      headers: {
        Authorization: "Token " + token,
      },
    })
    .catch((error) => {
      console.log("Error deleting product", error.response);
      return error;
    });
}

// User APIs

export function UserRegister(register: RegistrationParams) {
  return axios
    .post("http://localhost:8000/api/v1/accounts/users/", register)
    .then(async (response) => {
      console.log(response.data);
      return true;
    })
    .catch((error) => {
      console.log("Registration failed: " + error.response);
      return false;
    });
}

export function UserLogin(user: LoginParams) {
  return axios
    .post("http://localhost:8000/api/v1/accounts/token/login/", user)
    .then(async (response) => {
      localStorage.setItem("token", JSON.stringify(response.data.auth_token));
      console.log(
        "Login Success! Stored Token: ",
        JSON.parse(localStorage.getItem("token") || "{}")
      );
      return true;
    })
    .catch((error) => {
      console.log("Login Failed: " + error.response);
      return false;
    });
}

export function UserInfo() {
  const token = JSON.parse(localStorage.getItem("token") || "{}");
  return axios
    .get("http://localhost:8000/api/v1/accounts/users/me/", {
      headers: {
        Authorization: "Token " + token,
      },
    })
    .then((response) => {
      console.log(response.data);
      return response.data;
    })
    .catch((error) => {
      console.log("Error retrieving user data", error.response);
      return false;
    });
}

export function UserActivate(activation: ActivationParams) {
  return axios
    .post("http://localhost:8000/api/v1/accounts/users/activation/", activation)
    .then(async (response) => {
      console.log("Activation Success");
      return true;
    })
    .catch((error) => {
      console.log("Activation failed: " + error.response);
      return false;
    });
}

export async function CheckSavedSession() {
  console.log("Checking for saved session by querying user data");
  if (JSON.parse(localStorage.getItem("token") || "{}")) {
    if (await UserInfo()) {
      console.log("Previous session found");
      return true;
    } else {
      console.log("Previous session found but expired");
      return false;
    }
  }
  console.log("No previous session found");
  return false;
}
