package service

import (
	_ "strconv"
	_ "strings"
	"time"

	"XT_New/models"
	_ "github.com/astaxie/beego"
)

// GetPatientList 返回患者的列表
func GetConfigList(orgID int64) (dataconfig interface{}, err error) {
	var configList []*models.Dataconfig

	err = readDb.Model(&models.Dataconfig{}).Where("(org_id in (0,?) and status = 1) or (status = 0 and delete_id_system > 0 and org_id = ?)", orgID, orgID).Order("orders asc, id asc").Find(&configList).Error
	if err != nil {
		return nil, err
	}

	// configResult := make([]*ConfigViewModel,0)
	childConfig := make(map[int64][]*models.Dataconfig)
	resultConfig := make(map[string][]*models.ConfigViewModel)
	deleteSystemChilds := make([]*models.Dataconfig, 0)
	editSystemChilds := make([]*models.Dataconfig, 0)
	for _, config := range configList {
		if config.Status == 1 && config.DeleteIdSystem > 0 {
			editSystemChilds = append(editSystemChilds, config)
		}

		if config.Status == 0 && config.DeleteIdSystem > 0 {
			deleteSystemChilds = append(deleteSystemChilds, config)
		}
	}
	continueFlag := false
	for _, config := range configList {
		continueFlag = false
		if config.ParentId == 0 {
			newConfig := &models.ConfigViewModel{
				ID:           config.ID,
				ParentId:     config.ParentId,
				Module:       config.Module,
				OrgId:        config.OrgId,
				Name:         config.Name,
				FieldName:    config.FieldName,
				Value:        config.Value,
				CreateUserId: config.CreateUserId,
				Status:       config.Status,
				Remark:       config.Remark,
				Title:        config.Title,
				Content:      config.Content,
				Sort:         config.Sort,
			}
			// configResult = append(configResult,newConfig)
			result := resultConfig[config.Module]
			if result == nil {
				result = make([]*models.ConfigViewModel, 0)
			}
			for _, vm := range editSystemChilds {
				if vm.DeleteIdSystem == config.ID {
					continueFlag = true
					break
				}
			}

			for _, _vm := range deleteSystemChilds {
				if _vm.DeleteIdSystem == config.ID {
					continueFlag = true
					break
				}
			}
			if config.OrgId != 0 && config.Status == 0 && config.DeleteIdSystem > 0 {
				continue
			}
			if continueFlag {
				continue
			}
			result = append(result, newConfig)
			resultConfig[config.Module] = result
		} else {
			childs := childConfig[config.ParentId]
			if childs == nil {
				childs = make([]*models.Dataconfig, 0)
			}
			continueFlag := false
			for _, vm := range editSystemChilds {
				if vm.DeleteIdSystem == config.ID {
					continueFlag = true
					break
				}
			}

			for _, _vm := range deleteSystemChilds {
				if _vm.DeleteIdSystem == config.ID {
					continueFlag = true
					break
				}
			}
			if config.OrgId != 0 && config.Status == 0 && config.DeleteIdSystem > 0 {
				continue
			}
			if continueFlag {
				continue
			}

			childs = append(childs, config)
			childConfig[config.ParentId] = childs
		}
	}

	for _, vm := range resultConfig {
		for _, _vm := range vm {
			_vm.Childs = childConfig[_vm.ID]
		}
		// vm.Childs = childConfig[vm.ID]
	}
	return resultConfig, err
}

