package controllers

import (
	"Xcx_New/enums"
	"Xcx_New/models"
	"Xcx_New/service"
	"github.com/astaxie/beego"
	"time"
)

type IntegrationConfigApiController struct {
	BaseAuthAPIController
}

func IntegrationConfigRegistRouters() {

	beego.Router("/api/integration/patients", &IntegrationConfigApiController{}, "get:GetPatientsList")
	beego.Router("/api/patienthis/edit", &IntegrationConfigApiController{}, "post:EditPatientHis")
	beego.Router("/api/patienthis/create", &IntegrationConfigApiController{}, "post:CreatePatientHis")

	beego.Router("/api/integration/admin", &IntegrationConfigApiController{}, "get:GetAdminsList")
	beego.Router("/api/adminhis/edit", &IntegrationConfigApiController{}, "post:EditAdminHis")
	beego.Router("/api/adminhis/create", &IntegrationConfigApiController{}, "post:CreateAdminHis")

	beego.Router("/api/patienthis/getinterface", &IntegrationConfigApiController{}, "post:GetInterface")
	beego.Router("/api/patienthis/saveinterface", &IntegrationConfigApiController{}, "post:SaveInterface")
	beego.Router("/api/integration/synclist", &IntegrationConfigApiController{}, "get:GetSyncList")
	beego.Router("/api/integration/sysinspectionlist", &IntegrationConfigApiController{}, "get:GetSysInspectionList")
	beego.Router("/api/patienthis/saveinspectionsysitemid", &IntegrationConfigApiController{}, "post:SaveInspectionSysItemId")
}

func (c *IntegrationConfigApiController) SaveInspectionSysItemId() {
	adminUserInfo := c.GetAdminUserInfo()
	org_id, _ := c.GetInt64("org_id", 0)
	sys_item_id, _ := c.GetInt64("sys_item_id", 0)
	id, _ := c.GetInt64("id", 0)
	if org_id != adminUserInfo.CurrentOrgId || sys_item_id <= 0 || id <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
	}

	inspection_reference := &models.InspectionReference{
		ID:          id,
		SysItemId:   sys_item_id,
		UpdatedTime: time.Now().Unix(),
	}
	err := service.UpdateSysItemIdByID(inspection_reference)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
	}
	c.ServeSuccessJSON(map[string]interface{}{
		"inspection_reference": inspection_reference,
	})
	return
}

func (c *IntegrationConfigApiController) GetSysInspectionList() {
	adminUserInfo := c.GetAdminUserInfo()
	sysInspection, ownerInspection, err := service.GetSysInspectionList(adminUserInfo.CurrentOrgId)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
	}

	type InspectionStruce struct {
		ProjectName         string                        `gorm:"-" json:"project_name" form:"project_name"`
		ProjectId           int64                         `gorm:"-" json:"project_id" form:"project_id"`
		InspectionReference []*models.InspectionReference `gorm:"-" json:"inspection_reference" form:"inspection_reference"`
	}

	sysInspec := make(map[int64]*InspectionStruce, 0)
	ownerInspec := make(map[int64]*InspectionStruce, 0)

	for _, item := range sysInspection {
		result := sysInspec[item.ProjectId]
		if result == nil {
			result = new(InspectionStruce)
			result.ProjectName = item.ProjectName
			result.ProjectId = item.ProjectId
		}
		result.InspectionReference = append(result.InspectionReference, item)
		sysInspec[item.ProjectId] = result
	}

	for _, oitem := range ownerInspection {
		oresult := ownerInspec[oitem.ProjectId]
		if oresult == nil {
			oresult = new(InspectionStruce)
			oresult.ProjectName = oitem.ProjectName
			oresult.ProjectId = oitem.ProjectId
		}
		oresult.InspectionReference = append(oresult.InspectionReference, oitem)
		ownerInspec[oitem.ProjectId] = oresult
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"sysInspec":   sysInspec,
		"ownerInspec": ownerInspec,
	})
	return
}

func (c *IntegrationConfigApiController) GetSyncList() {
	page, _ := c.GetInt64("page", 1)
	limit, _ := c.GetInt64("limit", 10)

	if page <= 0 {
		page = 1
	}
	if limit <= 0 {
		limit = 10
	}

	adminUserInfo := c.GetAdminUserInfo()
	patients, total, _ := service.GetSyncList(adminUserInfo.CurrentOrgId, page, limit)

	c.ServeSuccessJSON(map[string]interface{}{
		"list":  patients,
		"total": total,
	})
	return
}

