/*
 * Copyright (c) 2022.
 * Author Peter Placzek (tada5hi)
 * For the full copyright and license information,
 * view the LICENSE file that was distributed with this source code.
 */

import {Context} from "@nuxt/types";
import {Inject} from "@nuxt/types/app";

import BaseStorage from "~/modules/storage";
import AuthStorage from "~/modules/auth/storage";
import AppStorage from "~/modules/app/storage";

declare module 'vue/types/vue' {
    // this.$myInjectedFunction inside Vue components
    interface Vue {
        $warehouse: BaseStorage,
        $authWarehouse: BaseStorage
    }
}

declare module '@nuxt/types' {
    // nuxtContext.app.$myInjectedFunction inside asyncData, fetch, plugins, middleware, nuxtServerInit
    interface NuxtAppOptions {
        $warehouse: BaseStorage,
        $authWarehouse: BaseStorage
    }
    // nuxtContext.$myInjectedFunction
    interface Context {
        $warehouse: BaseStorage,
        $authWarehouse: BaseStorage
    }
}

declare module 'vuex/types/index' {
    // this.$myInjectedFunction inside Vuex stores

    interface Store<S> {
        $warehouse: BaseStorage,
        $authWarehouse: BaseStorage
    }
}

export default (ctx : Context, inject : Inject) => {
    const appWarehouse = new AppStorage(ctx);
    inject('warehouse', appWarehouse);

    //--------------------------------------------------------------------

    const authWarehouse = new AuthStorage(ctx);
    inject('authWarehouse', authWarehouse);
};

