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

    // -------------- 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)
    }

    /** 
     * 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
    */
    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", "in", ["active","trialing"])));
            return snapshot.size > 0
        } catch (e) {
           // debugger
            throw new BookError("unable to tell if user has an active subscription")
        }
    }

    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.warn("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 {
            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 {
                return await this.getProperties(payload.key, payload.ids)
            }
        } else {
            log("calling paylay backend")
            const resp = await firebase.functions.getCallable("paylay")(payload)
            try {
                // it is possible that resp.data is a string (when calling run-oracle-script) or an object of type 
                // ServerStatus (which is usally the return type for any other call to paylay)
                // we use this try to attempt to parse the resp.data, if it fails then we know its a valid type alreayd and
                // we just return the value in the catch
                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
    }
    //------------------------------------------------------------------------------------------------------
}