func GetDictConfigList(orgID int64) (dataconfig interface{}, err error) {
	var configList []*models.DictionaryDataconfig

	err = readDb.Model(&models.DictionaryDataconfig{}).Where("(org_id in (0,?) and status = 1) or (status = 0 and delete_id_system > 0 and org_id = ?)", orgID, orgID).Order("orders asc, id asc").Find(&configList).Error
	if err != nil {
		return nil, err
	}

	// configResult := make([]*ConfigViewModel,0)
	childConfig := make(map[int64][]*models.DictionaryDataconfig)
	resultConfig := make(map[string][]*models.DictionaryConfigViewModel)
	deleteSystemChilds := make([]*models.DictionaryDataconfig, 0)
	editSystemChilds := make([]*models.DictionaryDataconfig, 0)
	for _, config := range configList {
		if config.Status == 1 && config.DeleteIdSystem > 0 {
			editSystemChilds = append(editSystemChilds, config)
		}

		if config.Status == 0 && config.DeleteIdSystem > 0 {
			deleteSystemChilds = append(deleteSystemChilds, config)
		}
	}
	continueFlag := false
	for _, config := range configList {
		continueFlag = false
		if config.ParentId == 0 {
			newConfig := &models.DictionaryConfigViewModel{
				ID:           config.ID,
				ParentId:     config.ParentId,
				Module:       config.Module,
				OrgId:        config.OrgId,
				Name:         config.Name,
				FieldName:    config.FieldName,
				Value:        config.Value,
				CreateUserId: config.CreateUserId,
				Status:       config.Status,
				Remark:       config.Remark,
				Title:        config.Title,
				Content:      config.Content,
			}
			// configResult = append(configResult,newConfig)
			result := resultConfig[config.Module]
			if result == nil {
				result = make([]*models.DictionaryConfigViewModel, 0)
			}
			for _, vm := range editSystemChilds {
				if vm.DeleteIdSystem == config.ID {
					continueFlag = true
					break
				}
			}

			for _, _vm := range deleteSystemChilds {
				if _vm.DeleteIdSystem == config.ID {
					continueFlag = true
					break
				}
			}
			if config.OrgId != 0 && config.Status == 0 && config.DeleteIdSystem > 0 {
				continue
			}
			if continueFlag {
				continue
			}
			result = append(result, newConfig)
			resultConfig[config.Module] = result
		} else {
			childs := childConfig[config.ParentId]
			if childs == nil {
				childs = make([]*models.DictionaryDataconfig, 0)
			}
			continueFlag := false
			for _, vm := range editSystemChilds {
				if vm.DeleteIdSystem == config.ID {
					continueFlag = true
					break
				}
			}

			for _, _vm := range deleteSystemChilds {
				if _vm.DeleteIdSystem == config.ID {
					continueFlag = true
					break
				}
			}
			if config.OrgId != 0 && config.Status == 0 && config.DeleteIdSystem > 0 {
				continue
			}
			if continueFlag {
				continue
			}

			childs = append(childs, config)
			childConfig[config.ParentId] = childs
		}
	}

	for _, vm := range resultConfig {
		for _, _vm := range vm {
			_vm.Childs = childConfig[_vm.ID]
		}
		// vm.Childs = childConfig[vm.ID]
	}
	return resultConfig, err
}

func FindConfigByFieldname(module string, field_name string, org_id int64) (dataconfig models.Dataconfig, err error) {
	err = readDb.Model(&models.Dataconfig{}).Where("module=? and field_name=? and org_id in (0,?) and status = 1", module, field_name, org_id).First(&dataconfig).Error
	return
}

func FindConfigByTitle(module string, title string, org_id int64) (dataconfig models.Dataconfig, err error) {
	err = readDb.Model(&models.Dataconfig{}).Where("module=? and title=? and org_id in (0,?) and status = 1", module, title, org_id).First(&dataconfig).Error
	return
}

func FindConfigByName(module string, name string, parent_id int64, org_id int64) (dataconfig models.Dataconfig, err error) {
	err = readDb.Model(&models.Dataconfig{}).Where("module=? and name=? and parent_id=? and org_id in (0,?) and status = 1", module, name, parent_id, org_id).First(&dataconfig).Error
	return
}

func FindConfigByNameForUpdate(module string, name string, parent_id int64, org_id int64, id int64) (dataconfig models.Dataconfig, err error) {
	err = readDb.Model(&models.Dataconfig{}).Where("module=? and name=? and parent_id=? and org_id in (0,?) and id != ? and status = 1", module, name, parent_id, org_id, id).First(&dataconfig).Error
	return
}

func FindConfigByTitleForUpdate(module string, title string, org_id int64, id int64) (dataconfig models.Dataconfig, err error) {
	err = readDb.Model(&models.Dataconfig{}).Where("module=? and title=? and org_id in (0,?) and id != ? and status = 1", module, title, org_id, id).First(&dataconfig).Error
	return
}

func UpdateChildConfig(dataconfig *models.Dataconfig) (err error) {
	err = readDb.Model(&models.Dataconfig{}).Where("id =?", dataconfig.ID).Update(map[string]interface{}{"name": dataconfig.Name, "update_time": dataconfig.UpdatedTime, "remark": dataconfig.Remark, "orders": dataconfig.Order, "field_type": dataconfig.FieldType}).Error
	return
}

func UpdateTemplate(dataconfig *models.Dataconfig) (err error) {
	err = readDb.Model(&models.Dataconfig{}).Where("id =?", dataconfig.ID).Update(map[string]interface{}{"title": dataconfig.Title, "content": dataconfig.Content, "update_time": dataconfig.UpdatedTime, "remark": dataconfig.Remark}).Error
	return
}

func CreateConfig(dataconfig *models.Dataconfig) (err error) {
	// readDb.Model(&models.Dataconfig{}).Where("module = ? and parent_id = 0 and org_id in (0,?)",dataconfig.Module,dataconfig.OrgId).Count(&total)
	err = readDb.Create(&dataconfig).Error
	return
}

func GetChildValue(module string, parent_id int64, org_id int64) (value int) {
	readDb.Model(&models.Dataconfig{}).Where("module=? and parent_id=? and org_id in (0,?)", module, parent_id, org_id).Count(&value)
	return
}

func DeleteChildConfig(dataconfig *models.Dataconfig) (err error) {
	err = readDb.Model(&models.Dataconfig{}).Where("id =?", dataconfig.ID).Update(map[string]interface{}{"status": dataconfig.Status, "update_time": dataconfig.UpdatedTime}).Error
	return
}

