package service

import (
	"XT_New/models"
	"bytes"
	"encoding/json"
	"fmt"
	"github.com/jinzhu/gorm"
	"io/ioutil"
	"net/http"
)

func SavePatientMessageInfo() (string, string) {

	//input := make(map[string]interface{})
	inputData := make(map[string]interface{})
	inputData["patType"] = "1"                  // 就诊凭证编号
	inputData["patIdNo"] = "440510199211080038" // 开始时间
	inputData["patName"] = "测试患者4 "             // 人员姓名

	inputData["patMobile"] = "13535547902" // 人员姓名
	inputData["patSex"] = "M"              // 人员姓名
	inputData["patMarriage"] = "1"         // 人员姓名
	inputData["birthday"] = "1992-10-23"   // 人员姓名
	inputData["patAddress"] = "11111"      // 人员姓名
	inputData["thirdPartyID"] = "6936"     // 人员姓名
	inputData["patAge"] = "30"             // 人员姓名
	//input["req"] = inputData

	var inputLog string
	bytesData, err := json.Marshal(inputData)
	inputLog = string(bytesData)
	fmt.Println(string(bytesData))
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	reader := bytes.NewReader(bytesData)
	var url string
	gdyb_url := "http://218.104.146.179:9091/esb/listener/savePatientMessageInfo"
	url = gdyb_url

	//url := "http://igb.hsa.gdgov.cn/ebus/gdyb_inf/poc/hsa/hgs/1101"
	request, err := http.NewRequest("GET", url, reader)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}

	request.Header.Set("Content-Type", "application/json;charset=UTF-8")
	request.Header.Set("code", "Xmrjyy")

	client := http.Client{}
	resp, err := client.Do(request)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	respBytes, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	fmt.Println(string(respBytes))
	str := string(respBytes)
	return str, inputLog

}

func SaveReg(reg models.Reg) (string, string) {

	//input := make(map[string]interface{})
	inputData := make(map[string]interface{})

	inputData["deptId"] = reg.DeptId
	inputData["clinicUnitId"] = ""
	inputData["healthCardNo"] = ""
	fmt.Println(reg.PatientId)
	inputData["patientId"] = reg.PatientId
	inputData["patientName"] = reg.PatientName
	inputData["idCardNo"] = reg.IdCardNo
	inputData["phone"] = ""
	inputData["doctorId"] = ""
	inputData["doctorLevelCode"] = ""
	inputData["regDate"] = reg.RegDate

	inputData["shiftCode"] = ""
	inputData["startTime"] = ""
	inputData["endTime"] = ""

	inputData["scheduleId"] = ""
	inputData["periodId"] = ""

	inputData["svObjectId"] = ""
	inputData["diseaseId"] = ""
	inputData["regFee"] = reg.RegFee

	inputData["treatFee"] = reg.TreatFee
	inputData["operatorId"] = reg.OperatorId
	inputData["remark"] = "血透"

	inputData["orderType"] = "0"
	inputData["clinicCode"] = ""
	inputData["infoSeq"] = ""

	//input["Request"] = inputData

	var inputLog string
	bytesData, err := json.Marshal(inputData)
	inputLog = string(bytesData)
	fmt.Println(string(bytesData))
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	reader := bytes.NewReader(bytesData)
	var url string
	gdyb_url := "http://218.104.146.179:9091/esb/listener/saveReg"
	url = gdyb_url

	//url := "http://igb.hsa.gdgov.cn/ebus/gdyb_inf/poc/hsa/hgs/1101"
	request, err := http.NewRequest("POST", url, reader)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}

	request.Header.Set("Content-Type", "application/json;charset=UTF-8")
	request.Header.Set("code", "Xmrjyy")

	client := http.Client{}
	resp, err := client.Do(request)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	respBytes, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	fmt.Println(string(respBytes))
	str := string(respBytes)
	return str, inputLog

}
func GetWaitPayDetail() (string, string) {

	//input := make(map[string]interface{})
	inputData := make(map[string]interface{})

	inputData["clinicSeq"] = "30445"              // 就诊凭证编号
	inputData["prescriptionId"] = ""              // 开始时间
	inputData["patientId"] = "701822660170096645" // 人员姓名

	var inputLog string
	bytesData, err := json.Marshal(inputData)
	inputLog = string(bytesData)
	fmt.Println(string(bytesData))
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	reader := bytes.NewReader(bytesData)
	var url string
	gdyb_url := "http://218.104.146.179:9091/esb/listener/getWaitPayDetail"
	url = gdyb_url

	//url := "http://igb.hsa.gdgov.cn/ebus/gdyb_inf/poc/hsa/hgs/1101"
	request, err := http.NewRequest("POST", url, reader)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}

	request.Header.Set("Content-Type", "application/json;charset=UTF-8")
	request.Header.Set("code", "Xmrjyy")

	client := http.Client{}
	resp, err := client.Do(request)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	respBytes, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	fmt.Println(string(respBytes))
	str := string(respBytes)
	return str, inputLog

}
func OpKeepAccounts(number string, cus []*models.NewCustomTwo) (string, string) {

	inputData := make(map[string]interface{})
	feedetail := make([]map[string]interface{}, 0)
	for _, item := range cus {
		feedetailInfo := make(map[string]interface{})
		feedetailInfo["itemCode"] = item.MedListCodg
		feedetailInfo["num"] = item.Cut
		feedetail = append(feedetail, feedetailInfo)
	}
	inputData["item"] = feedetail
	inputData["clinicSeq"] = number // 就诊凭证编号
	var inputLog string
	bytesData, err := json.Marshal(inputData)
	inputLog = string(bytesData)
	fmt.Println(string(bytesData))
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	reader := bytes.NewReader(bytesData)
	var url string
	gdyb_url := "http://218.104.146.179:9091/esb/listener/opKeepAccounts"
	url = gdyb_url

	request, err := http.NewRequest("POST", url, reader)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}

	request.Header.Set("Content-Type", "application/json;charset=UTF-8")
	request.Header.Set("code", "Xmrjyy")

	client := http.Client{}
	resp, err := client.Do(request)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	respBytes, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	fmt.Println(string(respBytes))
	str := string(respBytes)
	return str, inputLog

}
func OpCancelKeepAccounts(setl_id string, op_name string, op_code string) (string, string) {
	inputData := make(map[string]interface{})
	inputData["docId"] = setl_id
	inputData["operCode"] = "111"
	inputData["operName"] = "2222"
	var inputLog string
	bytesData, err := json.Marshal(inputData)
	inputLog = string(bytesData)
	fmt.Println(string(bytesData))
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	reader := bytes.NewReader(bytesData)
	var url string
	gdyb_url := "http://218.104.146.179:9091/esb/listener/opCancelKeepAccounts"
	url = gdyb_url
	request, err := http.NewRequest("POST", url, reader)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	request.Header.Set("Content-Type", "application/json;charset=UTF-8")
	request.Header.Set("code", "Xmrjyy")
	client := http.Client{}
	resp, err := client.Do(request)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	respBytes, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error(), ""
	}
	fmt.Println(string(respBytes))
	str := string(respBytes)
	return str, inputLog

}

