package service

import (
	"XT_New/models"
	"fmt"
	"github.com/jinzhu/gorm"
)

func GetSignPatients(orgId int64, keywords string, dateTime, schedule_type int64) (patients []*models.SignPatients, err error) {
	db := readDb.
		Table("xt_patients as p").Where("p.user_org_id=?", orgId).
		Preload("SignWeight", "user_org_id = ? AND record_date=? AND status = 1", orgId, dateTime).
		Preload("DialysisOrder", "user_org_id = ? and dialysis_date = ? AND status = 1  ", orgId, dateTime).
		Preload("Schedule", "user_org_id = ? and schedule_date=? and status = 1", orgId, dateTime).
		Preload("PredialysisEvaluation", "user_org_id = ? and  assessment_date = ?", orgId, dateTime)
	if len(keywords) > 0 {
		likekey := "%" + keywords + "%"
		db = db.Where("p.name LIKE ? OR p.dialysis_no LIKE ? OR first_letter LIKE ?", likekey, likekey, likekey)
	}
	db = db.Where("p.status=1")

	if schedule_type >= 1 && schedule_type <= 3 {
		db = db.Joins("JOIN xt_schedule AS s ON s.patient_id=p.id").Where("s.schedule_date = ? and s.schedule_type=? and s.status=1", dateTime, schedule_type)
	}
	err = db.Select("p.id, p.user_org_id, p.user_id, p.avatar, p.patient_type, p.dialysis_no, p.admission_number, p.source, p.lapseto, p.partition_id, p.bed_id, p.name, p.alias, p.gender, p.marital_status, p.id_card_no, p.birthday, p.reimbursement_way_id, p.health_care_type, p.health_care_no, p.health_care_due_date, p.height, p.blood_type, p.rh, p.health_care_due_alert_date, p.education_level, p.profession, p.phone, p.home_telephone, p.relative_phone, p.relative_relations, p.home_address, p.work_unit, p.unit_address, p.children, p.receiving_date, p.is_hospital_first_dialysis, p.first_dialysis_date, p.first_dialysis_hospital, p.predialysis_condition, p.pre_hospital_dialysis_frequency, p.pre_hospital_dialysis_times, p.hospital_first_dialysis_date, p.induction_period, p.initial_dialysis, p.total_dialysis, p.attending_doctor_id, p.head_nurse_id, p.evaluate, p.diagnose, p.remark, p.registrars_id, p.registrars, p.qr_code, p.binding_state, p.status, p.created_time, p.updated_time").Find(&patients).Error

	return
}

// GetSignPanels  签到称重班次休息
func GetSignPanels(orgid, dateTime int64) (map[int64]map[string]int64, error) {
	fmt.Println(dateTime)
	fmt.Println("世界的尽头")
	fmt.Println(orgid)
	panel := map[int64]map[string]int64{
		1: {"schedule": 0, "sign": 0, "before": 0, "after": 0},
		2: {"schedule": 0, "sign": 0, "before": 0, "after": 0},
		3: {"schedule": 0, "sign": 0, "before": 0, "after": 0},
	}
	var err error

	type schedule struct {
		ScheduleType int64
		ScheduleNums int64
	}

	var schedulePanels []schedule
	err = readDb.Model(&models.Schedule{}).Select("schedule_type, count(schedule_type) as schedule_nums").Where("schedule_date=? and user_org_id=? and status=?", dateTime, orgid, 1).Group("schedule_type").Scan(&schedulePanels).Error
	if err != nil {
		return panel, err
		fmt.Println("panel是什么", panel)
	}
	for _, schedulePanel := range schedulePanels {
		if _, exist := panel[schedulePanel.ScheduleType]; exist {
			panel[schedulePanel.ScheduleType]["schedule"] = schedulePanel.ScheduleNums
		}
	}

	type sign struct {
		ScheduleType int64
		SignNums     int64
	}

	var signPanels []sign
	err = readDb.Table("xt_assessment_before_dislysis as sw").Joins("JOIN xt_schedule as s ON s.patient_id = sw.patient_id").Select("count(sw.id) as sign_nums,s.schedule_type").Where("s.schedule_date = ? and sw.assessment_date = ? and s.user_org_id = ? and sw.status = 1 and s.status = 1", dateTime, dateTime, orgid).Group("s.schedule_type").Scan(&signPanels).Error

	if err != nil {
		return panel, err
	}
	fmt.Println("singpanels是什么东西", signPanels)
	for _, signPanel := range signPanels {
		if _, exist := panel[signPanel.ScheduleType]; exist {
			panel[signPanel.ScheduleType]["sign"] = signPanel.SignNums
		}
	}

	type befor struct {
		ScheduleType int64
		SignNums     int64
	}

	var befors []befor
	err = readDb.Table("xt_assessment_before_dislysis as sw").Joins("JOIN xt_schedule as s ON s.patient_id = sw.patient_id").Select("count(sw.id) as sign_nums,s.schedule_type").Where("s.schedule_date = ? and sw.assessment_date = ? and s.user_org_id = ? and sw.status = 1 and s.status = 1", dateTime, dateTime, orgid).Group("s.schedule_type").Scan(&befors).Error

	if err != nil {
		return panel, err
	}
	fmt.Println("singpanels是什么东西", befors)
	for _, signPanel := range befors {
		if _, exist := panel[signPanel.ScheduleType]; exist {
			panel[signPanel.ScheduleType]["before"] = signPanel.SignNums
		}
	}

	type after struct {
		ScheduleType int64
		AfterNums    int64
	}

	var afters []after
	err = readDb.Table("xt_assessment_after_dislysis as sw").Joins("JOIN xt_schedule as s ON s.patient_id = sw.patient_id").Select("count(sw.id) as after_nums,s.schedule_type").Where("s.schedule_date = ? and sw.assessment_date = ? and s.user_org_id = ? and sw.status = 1 and s.status = 1", dateTime, dateTime, orgid).Group("s.schedule_type").Scan(&afters).Error

	if err != nil {
		return panel, err
	}
	fmt.Println("after是什么东西", afters)
	for _, signPanel := range afters {
		if _, exist := panel[signPanel.ScheduleType]; exist {
			panel[signPanel.ScheduleType]["after"] = signPanel.AfterNums
		}
	}

	return panel, nil

}

