import 'liveConsultation.m.dart';
import 'notification.m.dart';
import 'device.m.dart';

class CreateSystemSettingRequest extends TokenRequest{
	String? code;
	String? settingKey;
	String? settingContent;

	CreateSystemSettingRequest({
		this.code,
		this.settingKey,
		this.settingContent,
		String? token,
	}) : super(
			token: token,
		);

	factory CreateSystemSettingRequest.fromJson(Map<String, dynamic> map) {
		return CreateSystemSettingRequest( 
			code: map['Code'],
			settingKey: map['SettingKey'],
			settingContent: map['SettingContent'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (code != null)
			map['Code'] = code;
		if (settingKey != null)
			map['SettingKey'] = settingKey;
		if (settingContent != null)
			map['SettingContent'] = settingContent;
		return map;
	}
}

class SystemSettingDTO extends BaseDTO{
	String? code;
	String? settingKey;
	String? settingContent;

	SystemSettingDTO({
		this.code,
		this.settingKey,
		this.settingContent,
		DateTime? createTime,
		DateTime? updateTime,
	}) : super(
			createTime: createTime,
			updateTime: updateTime,
		);

	factory SystemSettingDTO.fromJson(Map<String, dynamic> map) {
		return SystemSettingDTO( 
			code: map['Code'],
			settingKey: map['SettingKey'],
			settingContent: map['SettingContent'],
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (code != null)
			map['Code'] = code;
		if (settingKey != null)
			map['SettingKey'] = settingKey;
		if (settingContent != null)
			map['SettingContent'] = settingContent;
		return map;
	}
}

class GetSystemSettingRequest extends TokenRequest{
	String? code;

	GetSystemSettingRequest({
		this.code,
		String? token,
	}) : super(
			token: token,
		);

	factory GetSystemSettingRequest.fromJson(Map<String, dynamic> map) {
		return GetSystemSettingRequest( 
			code: map['Code'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (code != null)
			map['Code'] = code;
		return map;
	}
}

class GetSystemSettingByKeyRequest extends TokenRequest{
	String? key;
	String? value;

	GetSystemSettingByKeyRequest({
		this.key,
		this.value,
		String? token,
	}) : super(
			token: token,
		);

	factory GetSystemSettingByKeyRequest.fromJson(Map<String, dynamic> map) {
		return GetSystemSettingByKeyRequest( 
			key: map['Key'],
			value: map['Value'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (key != null)
			map['Key'] = key;
		if (value != null)
			map['Value'] = value;
		return map;
	}
}

class SystemSettingPageRequest extends PageRequest{

	SystemSettingPageRequest({
		int pageIndex = 0,
		int pageSize = 0,
		String? token,
	}) : super(
			pageIndex: pageIndex,
			pageSize: pageSize,
			token: token,
		);

	factory SystemSettingPageRequest.fromJson(Map<String, dynamic> map) {
		return SystemSettingPageRequest( 
			pageIndex: map['PageIndex'],
			pageSize: map['PageSize'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		return map;
	}
}

class RemoveSystemSettingRequest extends TokenRequest{
	String? code;

	RemoveSystemSettingRequest({
		this.code,
		String? token,
	}) : super(
			token: token,
		);

	factory RemoveSystemSettingRequest.fromJson(Map<String, dynamic> map) {
		return RemoveSystemSettingRequest( 
			code: map['Code'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (code != null)
			map['Code'] = code;
		return map;
	}
}

class GetSystemSettingListRequest extends TokenRequest{
	List<String>? codes;

	GetSystemSettingListRequest({
		this.codes,
		String? token,
	}) : super(
			token: token,
		);

	factory GetSystemSettingListRequest.fromJson(Map<String, dynamic> map) {
		return GetSystemSettingListRequest( 
			codes: map['Codes']?.cast<String>().toList(),
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (codes != null)
			map['Codes'] = codes;
		return map;
	}
}

class UpdateSystemSettingRequest extends TokenRequest{
	String? code;
	String? settingKey;
	String? settingContent;

	UpdateSystemSettingRequest({
		this.code,
		this.settingKey,
		this.settingContent,
		String? token,
	}) : super(
			token: token,
		);

	factory UpdateSystemSettingRequest.fromJson(Map<String, dynamic> map) {
		return UpdateSystemSettingRequest( 
			code: map['Code'],
			settingKey: map['SettingKey'],
			settingContent: map['SettingContent'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (code != null)
			map['Code'] = code;
		if (settingKey != null)
			map['SettingKey'] = settingKey;
		if (settingContent != null)
			map['SettingContent'] = settingContent;
		return map;
	}
}

enum TemplateTypeEnum {
	Form,
}

class TemplateDTO extends BaseDTO{
	String? code;
	String? templateName;
	TemplateTypeEnum templateType;
	String? key;
	String? templateContent;

	TemplateDTO({
		this.code,
		this.templateName,
		this.templateType = TemplateTypeEnum.Form,
		this.key,
		this.templateContent,
		DateTime? createTime,
		DateTime? updateTime,
	}) : super(
			createTime: createTime,
			updateTime: updateTime,
		);

	factory TemplateDTO.fromJson(Map<String, dynamic> map) {
		return TemplateDTO( 
			code: map['Code'],
			templateName: map['TemplateName'],
			templateType: TemplateTypeEnum.values.firstWhere((e) => e.index == map['TemplateType']),
			key: map['Key'],
			templateContent: map['TemplateContent'],
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (code != null)
			map['Code'] = code;
		if (templateName != null)
			map['TemplateName'] = templateName;
		map['TemplateType'] = templateType.index;
		if (key != null)
			map['Key'] = key;
		if (templateContent != null)
			map['TemplateContent'] = templateContent;
		return map;
	}
}

class SyncSettingsDTO extends BaseDTO{
	String? code;
	String? version;
	List<TemplateDTO>? templates;
	String? homePageUrl;
	bool encryptSensitiveInfo;
	String? requestEncryptMode;
	bool enableRequestEncrypt;
	String? requestEncryptKey;
	String? peripheralDevice;
	bool enableResponseEncrypt;
	String? responseEncryptMode;

	SyncSettingsDTO({
		this.code,
		this.version,
		this.templates,
		this.homePageUrl,
		this.encryptSensitiveInfo = false,
		this.requestEncryptMode,
		this.enableRequestEncrypt = false,
		this.requestEncryptKey,
		this.peripheralDevice,
		this.enableResponseEncrypt = false,
		this.responseEncryptMode,
		DateTime? createTime,
		DateTime? updateTime,
	}) : super(
			createTime: createTime,
			updateTime: updateTime,
		);

	factory SyncSettingsDTO.fromJson(Map<String, dynamic> map) {
		return SyncSettingsDTO( 
			code: map['Code'],
			version: map['Version'],
			templates: map['Templates'] != null ? (map['Templates'] as List).map((e)=>TemplateDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			homePageUrl: map['HomePageUrl'],
			encryptSensitiveInfo: map['EncryptSensitiveInfo'],
			requestEncryptMode: map['RequestEncryptMode'],
			enableRequestEncrypt: map['EnableRequestEncrypt'],
			requestEncryptKey: map['RequestEncryptKey'],
			peripheralDevice: map['PeripheralDevice'],
			enableResponseEncrypt: map['EnableResponseEncrypt'],
			responseEncryptMode: map['ResponseEncryptMode'],
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (code != null)
			map['Code'] = code;
		if (version != null)
			map['Version'] = version;
		if (templates != null)
			map['Templates'] = templates;
		if (homePageUrl != null)
			map['HomePageUrl'] = homePageUrl;
		map['EncryptSensitiveInfo'] = encryptSensitiveInfo;
		if (requestEncryptMode != null)
			map['RequestEncryptMode'] = requestEncryptMode;
		map['EnableRequestEncrypt'] = enableRequestEncrypt;
		if (requestEncryptKey != null)
			map['RequestEncryptKey'] = requestEncryptKey;
		if (peripheralDevice != null)
			map['PeripheralDevice'] = peripheralDevice;
		map['EnableResponseEncrypt'] = enableResponseEncrypt;
		if (responseEncryptMode != null)
			map['ResponseEncryptMode'] = responseEncryptMode;
		return map;
	}
}

class SyncSettingRequest extends TokenRequest{

	SyncSettingRequest({
		String? token,
	}) : super(
			token: token,
		);

	factory SyncSettingRequest.fromJson(Map<String, dynamic> map) {
		return SyncSettingRequest( 
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		return map;
	}
}