func (c *IntegrationConfigApiController) SaveInterface() {
	adminUserInfo := c.GetAdminUserInfo()
	ID, _ := c.GetInt64("id", 0)
	OrgId := adminUserInfo.CurrentOrgId
	Creater := adminUserInfo.AdminUser.Id
	Pattern, _ := c.GetInt("pattern", 0)
	Dbhost := c.GetString("dbhost")
	Dbuser := c.GetString("dbuser")
	Dbpassword := c.GetString("dbpassword")
	Dbname := c.GetString("dbname")
	InterfaceUrl := c.GetString("interface_url")
	InterFaceToken := c.GetString("interface_token")
	AllowIp := c.GetString("allow_ip")
	AllowToken := c.GetString("allow_token")
	SyncFrequency, _ := c.GetInt("sync_frequency")
	Status := 1
	UpdatedTime := time.Now().Unix()
	interfaceinfo := &models.MiddleInterface{
		ID:             ID,
		OrgId:          OrgId,
		Creater:        Creater,
		Pattern:        Pattern,
		Dbhost:         Dbhost,
		Dbuser:         Dbuser,
		Dbpassword:     Dbpassword,
		Dbname:         Dbname,
		InterfaceUrl:   InterfaceUrl,
		InterFaceToken: InterFaceToken,
		AllowIp:        AllowIp,
		AllowToken:     AllowToken,
		SyncFrequency:  SyncFrequency,
		Status:         Status,
		UpdatedTime:    UpdatedTime,
	}
	if ID <= 0 {
		interfaceinfo.CreatedTime = time.Now().Unix()
	}
	err := service.SaveInterface(interfaceinfo)

	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"interfaceinfo": interfaceinfo,
		})
	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
	}
	return
}

func (c *IntegrationConfigApiController) GetInterface() {
	adminUserInfo := c.GetAdminUserInfo()
	interfaceinfo, _ := service.GetInterface(adminUserInfo.CurrentOrgId)
	c.ServeSuccessJSON(map[string]interface{}{
		"interfaceinfo": interfaceinfo,
	})
	return

}

func (c *IntegrationConfigApiController) GetPatientsList() {
	page, _ := c.GetInt64("page", 1)
	limit, _ := c.GetInt64("limit", 10)

	if page <= 0 {
		page = 1
	}
	if limit <= 0 {
		limit = 10
	}

	adminUserInfo := c.GetAdminUserInfo()
	patients, total, _ := service.GetIntegrationPatientList(adminUserInfo.CurrentOrgId, page, limit)

	c.ServeSuccessJSON(map[string]interface{}{
		"list":  patients,
		"total": total,
	})
	return
}

func (c *IntegrationConfigApiController) EditPatientHis() {
	his_user_id := c.GetString("his_user_id")
	id, _ := c.GetInt64("id", 0)

	adminUserInfo := c.GetAdminUserInfo()

	total, _ := service.FindHisPatientByHisId(adminUserInfo.CurrentOrgId, his_user_id)

	if total > 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeHisIdExist)
		return

	}

	err := service.UpdatePatientsHis(adminUserInfo.CurrentOrgId, his_user_id, id)
	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"his_user_id": his_user_id,
		})
	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)

	}
	return

}