func FindFiledByOrgId(org_id int64) (filedConfig []*models.FiledConfig, err error) {
	err = readDb.Model(&models.FiledConfig{}).Where("org_id =? AND  sys_module = 0", org_id).Find(&filedConfig).Error
	return
}

func FindQualityByOrgId(orgid int64) (xtquality []*models.XtQualityControlStandard, err error) {

	err = readDb.Model(&models.XtQualityControlStandard{}).Where("user_org_id =? and status =1 and is_status = 1", orgid).Find(&xtquality).Error
	return
}

func GetDefaultSystolicPressure(orgid int64) (xtquality []*models.XtQualityControlStandard, err error) {

	err = readDb.Model(&models.XtQualityControlStandard{}).Where("user_org_id = ? and status = 1 and is_status =0", orgid).Find(&xtquality).Error
	return
}

func FindeInspectionByOrgId(orgid int64) (xtquality []*models.XtCheckConfiguration, err error) {

	err = readDb.Model(&models.XtQualityControlStandard{}).Where("user_org_id = ? and status =1", orgid).Find(&xtquality).Error
	return
}

func BatchInsertFiledConfig(org_id int64) (err error) {
	err = XTWriteDB().Exec("INSERT  INTO sgj_xt.xt_filed_config  ( org_id,  module,  filed_name,  filed_name_cn,  is_show ) SELECT ?,  module,  filed_name,  filed_name_cn,  is_show FROM sgj_xt.xt_filed_config  WHERE org_id = 0 AND is_show = 1", org_id).Error
	return
}

func BatchInsertQualityControl(org_id int64) (err error) {

	err = XTWriteDB().Exec("INSERT INTO xt_quality_control_standard(user_org_id,inspection_major,inspection_minor,min_range,large_range,sort,created_time,status,range_type,range_value,is_status) SELECT ?,inspection_major,inspection_minor,min_range,large_range,sort,created_time,status,range_type,range_value,is_status FROM xt_quality_control_standard where user_org_id = 0 and is_status = 1", org_id).Error
	return
}

func BathInsertQualityControlTwo(org_id int64) (err error) {
	err = XTWriteDB().Exec("INSERT INTO xt_quality_control_standard(user_org_id,inspection_major,inspection_minor,min_range,large_range,sort,created_time,status,range_type,range_value,is_status) SELECT ?,inspection_major,inspection_minor,min_range,large_range,sort,created_time,status,range_type,range_value,is_status FROM xt_quality_control_standard where user_org_id = 0 and is_status = 0", org_id).Error
	return
}

func BatchInspectionConfiguration(orgid int64) (err error) {

	err = XTWriteDB().Exec("INSERT INTO xt_check_configuration(user_org_id,inspection_major,inspection_frequency,sort,created_time,status) SELECT ?,inspection_major,inspection_frequency,sort,created_time,status FROM xt_check_configuration where user_org_id = 0", orgid).Error
	return
}

func ShowFiledConfig(org_id int64, isShow int, is_write int, id int64) (err error) {
	err = XTWriteDB().Model(&models.FiledConfig{}).Where("org_id = ? AND id = ?", org_id, id).Updates(map[string]interface{}{"create_time": time.Now().Unix(), "update_time": time.Now().Unix(), "is_show": isShow, "is_write": is_write}).Error
	return
}

func FindSysDialysisFiledByOrgId() (filedConfig []*models.FiledConfig, err error) {
	err = XTWriteDB().Model(&models.FiledConfig{}).Where("org_id =? AND id in (11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262)", 0).Find(&filedConfig).Error
	return
}

func BatchInsertFiledSystemConfig(org_id int64) (err error) {
	err = XTWriteDB().Exec("INSERT  INTO sgj_xt.xt_filed_config  ( org_id,  module,  filed_name,  filed_name_cn,  is_show ) SELECT ?,  module,  filed_name,  filed_name_cn,  is_show FROM sgj_xt.xt_filed_config  WHERE org_id = 9442", org_id).Error
	return
}

func BatchInsertDoctorSchedule(orgid int64) (err error) {

	err = XTWriteDB().Exec("INSERT INTO sgj_xt.xt_doctor_schedules(user_org_id,class_name,class_attributes,timeone_start,timeone_type,timeone_end,timetwo_start,timetwo_type,timetwo_end,work_time,remarks,status,ctime,minute) SELECT ?, class_name,class_attributes,timeone_start,timeone_type,timeone_end,timetwo_start,timetwo_type,timetwo_end,work_time,remarks,status,ctime,minute FROM xt_doctor_schedules WHERE user_org_id = 0", orgid).Error
	return
}

func CreateContinueSchedule(schedule *models.ContinueSchedule) error {

	err := writeDb.Model(&schedule).Create(&schedule).Error
	return err
}

func GetExecutionFrequencyByName(name string, org_id int64) (ef models.ExecutionFrequencyDic, err error) {
	err = readDb.Model(&models.ExecutionFrequencyDic{}).Where("org_id = ? AND name = ?", org_id, name).First(&ef).Error
	return
}