import * as NetUtil from './net.ts';

const ctrlKeyObservers: Record<string, () => void> = {};

export function getObserveCtrlKeyCurrentPage() {
    return NetUtil.getAnchor();
}

export function observeCtrlKey(page: string | string[], key: string, observer: () => void): void {
    if (Object.keys(ctrlKeyObservers).length === 0) {
        window.onkeydown = (event: KeyboardEvent) => {
            if (event.ctrlKey) {
                let key = event.key + '@' + getObserveCtrlKeyCurrentPage();
                let observer = ctrlKeyObservers[key];
                if (observer) {
                    observer();
                    event.preventDefault();
                }
            }
        }
    }
    let pages = Array.isArray(page) ? page : [page];
    for (let p of pages) {
        ctrlKeyObservers[key.toLowerCase() + '@' + p] = observer;
    }
}

const opened: Record<string, Window> = {};
let openedIntervalId: any = null;

export function openUniquely(url: string): Window {
    if (openedIntervalId === null) {
        openedIntervalId = setInterval(() => {
            Object.keys(opened).forEach((url: string) => {
                let win = opened[url];
                if (win && win.closed) {
                    delete opened[url];
                }
            });
        }, 1000);
    }

    let win = opened[url];
    if (win && !win.closed) {
        win.focus();
        return win;
    }
    win = window.open(url);
    opened[url] = win;
    return win;
}

export function closeWindow(): Promise<any> {
    return new Promise((resolve, reject) => {
        if (window.opener) {
            window.close();
            resolve(window.opener);
        } else {
            reject();
        }
    });
}

export function copyToClipboard(text: string): Promise<void> {
    return new Promise(resolve => {
        if (navigator.clipboard) {
            navigator.clipboard.writeText(text).then(resolve).catch(error => {
                console.error(error);
            });
        } else {
            console.error('当前浏览器不支持 navigator.clipboard');
        }
    });
}

export function readFromClipboard(): Promise<string> {
    return new Promise(resolve => {
        if (navigator.clipboard) {
            navigator.clipboard.readText().then(resolve).catch(error => {
                console.error(error);
            });
        } else {
            console.error('当前浏览器不支持 navigator.clipboard');
        }
    });
}

