{{className}}::{{className}}() {}

{{#if hasRequiredProperties}}
{{className}}::{{className}} (

{{#each properties as |property|}}
{{#if property.isNotNullable}}
		
		{{property.typeNameWithQualifiers}} {{property.name}}{{#if property.isLastNonNullable}} {{else}}, {{/if}}

{{/if}}
{{/each}}
		) :

{{#each properties as |property|}}
{{#if property.isNotNullable}}
	{{property.memberName}}({{property.name}})
	{{#if property.isLastNonNullable}}
 { }
	{{else}}
,
	{{/if}}

{{/if}}
{{/each}}



{{/if}}

{{className}}::{{className}}(const {{className}} &other) :


{{#each properties as |property|}}
	{{property.memberName}}(other.{{property.memberName}})
	{{#if property.isLast}}
{}
	{{else}}
,
	{{/if}}

{{/each}}


void {{className}}::replaceData({{className}} &other) {

{{#each properties as |property|}}
	{{property.memberName}} = other.{{property.memberName}};

{{/each}}
}


{{className}} {{className}}::fromJson(QJsonObject source) {
	
	{{className}} instance;
	instance.setFromJson(source);
	return instance;
}


void {{className}}::setFromJson(QJsonObject source) {

	{{#each properties as |property|}}
	{{property.memberName}} = {{supportNamespace}}::fromJsonValue<{{property.typeNameWithQualifiers}}>(source["{{property.originalName}}"]);

	{{/each}}

}
	
QJsonObject {{className}}::toJson() const {
	QJsonObject result;

	{{#each properties as |property|}}
	{{#if property.isNullable}}

	
	if (!({{property.nullableCheck}})) {
		result["{{property.originalName}}"] = {{supportNamespace}}::toJsonValue<{{property.typeNameWithQualifiers}}>({{property.memberName}});
	}
	
	{{#else}}

	result["{{property.originalName}}"] = {{supportNamespace}}::toJsonValue<{{property.typeNameWithQualifiers}}>({{property.memberName}});
	{{/if}}
	{{/each}}

	return result;
}


{{#each properties as |property|}}
{{property.typeNameWithQualifiers}} {{className}}::{{property.name}}() const { return {{property.memberName}}; }

void {{className}}::set{{property.writeName}}({{property.typeNameWithQualifiers}} new{{property.writeName}}) {
	
	{{property.memberName}} = new{{property.writeName}};
}

{{#if property.isNullable}}
bool {{className}}::{{property.name}}Null() const {
	return {{property.nullableCheck}};
}

void {{className}}::set{{property.writeName}}Null() {
	
	{{property.memberName}}{{property.nullableSetter}};

}
{{/if}}

{{/each}}

} // NS DTO

namespace Support {

using {{className}} = Jellyfin::DTO::{{className}};

template <>

{{className}} fromJsonValue(const QJsonValue &source, convertType<{{className}}>) {
	if (!source.isObject()) throw ParseException("Expected JSON Object");
	return {{className}}::fromJson(source.toObject());
}

template<>
QJsonValue toJsonValue(const {{className}} &source, convertType<{{className}}>) {
	return source.toJson();
}
