import { initFirebase } from '@/lib/firebase/initFirebase';
import { db } from '@/lib/firebase/initFirebase';
import { doc, setDoc, getDoc, updateDoc, arrayUnion} from "firebase/firestore";
import { UserInfo, DocumentInfo} from '@/lib/utils/types';
import { ECollection } from '@/lib/utils/types';


export async function readUserInfo(userId: string) {
  try {
    const userDoc = doc(db, ECollection.USERS, userId);
    const userDocSnapshot = await getDoc(userDoc);

    if (userDocSnapshot.exists()) {
      const userInfo = userDocSnapshot.data() as UserInfo;
      return {data: userInfo as UserInfo};
    }
  } catch (error) {
    console.error(error);
    return {error: "Something went wrong!"}
  }

  return {error: "Something went wrong!"}
}


export async function writeUserInfo(userInfo: UserInfo) {
  try {
    const userDoc = doc(db, ECollection.USERS, userInfo.uid);
    await setDoc(userDoc, userInfo);

  } catch (error) {
    console.error(error);
  }
}


export async function initUserInfo(userId: string) {
  const userInfo: UserInfo = {
    uid: userId,
    plan: 'free',
    documents: [],
    apiKey: '',
  };

  try {
    const userDoc = doc(db, ECollection.USERS, userId);
    await setDoc(userDoc, userInfo);

  } catch (error) {
    console.error(error);
    return {error: "Something went wrong!"}
  }

  return {data: userInfo}
}


export async function updateUserInfo(userUid: string, userInfo: Partial<UserInfo>) {
  try {
    const userDoc = doc(db, ECollection.USERS, userUid);
    await updateDoc(userDoc, userInfo);

  } catch (error) {
    console.error(error);
    return {error: "Something went wrong!"}
  }

  return {data: userInfo}
}


// When the document just has been uploaded, we need to add the document info
// to the user's document list
export async function addNewDocument(docInfo: DocumentInfo, uid: string) {
  try {
    const userDoc = doc(db, ECollection.USERS, uid);
    await updateDoc(userDoc, {
      documents: arrayUnion(docInfo)
    });

  } catch (error) {
    console.error(error);
    return {error: "Something went wrong!"}
  }

  return {data: docInfo}
}

// When deleting a document, we remove the object with the specific id from the
// user's document list, and overwrite the document list in the database
export async function deleteDocInfo(docInfo: DocumentInfo, userInfo: UserInfo) {

  // Using docInfo.id, remove the document from the user's document list
  const newDocList = userInfo.documents.filter((doc: DocumentInfo) => doc.id !== docInfo.id);

  // Overwrite the "documents" field in the database
  try {
    const userDoc = doc(db, ECollection.USERS, userInfo.uid);
    await updateDoc(userDoc, {documents: newDocList});
    
  } catch (error) {
    console.error(error);
    return {error: "Something went wrong!"}
  }

}