

const require_CredoError = require('../../../error/CredoError.js');
require('../../../error/index.js');
const require_MessageValidator = require('../../../utils/MessageValidator.js');
const require_JsonTransformer = require('../../../utils/JsonTransformer.js');
require('../../../utils/index.js');
const require_ClaimFormat = require('../models/ClaimFormat.js');
const require_W3cV2Credential = require('../models/credential/W3cV2Credential.js');
const require_W3cV2SdJwt = require('./W3cV2SdJwt.js');

//#region src/modules/vc/sd-jwt-vc/W3cV2SdJwtVerifiableCredential.ts
/**
* Represents a Verifiable Credential encoded as a SD-JWT.
*
* @see https://www.w3.org/TR/vc-jose-cose/#securing-with-sd-jwt
*/
var W3cV2SdJwtVerifiableCredential = class W3cV2SdJwtVerifiableCredential {
	constructor(options) {
		this.sdJwt = options.sdJwt;
		this.resolvedCredential = require_JsonTransformer.JsonTransformer.fromJSON(options.sdJwt.prettyClaims, require_W3cV2Credential.W3cV2Credential, { validate: false });
		this.validate();
	}
	static fromCompact(compact) {
		return new W3cV2SdJwtVerifiableCredential({ sdJwt: require_W3cV2SdJwt.decodeSdJwt(compact, require_ClaimFormat.ClaimFormat.SdJwtW3cVc) });
	}
	/**
	* The encoded version of this credential.
	*/
	get encoded() {
		return this.sdJwt.compact;
	}
	/**
	* The {@link ClaimFormat} of the credential.
	*
	* For W3C VC SD-JWT credentials this is always `vc+sd-jwt`.
	*/
	get claimFormat() {
		return require_ClaimFormat.ClaimFormat.SdJwtW3cVc;
	}
	/**
	* Validates the SD-JWT and the resolved credential.
	*/
	validate() {
		require_MessageValidator.MessageValidator.validateSync(this.resolvedCredential);
		const sdJwt = this.sdJwt;
		const header = sdJwt.header;
		const payload = sdJwt.prettyClaims;
		if ("typ" in header && header.typ !== "vc+sd-jwt") throw new require_CredoError.CredoError(`The provided W3C VC SD-JWT does not have the correct 'typ' header.`);
		if ("cyt" in header && header.cyt !== "vc") throw new require_CredoError.CredoError(`The provided W3C VC SD-JWT does not have the correct 'cyt' header.`);
		const iss = header.iss ?? payload.iss;
		if (iss) {
			if (this.resolvedCredential.issuerId !== iss) throw new require_CredoError.CredoError(`The provided W3C VC SD-JWT has both 'iss' and 'issuer' claims, but they differ.`);
		}
		if (payload.jti) {
			if (this.resolvedCredential.id && this.resolvedCredential.id !== payload.jti) throw new require_CredoError.CredoError(`The provided W3C VC JWT has both 'jti' and 'id' claims, but they differ.`);
		}
		if (payload.sub) {
			if (!this.resolvedCredential.credentialSubjectIds.includes(payload.sub)) throw new require_CredoError.CredoError(`The provided W3C VC SD-JWT has a 'sub' claim, but it does not match any credentialSubject.`);
		}
	}
};

//#endregion
exports.W3cV2SdJwtVerifiableCredential = W3cV2SdJwtVerifiableCredential;