import { CharacterDetail } from '../models/enka/CharacterDetail';
import { EnkaAccount } from '../models/enka/EnkaAccount';
import { GenshinAccount } from '../models/enka/GenshinAccount';
import { PlayerDetail } from '../models/enka/PlayerDetail';
import { APIEnkaStatus } from '../types/enkaNetwork';
import { PromiseEventEmitter } from '../utils/PromiseEventEmitter';
/**
 * cached EnkaData type
 */
export interface EnkaData {
    /**
     * UID
     */
    readonly uid: number;
    /**
     * Player detail
     */
    readonly playerDetail: PlayerDetail;
    /**
     * Character details
     */
    readonly characterDetails: CharacterDetail[];
    /**
     * UID owner Enka Account
     */
    readonly owner?: EnkaAccount;
    /**
     * NextShowCaseDate
     */
    readonly nextShowCaseDate: Date;
    /**
     * EnkaNetwork URL
     */
    readonly url: string;
}
/**
 * EnkaManager events
 * @see {@link EnkaManager}
 */
export declare enum EnkaManagerEvents {
    /**
     * When new data is added to the cache, fires
     * @event GET_NEW_ENKA_DATA
     * @listener
     * | param | type | description |
     * | --- | --- | --- |
     * | data | {@link EnkaData} | New data added to the cache |
     */
    GET_NEW_ENKA_DATA = "GET_NEW_ENKA_DATA"
}
interface EnkaManagerEventMap {
    GET_NEW_ENKA_DATA: [data: EnkaData];
}
/**
 * Class for fetching EnkaData from enka.network
 */
export declare class EnkaManager extends PromiseEventEmitter<EnkaManagerEventMap, EnkaManagerEvents> {
    /**
     * URL of enka.network
     */
    private static readonly ENKA_BASE_URL;
    /**
     * URL of status.enka.network
     */
    private static readonly ENKA_STATUS_BASE_URL;
    /**
     * Default fetch option
     */
    private static readonly defaultFetchOption;
    /**
     * Cache of EnkaData
     * @key UID
     * @value Cached EnkaData
     */
    private readonly cache;
    /**
     * Create a EnkaManager
     */
    constructor();
    /**
     * Fetch All from enka.network
     * @description The data fetched by this method is stored as a temporary cache.
     *    The storage period depends on ttl.
     * @param uid UID
     * @param fetchOption Fetch option
     * @returns EnkaData
     */
    fetchAll(uid: number, fetchOption?: RequestInit): Promise<EnkaData>;
    /**
     * Fetch PlayerDetail from enka.network
     * @description The data fetched by this method is stored as a temporary cache.
     *    The storage period depends on ttl.
     * @param uid UID
     * @param fetchOption Fetch option
     * @returns PlayerDetail
     */
    fetchPlayerDetail(uid: number, fetchOption?: RequestInit): Promise<PlayerDetail>;
    /**
     * Clear cache over nextShowCaseDate
     */
    clearCacheOverNextShowCaseDate(): void;
    /**
     * Fetch EnkaAccount from enka.network
     * @description Data fetched by this method is not stored as a temporary cache.
     * @param username Enka Account Username
     * @param fetchOption Fetch option
     * @returns EnkaAccount
     */
    fetchEnkaAccount(username: string, fetchOption?: RequestInit): Promise<EnkaAccount>;
    /**
     * Fetch GenshinAccounts from enka.network
     * @description Data fetched by this method is not stored as a temporary cache.
     * @param username Enka Account Username
     * @param fetchOption Fetch option
     * @returns GenshinAccounts
     */
    fetchGenshinAccounts(username: string, fetchOption?: RequestInit): Promise<GenshinAccount[]>;
    /**
     * Fetch Status from 1 hour ago to now
     * @param fetchOption Fetch option
     * @returns Status from 1 hour ago to now
     */
    fetchAllStatus(fetchOption?: RequestInit): Promise<{
        [dateText: string]: APIEnkaStatus;
    }>;
    /**
     * Fetch now Status
     * @param fetchOption Fetch option
     * @returns Now status
     */
    fetchNowStatus(fetchOption?: RequestInit): Promise<APIEnkaStatus>;
    /**
     * Fetch UIDEndPoint from URL
     * @param uid UID
     * @param url URL
     * @param fetchOption Fetch option
     * @returns EnkaData
     */
    private fetchUID;
}
export {};
