import { Ecies } from "@toruslabs/eccrypto";
import BN from "bn.js";

export type GetOrSetNonceResult =
  | { typeOfUser: "v1"; nonce?: string }
  | { typeOfUser: "v2"; nonce?: string; pubNonce: { x: string; y: string }; ipfs?: string; upgraded: boolean };

export interface MetadataResponse {
  message: string;
}

export interface MetadataParams {
  namespace?: string;
  pub_key_X: string;
  pub_key_Y: string;
  set_data: {
    data: "getNonce" | "getOrSetNonce" | string;
    timestamp: string;
  };
  signature: string;
}

export interface MultifactorsCtorOptions {
  enableOneKey?: boolean;
  metadataHost?: string;
  serverTimeOffset?: number;
  network?: string;
  blsdkg?: {
    init: any;
    interpolate: (indexes: Uint8Array[], shares: Uint8Array[]) => Uint8Array;
    get_pk: (privKey: Uint8Array) => Uint8Array;
  };
}

export interface ShareResponse {
  ethAddress: string;
  privKey: string;
  metadataNonce: BN;
}

export interface VerifierLookupResponse {
  keys: { pub_key_X: string; pub_key_Y: string; key_index: string; address: string }[];
}

export interface ShareCommitmentParams {
  endpoints: string[];
  tokencommitment: string;
  temppubx: string;
  temppuby: string;
}

export interface CommitmentRequestResult {
  signature: string;
  data: string;
  nodepubx: string;
  nodepuby: string;
}

export interface KeyAssignCommitmentRequestResult {
  data: string;
  nodepubx: string;
  nodepuby: string;
  signature: string;
  verifierIdSignature: string;
}
export type MapNewVeririerIdCommitmentRequestResult = KeyAssignCommitmentRequestResult;

export interface SetCustomKeyOptions {
  privKeyHex?: string;
  metadataNonce?: BN;
  oraiKeyHex?: string;
  customKeyHex: BN;
}

export interface JRPCResponse<T> {
  id: number;
  jsonrpc: "2.0";
  result?: T;
  error?: {
    code: number;
    message: string;
    data?: unknown;
  };
}

export interface KeyLookupResult {
  keyResult: VerifierLookupResponse;
  errorResult: JRPCResponse<VerifierLookupResponse>["error"];
}

export interface SignerResponse {
  "orai-timestamp": string;
  "orai-nonce": string;
  "orai-signature": string;
}

export interface KeyAssignment {
  PublicKey: string;
  Share: string;
  Metadata: {
    [key in keyof Ecies]: string;
  };
}

export interface ShareRequestParams {
  endpoints: string[];
  typeOfLogin: string;
  verifierParams: VerifierParams;
  nodesignatures: CommitmentRequestResult[];
  idtoken: string;
  extraParams?: Record<string, unknown>;
}
export type ShareRequestResponse = KeyAssignment;

export interface RetrieveSharesParams {
  typeOfLogin: string;
  endpoints: string[];
  verifierParams: VerifierParams;
  idToken: string;
  extraParams?: Record<string, unknown>;
}

export interface PrivateKeyResponse {
  privKey: string;
}

export interface VerifierParams {
  [key: string]: unknown;
  verifier_id: string;
  verifier: string;
}

export interface RetrieveSharesResponse {
  sharesIndexes: Buffer[];
  shares: Buffer[];
  thresholdPublicKey: string;
}
