import { State } from '../proxy/proxyHistory';
import { APPStAtUSCNKEYS, IAppStatusCN } from '../typings';

type Tfunction = (...arg:unknown[])=>unknown;

export function isString (value:unknown):value is string {
    return typeof value === 'string';
}

export function isNumber (value:unknown):value is number {
    return typeof value === 'number';
}

export function isBoolean (value:unknown):value is boolean {
    return typeof value === 'boolean';
}

export function isFunction (value:unknown):value is Tfunction {
    return value instanceof Function;
}

export function isObject (value:unknown): value is ObjectConstructor {
    return value instanceof Object;
}

export function isURL (value:unknown): value is URL {
    return value instanceof URL;
}

/**
 * 是否是子应用的state
 * @param value 
 * @returns 
 */
export function isMustardState (value: unknown):value is State {
    return (value as State)?.isMustard === 'MustardApp';
}

/**
 * 是否是生命周期的key
 * @param value 
 * @returns 
 */
export function isIAppStatusKey (value: unknown):value is IAppStatusCN {
    return APPStAtUSCNKEYS.includes(value as IAppStatusCN);
}

/**
 * 是否是远程类型资源
 * @param dom 
 * @returns boolean
 */
export function isRemotezElement (dom: Element):dom is HTMLImageElement|HTMLVideoElement|HTMLAudioElement|HTMLSourceElement {
    return dom instanceof HTMLImageElement || dom instanceof HTMLVideoElement || dom instanceof HTMLAudioElement || dom instanceof HTMLSourceElement;
}

/**
 * 是否是相对地址
 * @param src    
 * @returns boolean
 */
export function isRelativePath (src: string = '') {
    return /^(\.){0,2}\//.test(src);
}