const db = firebase.firestore();

let dbSnapshot = null;

async function db_getUserSnapshot() {
  let user = firebase.auth().currentUser;
  if (user == null) return false;
  let snap = {
    results: [],
    personalBests: {},
    tags: [],
  };
  // await db.collection('results')
  //     .orderBy('timestamp', 'desc')
  //     .where('uid', '==', user.uid)
  //     .get()
  //     .then(data => {
  //         // console.log('getting data from db!');
  //         data.docs.forEach(doc => {
  //             ret.push(doc.data());
  //         })
  //     })
  await db
    .collection(`users/${user.uid}/results/`)
    .orderBy("timestamp", "desc")
    .get()
    .then((data) => {
      // console.log('getting data from db!');
      data.docs.forEach((doc) => {
        let result = doc.data();
        result.id = doc.id;
        snap.results.push(result);
      });
    });
  await db
    .collection(`users/${user.uid}/tags/`)
    .get()
    .then((data) => {
      // console.log('getting data from db!');
      data.docs.forEach((doc) => {
        let tag = doc.data();
        tag.id = doc.id;
        snap.tags.push(tag);
      });
    });
  await db
    .collection("users")
    .doc(user.uid)
    .get()
    .then((res) => {
      // console.log('getting data from db!');
      let data = res.data();
      try {
        if (data.personalBests !== undefined) {
          snap.personalBests = data.personalBests;
        }
        snap.discordId = data.discordId;
        snap.pairingCode = data.discordPairingCode;
        snap.config = data.config;
      } catch (e) {
        //
      }
    });
  dbSnapshot = snap;
  return dbSnapshot;
}

async function db_getUserHighestWpm(
  mode,
  mode2,
  punctuation,
  language,
  difficulty
) {
  function cont() {
    let topWpm = 0;
    dbSnapshot.results.forEach((result) => {
      if (
        result.mode == mode &&
        result.mode2 == mode2 &&
        result.punctuation == punctuation &&
        result.language == language &&
        result.difficulty == difficulty
      ) {
        if (result.wpm > topWpm) {
          topWpm = result.wpm;
        }
      }
    });
    return topWpm;
  }

  let retval;
  if (dbSnapshot == null) {
    // await db_getUserResults().then(data => {
    //     retval = cont();
    // });
  } else {
    retval = cont();
  }
  return retval;
}

async function db_getLocalPB(mode, mode2, punctuation, language, difficulty) {
  function cont() {
    let ret = 0;
    try {
      dbSnapshot.personalBests[mode][mode2].forEach((pb) => {
        if (
          pb.punctuation == punctuation &&
          pb.difficulty == difficulty &&
          pb.language == language
        ) {
          ret = pb.wpm;
        }
      });
      return ret;
    } catch (e) {
      return ret;
    }
  }

  let retval;
  if (dbSnapshot == null) {
    // await db_getUserResults().then(data => {
    //     retval = cont();
    // });
  } else {
    retval = cont();
  }
  return retval;
}

async function db_saveLocalPB(
  mode,
  mode2,
  punctuation,
  language,
  difficulty,
  wpm
) {
  function cont() {
    try {
      let found = false;
      if (dbSnapshot.personalBests[mode][mode2] === undefined) {
        dbSnapshot.personalBests[mode][mode2] = [];
      }
      dbSnapshot.personalBests[mode][mode2].forEach((pb) => {
        if (
          pb.punctuation == punctuation &&
          pb.difficulty == difficulty &&
          pb.language == language
        ) {
          found = true;
          pb.wpm = wpm;
        }
      });
      if (!found) {
        //nothing found
        dbSnapshot.personalBests[mode][mode2].push({
          language: language,
          difficulty: difficulty,
          punctuation: punctuation,
          wpm: wpm,
        });
      }
    } catch (e) {
      //that mode or mode2 is not found
      dbSnapshot.personalBests[mode] = {};
      dbSnapshot.personalBests[mode][mode2] = [
        {
          language: language,
          difficulty: difficulty,
          punctuation: punctuation,
          wpm: wpm,
        },
      ];
    }
  }

  let retval;
  if (dbSnapshot == null) {
    // await db_getUserResults().then(data => {
    //     retval = cont();
    // });
  } else {
    cont();
  }
}