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 () => {
                        // try to save the values on the wizard page
                        try{save_wizard_choices()}catch(e){/*nothing to do on catch*/}

                        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")
        log(payload)
        const data = {
            mode: "check-oracle-connection",
            payload: { sql: "select * from canvas.work", ...payload },
        }
        log(await client.callPaylay(data))
    }

    const saveConnection = ui_btn("save conection")
    saveConnection.onclick = async () => {
        const client = await PaylayClient.init()
        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"))
        log("--->", data)

    }
    const getConnection = ui_btn("get conection")
    getConnection.onclick = async () => {
        const client = await PaylayClient.init()
        log("before")
        const data = await client.getConnection("sql_book_connection")
        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 {
                log(JSON.parse(x))
            } catch (e) {
                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()