

import { CredoError } from "../../../../error/CredoError.mjs";
import "../../../../error/index.mjs";
import { __decorateMetadata } from "../../../../_virtual/_@oxc-project_runtime@0.94.0/helpers/decorateMetadata.mjs";
import { __decorate } from "../../../../_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.mjs";
import { CREDENTIALS_CONTEXT_V2_URL, ENVELOPED_VERIFIABLE_CREDENTIAL_TYPE, ENVELOPED_VERIFIABLE_PRESENTATION_TYPE } from "../../constants.mjs";
import { IsCredentialJsonLdContext } from "../../validators.mjs";
import "./W3cV2Presentation.mjs";
import { W3cV2JwtVerifiablePresentation } from "../../jwt-vc/W3cV2JwtVerifiablePresentation.mjs";
import { W3cV2SdJwtVerifiablePresentation } from "../../sd-jwt-vc/W3cV2SdJwtVerifiablePresentation.mjs";
import "../../sd-jwt-vc/index.mjs";
import "../../jwt-vc/index.mjs";
import { Exclude, Expose } from "class-transformer";
import { IsDataURI, ValidateBy, buildMessage } from "class-validator";

//#region src/modules/vc/models/presentation/W3cV2EnvelopedVerifiablePresentation.ts
var W3cV2EnvelopedVerifiablePresentation = class W3cV2EnvelopedVerifiablePresentation {
	constructor(options) {
		if (options) {
			this.context = options.context ?? CREDENTIALS_CONTEXT_V2_URL;
			this.id = options.id;
			this.type = options.type ?? ENVELOPED_VERIFIABLE_CREDENTIAL_TYPE;
			this._envelopedPresentation = presentationFromDataUri(options.id);
		}
	}
	static fromVerifiablePresentation(presentation) {
		return new W3cV2EnvelopedVerifiablePresentation({
			id: presentationToDataUri(presentation),
			context: CREDENTIALS_CONTEXT_V2_URL,
			type: ENVELOPED_VERIFIABLE_PRESENTATION_TYPE
		});
	}
	/**
	* Gets the enveloped presentation.
	*/
	get envelopedPresentation() {
		if (!this._envelopedPresentation) this._envelopedPresentation = presentationFromDataUri(this.id);
		return this._envelopedPresentation;
	}
	/**
	* Resolved presentation is the fully resolved {@link W3cV2Presentation} instance.
	*/
	get resolvedPresentation() {
		return this.envelopedPresentation.resolvedPresentation;
	}
	/**
	* The {@link ClaimFormat} of the enveloped presentation.
	*/
	get claimFormat() {
		return this.envelopedPresentation.claimFormat;
	}
};
__decorate([Exclude(), __decorateMetadata("design:type", Object)], W3cV2EnvelopedVerifiablePresentation.prototype, "_envelopedPresentation", void 0);
__decorate([
	Expose({ name: "@context" }),
	IsCredentialJsonLdContext({
		allowString: true,
		credentialContext: CREDENTIALS_CONTEXT_V2_URL
	}),
	__decorateMetadata("design:type", Object)
], W3cV2EnvelopedVerifiablePresentation.prototype, "context", void 0);
__decorate([IsDataURI(), __decorateMetadata("design:type", String)], W3cV2EnvelopedVerifiablePresentation.prototype, "id", void 0);
__decorate([IsEnvelopedVerifiablePresentationType(), __decorateMetadata("design:type", Object)], W3cV2EnvelopedVerifiablePresentation.prototype, "type", void 0);
function IsEnvelopedVerifiablePresentationType(validationOptions) {
	return ValidateBy({
		name: "IsEnvelopedVerifiablePresentationType",
		validator: {
			validate: (value) => {
				return Array.isArray(value) ? value.includes(ENVELOPED_VERIFIABLE_PRESENTATION_TYPE) : value === ENVELOPED_VERIFIABLE_PRESENTATION_TYPE;
			},
			defaultMessage: buildMessage((eachPrefix) => `${eachPrefix}$property must be a string that equals, or an array of strings which includes "${ENVELOPED_VERIFIABLE_PRESENTATION_TYPE}"`, validationOptions)
		}
	}, validationOptions);
}
function presentationFromDataUri(uri) {
	if (!uri.startsWith("data:")) throw new CredoError("Invalid Enveloped Verifiable Presentation: \"id\" is not a valid data URI");
	const mimetypeData = uri.slice(5);
	const commaIndex = mimetypeData.indexOf(",");
	if (commaIndex === -1) throw new CredoError("Invalid Enveloped Verifiable Presentation: \"id\" data URI is missing comma separator");
	const mimetype = mimetypeData.slice(0, commaIndex);
	const data = mimetypeData.slice(commaIndex + 1);
	switch (mimetype) {
		case "application/vp+sd-jwt": return W3cV2SdJwtVerifiablePresentation.fromCompact(data);
		case "application/vp+jwt": return W3cV2JwtVerifiablePresentation.fromCompact(data);
		default: throw new CredoError(`Unsupported Enveloped Verifiable Presentation: ${mimetype} not recognized`);
	}
}
function presentationToDataUri(presentation) {
	if (presentation instanceof W3cV2SdJwtVerifiablePresentation) return `data:application/vp+sd-jwt,${presentation.encoded}`;
	if (presentation instanceof W3cV2JwtVerifiablePresentation) return `data:application/vp+jwt,${presentation.encoded}`;
	throw new CredoError("Unsupported Verifiable Presentation instance");
}

//#endregion
export { IsEnvelopedVerifiablePresentationType, W3cV2EnvelopedVerifiablePresentation };
//# sourceMappingURL=W3cV2EnvelopedVerifiablePresentation.mjs.map