import 'dart:core';

import 'package:fis_jsonrpc/client_base.dart';
import 'package:fis_common/json_convert.dart';

import 'appletAPI.m.dart';

import 'liveConsultation.m.dart';


class AppletAPIService extends JsonRpcClientBase {
	AppletAPIService(
		String host, {
		String serviceName = "IAppletAPIService",
		Map<String, String>? headers,
		int? timeout,
	}) : super(
						host,
						serviceName,
						headers: headers,
						timeout: timeout,
				) {
		/// 注册响应实体反序列化处理器
		FJsonConvert.setDecoder((map) => GetUserInfoByOpenIdResult.fromJson(map));
		FJsonConvert.setDecoder((map) => PageResult<RemedicalRecordInfo>.fromJson(map));
		FJsonConvert.setDecoder((map) => RemedicalRecordInfo.fromJson(map));
		FJsonConvert.setDecoder((map) => ImageData.fromJson(map));
		FJsonConvert.setDecoder((map) => ReportInfo.fromJson(map));
		FJsonConvert.setDecoder((map) => PageResult<ConsultationInfo>.fromJson(map));
		FJsonConvert.setDecoder((map) => ConsultationInfo.fromJson(map));
		FJsonConvert.setDecoder((map) => OrganBaseInfo.fromJson(map));
		FJsonConvert.setDecoder((map) => DoctorInfo.fromJson(map));
		FJsonConvert.setDecoder((map) => TerminalInfo.fromJson(map));
		FJsonConvert.setDecoder((map) => StartConsultationResult.fromJson(map));
		FJsonConvert.setDecoder((map) => CancelStartConsultationResult.fromJson(map));
		FJsonConvert.setDecoder((map) => ExitConsultationResult.fromJson(map));
		FJsonConvert.setDecoder((map) => AppletAPIDownloadFileResult.fromJson(map));
		FJsonConvert.setDecoder((map) => VinnoTemplateInfo.fromJson(map));
		FJsonConvert.setDecoder((map) => ReportResultInfo.fromJson(map));
	}

	Future<bool> serviceIsExist() async {
		var rpcRst = await call("ServiceIsExist", );
		return rpcRst;
	}

	Future<bool> liveMemberLeaveAsync(LiveMemberLeaveRequest request) async {
		var rpcRst = await call("LiveMemberLeaveAsync", request);
		return rpcRst;
	}

	Future<bool> liveMemberRejectAsync(LiveMemberRejectRequest request) async {
		var rpcRst = await call("LiveMemberRejectAsync", request);
		return rpcRst;
	}

	Future<bool> liveMemberAcceptAsync(LiveMemberAcceptRequest request) async {
		var rpcRst = await call("LiveMemberAcceptAsync", request);
		return rpcRst;
	}

	Future<bool> liveMemberTimeoutAsync(LiveMemberTimeoutRequest request) async {
		var rpcRst = await call("LiveMemberTimeoutAsync", request);
		return rpcRst;
	}

	Future<GetUserInfoByOpenIdResult> getUserInfoByOpenIdAsync(GetUserInfoByOpenIdRequest request) async {
		var rpcRst = await call("GetUserInfoByOpenIdAsync", request);
		var result = GetUserInfoByOpenIdResult.fromJson(rpcRst as Map<String, dynamic>);
		return result;
	}

	Future<bool> bindVcloudAccountAndOpenIdAsync(BindVcloudAccountAndOpenIdRequest request) async {
		var rpcRst = await call("BindVcloudAccountAndOpenIdAsync", request);
		return rpcRst;
	}

	Future<PageResult<RemedicalRecordInfo>> getRemedicalRecordListAsync(GetRemedicalRecordListRequest request) async {
		var rpcRst = await call("GetRemedicalRecordListAsync", request);
		var result = PageResult<RemedicalRecordInfo>.fromJson(rpcRst as Map<String, dynamic>);
		return result;
	}

	Future<List<ImageData>> getRemedicalDataListAsync(GetRemedicalDataListRequest request) async {
		var rpcRst = await call("GetRemedicalDataListAsync", request);
		var result = (rpcRst as List).map((e)=>ImageData.fromJson(e as Map<String, dynamic>)).toList();
		return result;
	}

	Future<List<ReportInfo>> getRemedicalReportListAsync(GetRemedicalReportListRequest request) async {
		var rpcRst = await call("GetRemedicalReportListAsync", request);
		var result = (rpcRst as List).map((e)=>ReportInfo.fromJson(e as Map<String, dynamic>)).toList();
		return result;
	}