func UpdateHisPatientStatus(his *models.VMHisPatient) {
	writeDb.Save(&his)
}

func GetUnSettleHisPrescriptionFive(org_id int64, patient_id int64, record_date int64, p_type int64) (prescription []*models.HisPrescription, err error) {
	err = readDb.Model(&models.HisPrescription{}).
		Preload("HisAdditionalCharge", func(db *gorm.DB) *gorm.DB {
			return db.Where("status = 1 AND user_org_id = ?", org_id).Preload("XtHisAddtionConfig", "status=1")
		}).
		Preload("HisDoctorAdviceInfo", func(db *gorm.DB) *gorm.DB {
			return db.Where("status = 1 AND user_org_id = ?", org_id).Preload("HisOrderInfo", "status = 1").Preload("Drug", "status=1")
		}).
		Preload("HisPrescriptionProject", func(db *gorm.DB) *gorm.DB {
			return db.Where("status = 1 AND user_org_id = ?", org_id).Preload("HisOrderInfo", "status = 1").Preload("HisProject").Preload("GoodInfo", "status=1").Preload("XtHisProjectTeam", "status = 1")
		}).Preload("TempHisOrder", func(db *gorm.DB) *gorm.DB {
		return db.Where("status = 1 AND user_org_id = ? AND order_status <> 3  AND order_status <> 2  ", org_id)
	}).
		Where("user_org_id = ? AND status = 1 AND record_date = ? AND patient_id = ? AND order_status <> 2 AND order_status <> 3 and order_status <> 5  AND p_type = ?", org_id, record_date, patient_id, p_type).
		Find(&prescription).Error
	return
}

func GetUnSettleMonthHisPrescription(org_id int64, patient_id int64, start_date int64, end_date int64) (prescription []*models.HisPrescription, err error) {
	err = readDb.Model(&models.HisPrescription{}).
		Preload("HisAdditionalCharge", func(db *gorm.DB) *gorm.DB {
			return db.Where("status = 1 AND user_org_id = ?", org_id).Preload("XtHisAddtionConfig", "status=1")
		}).
		Preload("HisDoctorAdviceInfo", func(db *gorm.DB) *gorm.DB {
			return db.Where("status = 1 AND user_org_id = ?", org_id).Preload("Drug", "status=1")
		}).
		Preload("HisPrescriptionProject", func(db *gorm.DB) *gorm.DB {
			return db.Where("status = 1 AND user_org_id = ?", org_id).Preload("HisProject").Preload("GoodInfo", "status=1").Preload("XtHisProjectTeam", "status = 1")
		}).
		Where("user_org_id = ? AND status = 1 AND record_date >= ? AND record_date <= ? AND patient_id = ? AND order_status <> 2 AND order_status <> 5 AND p_type <> 1", org_id, start_date, end_date, patient_id).
		Find(&prescription).Error
	return
}

func GetHisOrderFour(patient_id string, infoSeq string, docId string) (order models.HisOrder, err error) {
	if len(docId) > 0 {
		err = readDb.Model(&models.HisOrder{}).Where("mdtrt_id = ? AND psn_no = ? AND setl_id = ? AND status = 1", infoSeq, patient_id, docId).First(&order).Error
	} else {
		err = readDb.Model(&models.HisOrder{}).Where("mdtrt_id = ? AND psn_no = ? AND status = 1 ", infoSeq, patient_id).First(&order).Error
	}
	return
}
