class PaylayClient {
    url = PRODUCTION_MODE
        ? "not supported"
        : "http://127.0.0.1:5001/prime-micron-374215/us-central1/paylay"

    /** 
     * Lets us know that the user has paid to use the product.
     * if it is false, we should not expect things like saving 
     * data to the backend to work. We should not any sort of
     * paylay service to run, because the service has not been 
     * paid for yet
    */

    // -------------- COLLECTION NAMES ------------------
    static customerCollectionName = "customers"
    static propertiesCollectionName = "properties"
    static subscriptionsCollectionName = "subscriptions"
    // --------------------------------------------------

    /**
     * **Do not call the constructor directly**
     */
    constructor(validEntryPoint = false) {
        if (!validEntryPoint) {
            throw new BookError("You cannot create a paylay client directly, you should use the static init method")
        }
    }

    /**
     * Creates the correct PaylayClient based on the status of the user. You should create
     * a new PaylayClient everytime you need it (so we can check for a valid user). In other words,
     * **DO NOT** create an instance of PaylayClient and use it globablly. 
     * @returns {Promise<PaylayClient|DummyPaylayClient>} returns either the real PaylayClient (for users 
     * who have an active subscription, or DummyPaylayClient for users who do not have an active account. 
     * When this happens, calls to backend services will not happen, and storage will remain local)
     */
    static async init() {
        const user = await getUser(false);
        if (!user) { return new DummyPaylayClient() } // the paylay client will be undefinded... maybe display warning to user
        const isActive = await PaylayClient.userHasActiveSubscription(user)
        if (!isActive) { return new DummyPaylayClient() }
        return new PaylayClient(true)
    }

    static async userHasActiveSubscription(user) {
        try {
            const { db, collection, query, getDocs, where } = firebase.firestore
            const subscriptions_ref = collection(db, PaylayClient.customerCollectionName, user.uid, PaylayClient.subscriptionsCollectionName)
            const snapshot = await getDocs(query(subscriptions_ref, where("status", "==", "active")));
            return snapshot.size > 0
        } catch (e) {
            throw new BookError("unable to tell if user has an active subscription")
        }
    }

    // async callPaylay(data) {
    //     try {
    //         const resp = await fetch(this.url,
    //             {
    //                 method: "POST",
    //                 mode: "cors",
    //                 headers: {
    //                     "Content-Type": "application/json",
    //                 },
    //                 body: JSON.stringify(data), // body data type must match "Content-Type" header
    //             })
    //         return await resp.json()
    //     } catch (e) {
    //         // TODO: handle errors
    //         throw e
    //     }

    // }

    oracleConnection(username, password, url) {
        return {
            username,
            password,
            url,
            type: "oracle"
        }
    }
    /**
     * Saves a connection details to firestore
     */
    async saveConnection(connection_name, connection_details) {
        await this.setProperty({ id: connection_name, value: connection_details })
    }
    /**
     * gets the connection from firestore
     * @param {string} connection_name the name of the connection
     * @returns 
     */
    async getConnection(connection_name) {
        return await this.getProperty(connection_name)
    }
    /**
     * sets property params for a user. 
     * Will throw if property values are to large to store in a firestore feild.
     * @param {string} document_name the namespace for the stored properties, used for ogranizational reasons, to prevent key cullisions
     * @param {{[string]: any}} property_params 
     */
    async setProperty(document_name, property_params) {
        const { setDoc, db, doc } = firebase.firestore
        const user = await getUser(false) // get the user, but dont prompt for sign in if there is no user
        if (user) {
            try {
                const doc_ref = doc(db, PaylayClient.customerCollectionName, user.uid, PaylayClient.propertiesCollectionName, document_name)
                await setDoc(doc_ref, property_params, { merge: true })
                return { status: "success" }
            } catch (e) {
                return e // todo real error handling, probs do not want to show the user errors from firebase
            }
        } else {
            console.log("no user")
        }
    }
    /**
     * sets array of properties
     * Will throw if property values are to large to store in a firestore feild.
     * @param {string} document_name 
     * @param {[{id: string, value: any}]} properties 
     */
    async setProperties(document_name, properties) {
        const prop = {}
        for (const property of properties) {
            prop[property.id] = property
        }
        return await this.setProperty(document_name, prop)
    }
    /**
     * gets array of properties
     * Returns undefined if there was a problem
     * @param {string[]} ids 
     */
    async getProperties(namespace, ids) {
        const { getDoc, db, doc } = firebase.firestore
        const user = await getUser(false) // get the user, but dont prompt for sign in if there is no user
        if (user) {
            try {
                const doc_ref = doc(db, PaylayClient.customerCollectionName, user.uid, PaylayClient.propertiesCollectionName, namespace)
                const docSnap = await getDoc(doc_ref);
                if (docSnap.exists()) {
                    const data = docSnap.data()
                    if (ids?.length > 0) {
                        return ids.filter(key => key in data).reduce((subset, key) => (subset[key] = data[key]), {})
                    } else {
                        return data
                    }
                } else {
                    return undefined
                }
            } catch (e) {
                console.error(e);
                return undefined
            }
        } else {
            console.log("no user")
        }
    }
    /**
    * gets property for a user
    * @param {string} id 
    */
    async getProperty(namespace, id) {
        return this.getProperties(namespace)[id]
    }

    /**
     * Converts given data to JSON string. Then checks if the byte size is small enough for firestore to handle.
     * Throws `DataToLargeForFirestore` when byte size is to large
     * @param data 
     * @returns string
     */
    firestoreStringify(data) {
        const str = JSON.stringify(data)
        const size = byteSize(str)
        if (size > 1_048_487) {
            throw new DataToLargeForFirestore(size)
        }
        return str
    }

    async server_post(payload) {
        if (payload.mode === "property") {
            if (payload.action === "set") {
                return await this.setProperties(payload.key, payload.dataArray)
            } else {// must be get
                return await this.getProperties(payload.key, payload.ids)
            }
        } else {
            console.log("calling paylay backend")
            const resp = await firebase.functions.getCallable("paylay")(payload)
            try{
                // TODO: track down why this sometimes returns an object, sometimes a string
                const data = JSON.parse(resp.data)
                return data
            }catch(e){
                return resp.data
            }
        }
    }
}

class DummyPaylayClient extends PaylayClient {
    msg = "User has not paid for service. Service is unavaliable."
    /** dummy message that always says the status of the request was "success" */
    returnMessage = { status: "failure", message: this.msg } 

    constructor() {
        super(true)
    }

    // ----------------- Explicitly override the parent methods so that nothing will happen ---------------
    server_post() {
        console.warn("DummyPaylayClient: did not make server post")
        return this.returnMessage
    }

    getProperties() {
        console.warn("DummyPaylayClient: did not getProperties")
        return this.returnMessage
    }
    getProperty() {
        console.warn("DummyPaylayClient: did not getProperty")
        return this.returnMessage
    }
    setProperties() {
        console.warn("DummyPaylayClient: did not setProperties")
        return this.setProperty()
    }
    setProperty() {
        console.warn("DummyPaylayClient: did not setProperty")
        return this.returnMessage
    }
    callPaylay() {
        console.warn("DummyPaylayClient: did not callPaylay")
        return this.returnMessage
    }
    //------------------------------------------------------------------------------------------------------
}