	Future<PageResult<ConsultationInfo>> getConsultationListAsync(GetConsultationListRequest request) async {
		var rpcRst = await call("GetConsultationListAsync", request);
		var result = PageResult<ConsultationInfo>.fromJson(rpcRst as Map<String, dynamic>);
		return result;
	}

	Future<List<ReportInfo>> getConsultationReportListAsync(GetConsultationReportListRequest request) async {
		var rpcRst = await call("GetConsultationReportListAsync", request);
		var result = (rpcRst as List).map((e)=>ReportInfo.fromJson(e as Map<String, dynamic>)).toList();
		return result;
	}

	Future<String> createConsultationAsync(CreateConsultationRequest request) async {
		var rpcRst = await call("CreateConsultationAsync", request);
		return rpcRst;
	}

	Future<bool> arrangeConsultationAsync(ArrangeConsultationRequest request) async {
		var rpcRst = await call("ArrangeConsultationAsync", request);
		return rpcRst;
	}

	Future<List<OrganBaseInfo>> getHospitalsAsync(GetHospitalsRequest request) async {
		var rpcRst = await call("GetHospitalsAsync", request);
		var result = (rpcRst as List).map((e)=>OrganBaseInfo.fromJson(e as Map<String, dynamic>)).toList();
		return result;
	}

	Future<List<DoctorInfo>> getExpertsAsync(GetExpertsRequest request) async {
		var rpcRst = await call("GetExpertsAsync", request);
		var result = (rpcRst as List).map((e)=>DoctorInfo.fromJson(e as Map<String, dynamic>)).toList();
		return result;
	}

	Future<List<TerminalInfo>> getTerminalListAsync(GetTerminalListRequest request) async {
		var rpcRst = await call("GetTerminalListAsync", request);
		var result = (rpcRst as List).map((e)=>TerminalInfo.fromJson(e as Map<String, dynamic>)).toList();
		return result;
	}

	Future<List<String>> getScanLocationsAsync(GetScanLocationsRequest request) async {
		var rpcRst = await call("GetScanLocationsAsync", request);
		var result = (rpcRst as List).cast<String>().toList();
		return result;
	}

	Future<StartConsultationResult> startConsultationAsync(StartConsultationRequest request) async {
		var rpcRst = await call("StartConsultationAsync", request);
		var result = StartConsultationResult.fromJson(rpcRst as Map<String, dynamic>);
		return result;
	}

	Future<CancelStartConsultationResult> cancelStartConsultationAsync(CancelStartConsultationRequest request) async {
		var rpcRst = await call("CancelStartConsultationAsync", request);
		var result = CancelStartConsultationResult.fromJson(rpcRst as Map<String, dynamic>);
		return result;
	}

	Future<ExitConsultationResult> exitConsultationAsync(ExitConsultationRequest request) async {
		var rpcRst = await call("ExitConsultationAsync", request);
		var result = ExitConsultationResult.fromJson(rpcRst as Map<String, dynamic>);
		return result;
	}

	Future<bool> consultationHeartRateAsync(ConsultationHeartRateRequest request) async {
		var rpcRst = await call("ConsultationHeartRateAsync", request);
		return rpcRst;
	}

	Future<AppletAPIDownloadFileResult> downloadFileAsync(DownloadFileRequest request) async {
		var rpcRst = await call("DownloadFileAsync", request);
		var result = AppletAPIDownloadFileResult.fromJson(rpcRst as Map<String, dynamic>);
		return result;
	}

	Future<List<VinnoTemplateInfo>> getReportTemplatesAsync(GetReportTemplatesRequest request) async {
		var rpcRst = await call("GetReportTemplatesAsync", request);
		var result = (rpcRst as List).map((e)=>VinnoTemplateInfo.fromJson(e as Map<String, dynamic>)).toList();
		return result;
	}

	Future<List<VinnoTemplateInfo>> getThesaurusTemplatesAsync(GetThesaurusTemplatesRequest request) async {
		var rpcRst = await call("GetThesaurusTemplatesAsync", request);
		var result = (rpcRst as List).map((e)=>VinnoTemplateInfo.fromJson(e as Map<String, dynamic>)).toList();
		return result;
	}

	Future<String> saveReportAsync(SaveAppletReportRequest request) async {
		var rpcRst = await call("SaveReportAsync", request);
		return rpcRst;
	}

	Future<ReportResultInfo> getReportByIdAsync(GetAppletReportRequest request) async {
		var rpcRst = await call("GetReportByIdAsync", request);
		var result = ReportResultInfo.fromJson(rpcRst as Map<String, dynamic>);
		return result;
	}

	Future<String> uploadConsultationImageAsync(UploadConsultationImageRequest request) async {
		var rpcRst = await call("UploadConsultationImageAsync", request);
		return rpcRst;
	}

}