import { writable } from "svelte/store";
import { accountData, assetEndpoint, genSessionKey, type Account, type Credentials } from "./api";

const CREDENTIALS_KEY = 'v0:credentials'

let _credentials: Credentials | null = null
export const credentials = writable<Credentials | null>()
credentials.subscribe((value) => {
    if (value != null) {
        _credentials = value;
        localStorage.setItem( CREDENTIALS_KEY, JSON.stringify(value))
    } else {
        _credentials = null;
    }
})

export const account = writable<Account | null>()
export const session_key = writable<string | null>()
export const asset_endpoint = writable<string | null>()

export async function initializeStores() {
    let rawCredentials = localStorage.getItem(CREDENTIALS_KEY)
    let parsedCredentials
    if (rawCredentials != null && rawCredentials.length > 0) {
        try {
            parsedCredentials = JSON.parse(rawCredentials)
            credentials.set(parsedCredentials)
        }
        catch (e) { localStorage.removeItem(CREDENTIALS_KEY) }
    }

    if (parsedCredentials != null) {
        let data = await accountData(parsedCredentials)
        if ('error' in data) {
            credentials.set(null)
            localStorage.removeItem(CREDENTIALS_KEY)
        } else {
            account.set(data)
        }

        let key_result = await genSessionKey(parsedCredentials)
        if ('error' in key_result) {
            console.warn('Couldn\'t generate a session key!')
        } else {
            session_key.set(key_result.session_key)
        }

        let asset_result = await assetEndpoint()
        asset_endpoint.set(asset_result)
    }
}

export async function refreshAccount() {
    if (_credentials == null) {
        console.warn("Requested to refresh the user account but credentials are null.")
        return;
    }

    let refreshedAccount = await accountData(_credentials)
    if ('error' in refreshedAccount) {
        console.warn("Failed to refresh the user account.")
        return;
    }

    account.set(refreshedAccount)
}