/*
 * SPDX-FileCopyrightText: syuilo and misskey-project
 * SPDX-License-Identifier: AGPL-3.0-only
 */

declare module '@peertube/http-signature' {
	import type { IncomingMessage, ClientRequest } from 'node:http';

	interface ISignature {
		keyId: string;
		algorithm: string;
		headers: string[];
		signature: string;
	}

	interface IOptions {
		headers?: string[];
		algorithm?: string;
		strict?: boolean;
		authorizationHeaderName?: string;
	}

	interface IParseRequestOptions extends IOptions {
		clockSkew?: number;
	}

	interface IParsedSignature {
		scheme: string;
		params: ISignature;
		signingString: string;
		algorithm: string;
		keyId: string;
	}

	type RequestSignerConstructorOptions =
		IRequestSignerConstructorOptionsFromProperties |
		IRequestSignerConstructorOptionsFromFunction;

	interface IRequestSignerConstructorOptionsFromProperties {
		keyId: string;
		key: string | Buffer;
		algorithm?: string;
	}

	interface IRequestSignerConstructorOptionsFromFunction {
		sign?: (data: string, cb: (err: any, sig: ISignature) => void) => void;
	}

	class RequestSigner {
		constructor(options: RequestSignerConstructorOptions);

		public writeHeader(header: string, value: string): string;

		public writeDateHeader(): string;

		public writeTarget(method: string, path: string): void;

		public sign(cb: (err: any, authz: string) => void): void;
	}

	interface ISignRequestOptions extends IOptions {
		keyId: string;
		key: string;
		httpVersion?: string;
	}

	export function parse(request: IncomingMessage, options?: IParseRequestOptions): IParsedSignature;
	export function parseRequest(request: IncomingMessage, options?: IParseRequestOptions): IParsedSignature;

	export function sign(request: ClientRequest, options: ISignRequestOptions): boolean;
	export function signRequest(request: ClientRequest, options: ISignRequestOptions): boolean;
	export function createSigner(): RequestSigner;
	export function isSigner(obj: any): obj is RequestSigner;

	export function sshKeyToPEM(key: string): string;
	export function sshKeyFingerprint(key: string): string;
	export function pemToRsaSSHKey(pem: string, comment: string): string;

	export function verify(parsedSignature: IParsedSignature, pubkey: string | Buffer): boolean;
	export function verifySignature(parsedSignature: IParsedSignature, pubkey: string | Buffer): boolean;
	export function verifyHMAC(parsedSignature: IParsedSignature, secret: string): boolean;
}