func (c *IntegrationConfigApiController) CreatePatientHis() {
	his_user_id := c.GetString("his_user_id")
	id, _ := c.GetInt64("id", 0)

	adminUserInfo := c.GetAdminUserInfo()
	patient, _ := service.FindVMPatientById(adminUserInfo.CurrentOrgId, id)

	total, _ := service.FindHisPatientByHisId(adminUserInfo.CurrentOrgId, his_user_id)

	if total > 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeHisIdExist)
		return

	}

	hisPatient := &models.HisPatients{
		UserOrgId:                    adminUserInfo.CurrentOrgId,
		UserId:                       patient.UserId,
		Avatar:                       patient.Avatar,
		PatientType:                  patient.PatientType,
		DialysisNo:                   patient.DialysisNo,
		AdmissionNumber:              patient.AdmissionNumber,
		Source:                       patient.Source,
		Lapseto:                      patient.Lapseto,
		PartitionId:                  patient.PartitionId,
		BedId:                        patient.BedId,
		Name:                         patient.Name,
		Alias:                        patient.Alias,
		Gender:                       patient.Gender,
		Nation:                       patient.Nation,
		NativePlace:                  patient.NativePlace,
		MaritalStatus:                patient.MaritalStatus,
		IdCardNo:                     patient.IdCardNo,
		Birthday:                     patient.Birthday,
		ReimbursementWayId:           patient.ReimbursementWayId,
		HealthCareType:               patient.HealthCareType,
		HealthCareNo:                 patient.HealthCareNo,
		HealthCareDueDate:            patient.HealthCareDueDate,
		Height:                       patient.Height,
		BloodType:                    patient.BloodType,
		Rh:                           patient.Rh,
		HealthCareDueAlertDate:       patient.HealthCareDueAlertDate,
		EducationLevel:               patient.EducationLevel,
		Profession:                   patient.Profession,
		Phone:                        patient.Phone,
		HomeTelephone:                patient.HomeTelephone,
		RelativePhone:                patient.RelativePhone,
		HomeAddress:                  patient.HomeAddress,
		WorkUnit:                     patient.WorkUnit,
		UnitAddress:                  patient.UnitAddress,
		ReceivingDate:                patient.ReceivingDate,
		IsHospitalFirstDialysis:      patient.IsHospitalFirstDialysis,
		FirstDialysisDate:            patient.FirstDialysisDate,
		FirstDialysisHospital:        patient.FirstDialysisHospital,
		PredialysisCondition:         patient.PredialysisCondition,
		PreHospitalDialysisFrequency: patient.PreHospitalDialysisFrequency,
		PreHospitalDialysisTimes:     patient.PreHospitalDialysisTimes,
		HospitalFirstDialysisDate:    patient.HospitalFirstDialysisDate,
		InductionPeriod:              patient.InductionPeriod,
		InitialDialysis:              patient.InitialDialysis,
		TotalDialysis:                patient.TotalDialysis,
		AttendingDoctorId:            patient.AttendingDoctorId,
		HeadNurseId:                  patient.HeadNurseId,
		Evaluate:                     patient.Evaluate,
		Diagnose:                     patient.Diagnose,
		Remark:                       patient.Remark,
		RegistrarsId:                 patient.RegistrarsId,
		Registrars:                   patient.Registrars,
		QrCode:                       patient.QrCode,
		BindingState:                 patient.BindingState,
		PatientComplains:             patient.PatientComplains,
		PresentHistory:               patient.PresentHistory,
		PastHistory:                  patient.PastHistory,
		Temperature:                  patient.Temperature,
		Pulse:                        patient.Pulse,
		Respiratory:                  patient.Respiratory,
		Sbp:                          patient.SBP,
		Dbp:                          patient.DBP,
		Status:                       1,
		CreatedTime:                  time.Now().Unix(),
		UpdatedTime:                  time.Now().Unix(),
		Age:                          patient.Age,
		InfectiousNextRecordTime:     patient.InfectiousNextRecordTime,
		IsInfectious:                 patient.IsInfectious,
		RemindCycle:                  patient.RemindCycle,
		ResponseResult:               patient.ResponseResult,
		IsOpenRemind:                 patient.IsOpenRemind,
		DialysisAge:                  patient.DialysisAge,
		ExpenseKind:                  patient.ExpenseKind,
		TellPhone:                    patient.TellPhone,
		FirstTreatmentDate:           patient.FirstTreatmentDate,
		ContactName:                  patient.ContactName,
		HisUserId:                    his_user_id,
		XtPatientId:                  patient.ID,
	}

	err := service.CreatePatientsHis(hisPatient)
	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"patient": hisPatient,
		})
	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)

	}
	return

}

func (c *IntegrationConfigApiController) GetAdminsList() {
	page, _ := c.GetInt("page", 1)
	limit, _ := c.GetInt("limit", 10)

	if page <= 0 {
		page = 1
	}
	if limit <= 0 {
		limit = 10
	}

	adminUserInfo := c.GetAdminUserInfo()

	viewModels, total, getAdminsErr := service.GetAdminUsers(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, page, limit)
	if getAdminsErr != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
	c.ServeSuccessJSON(map[string]interface{}{
		"admins":      viewModels,
		"total_count": total,
	})

	return

}

func (c *IntegrationConfigApiController) EditAdminHis() {
	his_user_id := c.GetString("his_user_id")
	id, _ := c.GetInt64("id", 0)

	adminUserInfo := c.GetAdminUserInfo()

	total, _ := service.FindHisAdminByHisId(adminUserInfo.CurrentOrgId, his_user_id, adminUserInfo.CurrentAppId)

	if total > 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeHisIdExist)
		return

	}

	err := service.UpdateAdminsHis(adminUserInfo.CurrentOrgId, his_user_id, id)
	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"his_user_id": his_user_id,
		})
	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)

	}
	return

}

func (c *IntegrationConfigApiController) CreateAdminHis() {
	his_user_id := c.GetString("his_user_id")
	id, _ := c.GetInt64("id", 0)

	adminUserInfo := c.GetAdminUserInfo()
	adminRole, _ := service.FindVMAdminRoleById(adminUserInfo.CurrentOrgId, id, adminUserInfo.CurrentAppId)

	total, _ := service.FindHisAdminByHisId(adminUserInfo.CurrentOrgId, his_user_id, adminUserInfo.CurrentAppId)

	if total > 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeHisIdExist)
		return

	}

	hisAdminRole := &models.HisUserAdminRole{
		OrgId:       adminUserInfo.CurrentOrgId,
		AdminUserId: adminRole.AdminUserId,
		AppId:       adminRole.AppId,
		RoleId:      adminRole.RoleId,
		UserName:    adminRole.UserName,
		Avatar:      adminRole.Avatar,
		UserType:    adminRole.UserType,
		UserTitle:   adminRole.UserTitle,
		Intro:       adminRole.Intro,
		Status:      1,
		Ctime:       time.Now().Unix(),
		Mtime:       time.Now().Unix(),
		XtRoleId:    adminRole.ID,
		HisUserId:   his_user_id,
	}

	err := service.CreateAdminsHis(hisAdminRole)
	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"his_role": hisAdminRole,
		})
	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)

	}
	return

}