 // @type="module" 
 // this will load the Firebase modules we need, then put them in the window object to be used globally
 import { initializeApp } from "https://www.gstatic.com/firebasejs/9.21.0/firebase-app.js";
 import { getFirestore, collection, getDocs,getDoc, addDoc, onSnapshot, setDoc, doc, updateDoc, query, where  } from "https://www.gstatic.com/firebasejs/9.21.0/firebase-firestore.js";
 import {
     getAuth,
     onAuthStateChanged,
     createUserWithEmailAndPassword,
     signInWithEmailAndPassword,
     signOut,
     GoogleAuthProvider,
     signInWithPopup,
     getRedirectResult,
     sendPasswordResetEmail,
 }  from "https://www.gstatic.com/firebasejs/9.21.0/firebase-auth.js";
 import { getFunctions, httpsCallableFromURL, httpsCallable, connectFunctionsEmulator } from "https://www.gstatic.com/firebasejs/9.21.0/firebase-functions.js";

 const firebaseConfig = {
     apiKey: "AIzaSyDZJo4P3zfVVM2m3wqUwWx6TZZv6u7KMF4",
     authDomain: "prime-micron-374215.firebaseapp.com",
     projectId: "prime-micron-374215",
     storageBucket: "prime-micron-374215.appspot.com",
     messagingSenderId: "1095220060162",
     appId: "1:1095220060162:web:14f4c9d064e9b958f5471b",
     measurementId: "G-YYXHFBMX8R"
 };

 // Initialize Firebase
 const app = initializeApp(firebaseConfig);
 const db = getFirestore(app);
 const auth = getAuth(app)

 const firebase = {}
 firebase.app = app
 firebase.auth = {
     auth,
     getAuth,
     onAuthStateChanged,
     createUserWithEmailAndPassword,
     signInWithEmailAndPassword,
     signOut,
     GoogleAuthProvider,
     signInWithPopup,
     getRedirectResult,
     sendPasswordResetEmail,
 }


 const getCallable = functionName => httpsCallable(getFunctions(app), functionName); 
 const functions = getFunctions(app);
 //connectFunctionsEmulator(functions, "localhost", 5001);
 firebase.functions = {
     getFunctions, 
     httpsCallableFromURL, 
     httpsCallable,
     getCallable,
     connectFunctionsEmulator,
 }
 firebase.firestore = {
     getFirestore, collection, getDocs, addDoc, onSnapshot, db, setDoc, doc, getDoc, updateDoc, query, where 
 }
 window.firebase = Object.freeze(firebase)