func GetPatientDateSign(orgid, dateTime, patientId int64) (*models.SigninAndWeigh, error) {
	var sig models.SigninAndWeigh
	var err error
	err = readDb.Model(&models.SigninAndWeigh{}).Where("record_date = ? and patient_id=? and user_org_id=?", dateTime, patientId, orgid).First(&sig).Error
	fmt.Println("错误", err)
	if err == gorm.ErrRecordNotFound {
		return nil, nil
	}

	if err != nil {
		return nil, err
	}

	return &sig, nil
}

func EditPatientSign(m *models.SigninAndWeigh) error {
	var err error
	if m.ID > 0 {
		err = writeDb.Save(&m).Error
	} else {
		err = writeDb.Create(&m).Error
	}
	return err
}

func GetPatientInformationList(orgid, patientId int64, datetime int64) *models.PredialysisEvaluation {
	var pre models.PredialysisEvaluation
	err := readDb.Model(&models.PredialysisEvaluation{}).Where("patient_id=? and user_org_id=? and assessment_date =?", patientId, orgid, datetime).First(&pre).Error
	if err != nil {

	}
	return &pre
}

func GetPatientLastDryWeight(patient_id int64, org_id int64) (models.SgjPatientDryweight, error) {

	dryweight := models.SgjPatientDryweight{}
	err := readDb.Model(&models.SgjPatientDryweight{}).Where("patient_id = ? and user_org_id = ? and status =1", patient_id, org_id).Last(&dryweight).Error

	return dryweight, err
}

func GetInforByPatient(orgid, patientId int64, datetime int64) *models.AssessmentAfterDislysis {
	var ass models.AssessmentAfterDislysis
	err := readDb.Model(&models.AssessmentAfterDislysis{}).Where("patient_id=? and user_org_id=? and assessment_date=?", patientId, orgid, datetime).First(&ass).Error
	if err != nil {

	}

	return &ass
}

func SaveData(pre *models.PredialysisEvaluation, patientId int64, orgId int64) error {
	err := writeDb.Model(pre).Where("patient_id=? and user_org_id=?", patientId, orgId).Update(map[string]interface{}{"weight_before": pre.WeightBefore,
		"dry_weight": pre.DryWeight, "temperature": pre.Temperature, "pulse_frequency": pre.PulseFrequency, "breathing_rate": pre.BreathingRate, "systolic_blood_pressure": pre.SystolicBloodPressure, "diastolic_blood_pressure": pre.DiastolicBloodPressure}).Error
	return err
}

func Editdata(dis *models.AssessmentAfterDislysis, patientId int64, orgId int64) error {
	err := writeDb.Model(dis).Where("patient_id=? and user_org_id=?", patientId, orgId).Update(map[string]interface{}{"weight_after": dis.WeightAfter,
		"dry_weight": dis.DryWeight, "temperature": dis.Temperature, "pulse_frequency": dis.PulseFrequency, "breathing_rate": dis.BreathingRate, "systolic_blood_pressure": dis.SystolicBloodPressure, "diastolic_blood_pressure": dis.DiastolicBloodPressure}).Error

	return err
}

