class TranslateService {
    constructor() {
        this._cache = {}
    }

    check_cache(...keys) {
        const obj = {}
        for ( const key of keys ) {
            if ( this._cache[key] )
                obj[key] = this._cache[key]
            else return false
        }

        return obj
    }

    async resolve(key) {
        const cache_hit = this.check_cache(key)
        if ( cache_hit ) return cache_hit[key]
        const result = await axios.get('/api/v1/locale/resolve/'+key)
        if ( result && result.data && result.data.data ) {
            this._cache[key] = result.data.data
            return result.data.data
        }
    }

    async load_module(key) {
        const result = await axios.get('/api/v1/locale/module/'+key)
        if ( result && result.data && result.data.data ) {
            for ( const key in result.data.data ) {
                if ( !this._cache[key] ) this._cache[key] = result.data.data[key]
            }
            return result.data.data
        }
    }

    async batch_resolve(...keys) {
        const cache_hit = this.check_cache(...keys)
        if ( cache_hit ) return cache_hit
        const result = await axios.post('/api/v1/locale/batch', { resolvers: keys })
        if ( result && result.data && result.data.data ) {
            for ( const key in result.data.data ) {
                if ( !this._cache[key] ) this._cache[key] = result.data.data[key]
            }
            return result.data.data
        }
    }
}

const translate_service = new TranslateService()

const T = (...keys) => {
    if ( keys.length === 1 ) return translate_service.resolve(keys[0])
    else return translate_service.batch_resolve(...keys)
}

window.T = T

export { translate_service, T }
