import { SessionReference, Session, SessionSignature, SessionSignatureMetadata, SessionDocument, SessionDocumentSignature, SessionDocumentMetadata } from '@ekisa-xsighub/core';

interface SdkQr {
    generate(pairingKey: string): Promise<string>;
    generatex(pairingKey: string): Promise<string>;
}

type SdkClientConfig = {
    api: string;
    version: string;
};

type ReferenceCreate = Omit<SessionReference, 'id' | 'signatures'>;
type ReferenceUpdate = Partial<ReferenceCreate>;
interface SdkReferences {
    create(data: ReferenceCreate): Promise<SessionReference>;
    update(referenceId: number, data: ReferenceUpdate): Promise<SessionReference>;
    delete(referenceId: number): Promise<SessionReference>;
}

interface SdkSessions {
    create(): Promise<Session>;
    findByIpAddress(): Promise<Session>;
    findByPairingKey(pairingKey: string): Promise<Session>;
    pair(pairingKey: string): Promise<Session>;
    unpair(pairingKey: string): Promise<Session>;
    destroy(pairingKey: string): Promise<Session>;
}

type SignatureCreate = Omit<SessionSignature, 'id'>;
interface SdkSignatures {
    create(data: SignatureCreate): Promise<SessionSignature>;
    findById(signatureId: number): Promise<SessionSignature>;
    update(signatureId: number, data: SessionSignature): Promise<SessionSignature>;
    loadMetadata(documentId: number, data: SessionSignatureMetadata): Promise<SessionSignature>;
    delete(signatureId: number): Promise<SessionSignature>;
}

type DocumentCreate = Omit<SessionDocument, 'id'>;
interface SdkDocuments {
    create(data: DocumentCreate): Promise<SessionDocument>;
    findById(documentId: number): Promise<SessionDocument>;
    update(signatureId: number, data: SessionDocument): Promise<SessionDocument>;
    attach(documentId: number, data: SessionDocumentSignature): Promise<SessionDocument>;
    delete(signatureId: number): Promise<SessionDocument>;
    loadMetadata(documentId: number, data: SessionDocumentMetadata): Promise<SessionDocument>;
    populateMetadata(rawContent: string, data: SessionDocumentMetadata): string;
    extractSignatures(rawContent: string): {
        [key: string]: string;
    };
}

interface SdkClient {
    init: (config: SdkClientConfig) => SdkClient;
    sessions: SdkSessions;
    references: SdkReferences;
    signatures: SdkSignatures;
    documents: SdkDocuments;
    qr: SdkQr;
}
declare const client: SdkClient;

export { SdkClient, client };
