/**
 * W3C DID Core 1.0 and AGNTCY extension types for SentryAgent.ai AgentIdP.
 * All interfaces are strictly typed — no `any` usage.
 */

/** A W3C DID Core 1.0 verification method. */
export interface IVerificationMethod {
  id: string;
  type: string;
  controller: string;
  publicKeyJwk: IPublicKeyJwk;
}

/** JWK representation of a public key. */
export interface IPublicKeyJwk {
  kty: string;
  crv?: string;
  x?: string;
  y?: string;
  /** RSA modulus (base64url). */
  n?: string;
  /** RSA public exponent (base64url). */
  e?: string;
  use?: string;
  kid?: string;
}

/** A W3C DID Document service endpoint. */
export interface IDIDService {
  id: string;
  type: string;
  serviceEndpoint: string;
}

/** W3C DID Core 1.0 DID Document. */
export interface IDIDDocument {
  '@context': string[];
  id: string;
  controller: string;
  verificationMethod: IVerificationMethod[];
  authentication: string[];
  assertionMethod?: string[];
  service?: IDIDService[];
  agntcy?: IAgntcyExtension;
}

/** AGNTCY extension fields on a per-agent DID Document. */
export interface IAgntcyExtension {
  agentId: string;
  agentType: string;
  capabilities: string[];
  deploymentEnv: string;
  owner: string;
  version: string;
}

/** W3C DID Resolution result format. */
export interface IDIDResolutionResult {
  didDocument: IDIDDocument;
  didDocumentMetadata: {
    created: string;
    updated: string;
    deactivated: boolean;
  };
  didResolutionMetadata: {
    contentType: string;
    retrieved: string;
  };
}

/** AGNTCY-format agent card. */
export interface IAgentCard {
  did: string;
  name: string;
  agentType: string;
  capabilities: string[];
  owner: string;
  version: string;
  deploymentEnv: string;
  identityProvider: string;
  issuedAt: string;
}

/** Raw database row for agent_did_keys. */
export interface IAgentDIDKeyRow {
  keyId: string;
  agentId: string;
  organizationId: string;
  publicKeyJwk: IPublicKeyJwk;
  vaultKeyPath: string;
  keyType: string;
  curve: string;
  createdAt: Date;
  rotatedAt: Date | null;
}
