import { FieldId, FieldIddArray, FieldMap, FieldTupleArray, FieldValue, Id, KeyAny, TR } from "../types";
import { CacheInvalidatorResult } from "../invalidator";
import { CacheOptExpiryMode, CacheOptExpiryUnit, CacheOptExpiryUnitTuple, CacheResultBoolean, CacheResultGetExpiry, CacheResultNumber, CacheResultPersist, CacheResultSetExpiry } from "../command";
import { InitLike, ShiftMain, ShiftSecureFlat } from "../secure";
import { ExpiryMode } from "../literal";
export interface CacheHash<A extends TR, N extends Id> extends ShiftSecureFlat<CacheHashSecure<A, N>, CacheHashDef> {
    getValue(key: KeyAny, field: FieldId<A>): Promise<CacheInvalidatorResult<A, string>>;
    getMore(key: KeyAny, fields: FieldIddArray<A>): Promise<CacheInvalidatorResult<A, Record<string, string>>>;
    getAll(key: KeyAny): Promise<CacheInvalidatorResult<A, Record<string, string>>>;
    setValue(key: KeyAny, field: FieldId<A>, value: FieldValue<A>): Promise<CacheInvalidatorResult<A, CacheResultNumber>>;
    setValuesMore(key: KeyAny, doc: Partial<A>): Promise<CacheInvalidatorResult<A, CacheResultNumber>>;
    setValuesMore(key: KeyAny, map: FieldMap<A>): Promise<CacheInvalidatorResult<A, CacheResultNumber>>;
    setValuesMore(key: KeyAny, tuples: FieldTupleArray<A>): Promise<CacheInvalidatorResult<A, CacheResultNumber>>;
    delete(key: KeyAny, fields: FieldIddArray<A>): Promise<CacheInvalidatorResult<A, CacheResultNumber>>;
    exists(key: KeyAny, field: FieldId<A>): Promise<CacheInvalidatorResult<A, CacheResultBoolean>>;
    existMore(key: KeyAny, fields: FieldIddArray<A>): Promise<CacheInvalidatorResult<A, Array<CacheResultBoolean>>>;
    setTtl(key: KeyAny, fields: FieldIddArray<A>, opt?: CmdHashSetTtl): Promise<CacheInvalidatorResult<A, Record<string, CacheResultSetExpiry>>>;
    setTimestamp(key: KeyAny, fields: FieldIddArray<A>, opt?: CmdHashSetTimestamp): Promise<CacheInvalidatorResult<A, Record<string, CacheResultSetExpiry>>>;
    getTimestamp(key: KeyAny, fields: FieldIddArray<A>, opt?: CmdHashGetTimestamp): Promise<CacheInvalidatorResult<A, Record<string, CacheResultGetExpiry>>>;
    getTtl(key: KeyAny, fields: FieldIddArray<A>, opt?: CmdHashGetTtl): Promise<CacheInvalidatorResult<A, Record<string, CacheResultGetExpiry>>>;
    persist(key: KeyAny, fields: FieldIddArray<A>): Promise<CacheInvalidatorResult<A, Record<string, CacheResultPersist>>>;
    listFields(key: KeyAny): Promise<CacheInvalidatorResult<A, FieldIddArray<A>>>;
    getLength(key: KeyAny): Promise<CacheInvalidatorResult<A, CacheResultNumber>>;
}
export interface CacheHashSecure<A extends TR, N extends Id> extends ShiftMain<CacheHash<A, N>>, InitLike {
    $set(key: string, record: Record<string, string>): Promise<number>;
    $delete(key: string, fields: Array<string>): Promise<number>;
    $getOne(key: string, field: string): Promise<string>;
    $get(key: string, fields: Array<string>): Promise<Array<string>>;
    $getAll(key: string): Promise<Record<string, string>>;
    $exists(key: string, field: string): Promise<boolean>;
    $existsMore(key: string, fields: Array<string>): Promise<Record<string, boolean>>;
    $getTtl(key: string, fields: Array<string>): Promise<Array<CacheResultGetExpiry>>;
    $setTtl(key: string, fields: Array<string>, milliseconds: number, mode?: ExpiryMode): Promise<Array<CacheResultSetExpiry>>;
    $getTimestamp(key: string, fields: Array<string>): Promise<Array<CacheResultGetExpiry>>;
    $setTimestamp(key: string, fields: Array<string>, milliseconds: number, mode?: ExpiryMode): Promise<Array<CacheResultSetExpiry>>;
    $persist(key: string, fields: Array<string>): Promise<Array<CacheResultPersist>>;
    $fields(key: string): Promise<Array<string>>;
    $length(key: string): Promise<number>;
}
export type CacheHashDef = CacheHash<TR, Id>;
export type CacheFieldValue<A extends TR> = A[keyof A] | string | number;
/**
 * Expire command options
 *
 * @see CacheOptExpiryUnitTuple
 * @see CacheOptExpiryMode
 * */
export type CmdHashSetTtl = CacheOptExpiryUnitTuple & CacheOptExpiryMode;
/**
 * Expire at command options
 *
 * @see CacheOptExpiryUnitTuple
 * @see CacheOptExpiryMode
 * */
export type CmdHashSetTimestamp = CacheOptExpiryUnitTuple & CacheOptExpiryMode;
/**
 * Get ttl (remaining time) command options
 *
 * @see CacheOptExpiryUnit
 * */
export type CmdHashGetTtl = CacheOptExpiryUnit;
/**
 * Get expire time (timestamp) command options
 *
 * @see CacheOptExpiryUnit
 * */
export type CmdHashGetTimestamp = CacheOptExpiryUnit;
