const { getFirestore, collection, getDocs, addDoc, onSnapshot, db } = firebase.firestore
const {
    getAuth,
    onAuthStateChanged,
    createUserWithEmailAndPassword,
} = firebase.auth

const auth = getAuth();

async function get_product_data() {
    const querySnapshot = await getDocs(collection(db, "products"));
    const grid = ui_grid()
    querySnapshot.forEach(async (productDoc) => {
        const product_data = productDoc.data()
        const product_features = Object.entries(product_data.metadata)
            .filter((([key]) => key.match(/feature_\d+/)))
            .sort((a, b) => a[0] > b[0])
            .map(([_, value]) => value)
        if (product_data.active) {
            const pricesSnapshot = await getDocs(collection(db, "products", productDoc.id, "prices"))
            pricesSnapshot.forEach((priceDoc) => {
                const priceData = priceDoc.data()
                if (priceData.active) {
                    const dollar_amount = priceData.unit_amount / 100

                    let price
                    if (priceData.type === "one_time") {
                        price = ui_div("center price-tag", "$", dollar_amount)
                    } else {
                        // its a subscription so we need to show the interval
                        price = ui_div("center price-tag", "$", dollar_amount, " / ", priceData.interval)
                    }

                    const description = ui_card_body_item("", price, ui_br())
                    const features = ui_div("", ui_ul("card-ul-padding", ...product_features.map(x => ui_li("", x))))

                    const buy_btn = ui_btn("Buy Now")
                    buy_btn.onclick = async () => {
                        buy_btn.disabled = true
                        buy_btn.innerText = "Heading to checkout..."
                        try {
                            await checkout_product(priceDoc.id, priceData.type)
                        } catch (error) {
                            if (error === "user abort") {
                                // the user simply quit. So we dont have to do anything.
                            } else {
                                console.error(error)
                            }
                        } finally {
                            buy_btn.innerText = "Buy Now"
                            buy_btn.disabled = false
                        }
                    }

                    const head = ui_card_head(product_data.name, ui_first_letter_upper_case(product_data.description))
                    const card = ui_card(head, description, buy_btn, features)
                    grid.append(ui_grid_item(card))
                }
            })
        }
    });
    document.getElementById("subscriptions-body").append(grid)

    // testing
    const echo_btn = ui_btn("send request")
    echo_btn.onclick = async () => {
        const client = await PaylayClient.init()
        const payload = await client.getProperty("sql_book_connection")
        console.log(payload)
        const data = {
            mode: "check-oracle-connection",
            payload: { sql: "select * from canvas.work", ...payload },
        }
        console.log(await client.callPaylay(data))
    }

    const saveConnection = ui_btn("save conection")
    saveConnection.onclick = async () => {
        const client = await PaylayClient.init()
        console.log("before")
        const data = await client.saveConnection("sql_book_connection", client.oracleConnection(
            "BOOK_USER",
            "Delphi.12345",
            "https://g4a14350af40031-s5yqhywqp1d9jghc.adb.us-phoenix-1.oraclecloudapps.com/ords/book_user/_/sql"))
        console.log("--->", data)

    }
    const getConnection = ui_btn("get conection")
    getConnection.onclick = async () => {
        const client = await PaylayClient.init()
        console.log("before")
        const data = await client.getConnection("sql_book_connection")
        console.log("--->", data)

    }
    const callServerPost = ui_btn("server post")
    callServerPost.onclick = async () => {
       
    }
    const signout = ui_btn_error("sign out")
    signout.onclick = async () => {
        firebase.auth.signOut(firebase.auth.getAuth())
    }
    const signIn = ui_btn("sign in")
    signIn.onclick = async () => {
        await getUser()
    }

    document.getElementById("subscriptions-body").append(ui_div("",
        echo_btn,
        saveConnection,
        getConnection,
        callServerPost,
        signout,
        signIn,
    ))
}

function callPaylay(data) {
    fetch("http://127.0.0.1:5001/prime-micron-374215/us-central1/paylay",
        {
            method: "POST",
            mode: "cors",
            headers: {
                "Content-Type": "application/json",
            },
            body: JSON.stringify(data), // body data type must match "Content-Type" header
        }).then(x => x.text()).then(x => {
            try {
                console.log(JSON.parse(x))
            } catch (e) {
                console.log(x);
            }
        })
}

async function checkout_product(price_id, price_type) {
    await new Promise((resolve, reject) => {
        const overlay = ui_div("overlay")
        onAuthStateChanged(auth, async (user) => {
            if (!user) {
                overlay.id = "overlay"

                const modal_x = ui_span("material-symbols-outlined button inline-icon", "close")
                modal_x.onclick = () => {
                    overlay.remove()
                    reject("user abort")
                }
                const modal_title = ui_div("modal-title right", "", modal_x)

                const modal_content = ui_div("modal-content p3 auth-container-in-modal",
                    ui_auth_form()
                )

                const modal = ui_div("modal", modal_title, modal_content)
                const modal_page = ui_div("modal-page", modal)

                overlay.append(modal_page)
                document.body.append(overlay)
            } else {
                overlay.remove()
                const checkoutPayload = {
                    price: price_id,
                    success_url: window.location.origin,
                    cancel_url: window.location.origin,
                }
                if (price_type === "one_time") { checkoutPayload.mode = "payment" }

                const checkout_session_ref = collection(db, "customers", user.uid, "checkout_sessions");
                const ref = await addDoc(checkout_session_ref, checkoutPayload)
                onSnapshot(ref, (snap) => {
                    const { error, url } = snap.data();
                    if (error) {
                        alert(`An error occured: ${error.message}`);
                        reject(`An error occured: ${error.message}`)
                    }
                    if (url) {
                        // We have a Stripe Checkout URL, let's redirect.
                        resolve()
                        window.location.assign(url);
                    }
                });
            }
        })
    })

}

// get_product_data()