func Savesignweigh(sw *models.SignWeight) error {
	var err error
	err = writeDb.Create(&sw).Error
	return err
}
func Updatesignweigh(sw *models.SignWeight, patientId int64, orgId int64) error {
	writeDb.Model(sw).Where("patient_id=? and user_org_id=?", patientId, orgId).Update(map[string]interface{}{"sign_time": sw.SignTime,
		"record_date": sw.RecordDate, "weightbefore": sw.WeightBefore, "dry_weight_before": sw.DryWeightBefore, "temperature_before": sw.TemperatureBefore,
		"pulse_frequency_before": sw.PulseFrequencyBefore, "breathing_rate_before": sw.BreathingRateBefore, "systolic_blood_pressure_before": sw.SystolicBloodPressureBefore,
		"diastolic_blood_pressure_before": sw.DiastolicBloodPressureBefore, "weightafter": sw.WeightAfter, "temperature_after": sw.TemperatureAfter, "pulse_frequency_after": sw.PulseFrequencyAfter,
		"breathing_rate_after": sw.BreathingRateAfter, "systolic_blood_pressure_after": sw.SystolicBloodPressureAfter, "diastolic_blood_pressure_after": sw.DiastolicBloodPressureAfter,
		"status": sw.Status, "created_time": sw.CreatedTime, "weigh_before_time": sw.WeighBeforeTime, "weigh_time": sw.WeighTime})
	return err
}

func GetSign(orgid, dateTime, patientId int64) (*models.SignWeight, error) {
	var sigs models.SignWeight
	var err error
	err = readDb.Model(&models.SignWeight{}).Where("record_date = ? and patient_id=? and user_org_id = ?", dateTime, patientId, orgid).First(&sigs).Error
	fmt.Println("错误", err)
	if err == gorm.ErrRecordNotFound {

		return nil, err
	}
	if err != nil {
		return nil, err
	}
	return &sigs, nil
}

func GetSignweigh(orgid, patientId int64) *models.SignWeight {
	var sw models.SignWeight
	err := readDb.Model(&models.SignWeight{}).Where("patient_id=? and user_org_id =?", patientId, orgid).First(&sw).Error
	if err != nil {

	}
	return &sw
}

func GetDislysisBerfore(orgid, dateTime, patientId int64) (*models.PredialysisEvaluation, error) {
	var pre models.PredialysisEvaluation
	var err error
	err = readDb.Model(&models.PredialysisEvaluation{}).Where("assessment_date =? and patient_id =? and user_org_id = ?", dateTime, patientId, orgid).Find(&pre).Error
	fmt.Println("错误", err)
	if err == gorm.ErrRecordNotFound {
		return nil, err
	}
	if err != nil {
		return nil, err
	}
	return &pre, nil

}

func SaveDislysisiBefore(pre *models.PredialysisEvaluation) error {
	var err error
	err = writeDb.Create(&pre).Error
	return err
}

func UpdataDislysisiBefore(pre *models.PredialysisEvaluation, patientId int64, orgId int64, datatime int64) error {
	writeDb.Model(pre).Where("patient_id=? and user_org_id=? and assessment_date =?", patientId, orgId, datatime).Update(map[string]interface{}{"weight_before": pre.WeightBefore,
		"dry_weight": pre.DryWeight, "temperature": pre.Temperature, "pulse_frequency": pre.PulseFrequency, "systolic_blood_pressure": pre.SystolicBloodPressure, "diastolic_blood_pressure": pre.DiastolicBloodPressure, "status": 1})
	return err
}

func GetAssessmentaafterdislysis(orgid, dateTime, patientId int64) (*models.AssessmentAfterDislysis, error) {
	var ass models.AssessmentAfterDislysis
	var err error
	err = readDb.Model(&models.AssessmentAfterDislysis{}).Where("assessment_date =? and patient_id =? and user_org_id = ?", dateTime, patientId, orgid).Find(&ass).Error
	fmt.Println("错误", err)
	if err == gorm.ErrRecordNotFound {
		return nil, err
	}
	if err != nil {
		return nil, err
	}
	return &ass, nil
}
func SaveAssessmentafter(ass *models.AssessmentAfterDislysis) error {
	var err error
	err = writeDb.Create(&ass).Error
	return err
}

func UpdataAssessment(ass *models.AssessmentAfterDislysis, patientId int64, orgId int64, datetime int64) error {
	writeDb.Model(ass).Where("patient_id=? and user_org_id=? and assessment_date=? ", patientId, orgId, datetime).Update(map[string]interface{}{"weight_after": ass.WeightAfter,
		"dry_weight": ass.DryWeight, "temperature": ass.Temperature, "pulse_frequency": ass.PulseFrequency, "systolic_blood_pressure": ass.SystolicBloodPressure, "diastolic_blood_pressure": ass.DiastolicBloodPressure, "status": 1})
	return err
}

func GetForenoonData(dataTime int64, orgid int64, scheduleType int64) (total int64, schedule []*models.Schedule, err error) {
	err = readDb.Count(total).Where("schedule_date = ? AND user_org_id = ? AND schedule_type = ?", dataTime, orgid, scheduleType).Find(&scheduleType).Error
	fmt.Println("heeeeeeeeeehhhhh", err)
	return total, schedule, err
}