package controllers

import (
	"XT_New/enums"
	"XT_New/models"
	"XT_New/service"
	"encoding/json"
	"fmt"
	"os"
	"path"
	"runtime"
	"strings"
	"time"

	"github.com/astaxie/beego"
)

type PublicApiController struct {
	BaseAPIController
}

func PublicApiRegistRouters() {
	beego.Router("/api/public/getadviceconfig", &PublicApiController{}, "Get:GetDoctorAdviceConfig")
	beego.Router("/api/public/servertime", &PublicApiController{}, "Get:GetServerTime")
	beego.Router("/api/app/release", &PublicApiController{}, "Get:AppRelease")
	beego.Router("/api/get", &PublicApiController{}, "Get:GetJson")

	beego.Router("/api/public/handledata", &PublicApiController{}, "get:HandleData")

}

func (c *PublicApiController) GetDoctorAdviceConfig() {
	drugs, _, _ := service.GetPublicDrugDics()
	drugways, _, _ := service.GetPublicDrugWayDics()
	efs, _, _ := service.GetPublicExecutionFrequencyDics()

	c.ServeSuccessJSON(map[string]interface{}{
		"drugs":    drugs,
		"drugways": drugways,
		"efs":      efs,
	})
}

func (c *PublicApiController) GetServerTime() {
	timeNow := time.Now()
	timeNowStamp := timeNow.Unix()
	timeNowStr := timeNow.Format("2006-01-02 15:04:05")
	c.ServeSuccessJSON(map[string]interface{}{
		"time":      timeNowStr,
		"timestamp": timeNowStamp,
	})
}

func (c *PublicApiController) AppRelease() {
	// appId := c.GetString("appid")
	version := c.GetString("version")
	appType, _ := c.GetInt64("app_type", 0)

	appVersion, err := service.GetAppVersionByAppType(appType)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	if appVersion == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"version": nil,
			"state":   2,
		})
		return
	}

	state := strings.Compare(version, appVersion.Version)
	// state := 1

	if state < 0 {
		c.ServeSuccessJSON(map[string]interface{}{
			"version": appVersion,
			"state":   appVersion.Status,
		})
		return
	}
	c.ServeSuccessJSON(map[string]interface{}{
		"version": nil,
		"state":   2,
	})
	return

}

func (this *PublicApiController) GetJson() {
	type Global struct {
		DeviceSN        string
		Version         string
		Timestamp       string
		InterfaceSource string
	}
	type RBPResultModel struct {
		Sys         string
		Dia         string
		HR          string
		MeasureTime string
	}

	type ScannerResultModel struct {
		Code string
	}

	type IDCardResultModel struct {
		IDCardNo         string
		UserName         string
		Age              string
		Female           string
		Male             string
		SocialSecurityNo string
	}

	type JsonTemp struct {
		Global             Global
		RBPResultModel     RBPResultModel
		ScannerResultModel ScannerResultModel
		IDCardResultModel  IDCardResultModel
	}

	var person JsonTemp
	err3 := json.Unmarshal([]byte(this.GetString("params")), &person)
	fmt.Println(err3)

	fmt.Println(person.Global)

	//temp := JsonTemp{
	//	Global:Global{
	//		DeviceSN:"1122",
	//		Version:"1122",
	//		Timestamp:"1222",
	//		InterfaceSource:"1233",
	//	},
	//	RBPResultModel: RBPResultModel{
	//		Sys:"12",
	//		Dia:"22",
	//		HR:"23",
	//		MeasureTime:"123",
	//	},
	//	ScannerResultModel:ScannerResultModel{
	//		Code:"1233",
	//	},
	//	IDCardResultModel:IDCardResultModel{
	//		IDCardNo:"123",
	//		UserName:"123",
	//		Age:"123",
	//		Female:"123",
	//		Male:"123",
	//		SocialSecurityNo:"123",
	//	},
	//}
	//
	//jsonBytes, err := json.Marshal(temp)
	//if err != nil {
	//	fmt.Println(err)
	//}
	//fmt.Println(string(jsonBytes))

}

func (c *PublicApiController) HandleData() {
	//org_app, _ := service.GetAllAppOrg()
	//org_role, _ := service.GetAllRole()
	//
	//var org_ids []int64

	//for _, apps := range org_app {
	//	xt_org_app, _ := service.GetAppByType(int64(apps.OrgId), 3)
	//	scrm_org_app, _ := service.GetAppByType(int64(apps.OrgId), 1)
	//	cdm_org_app, _ := service.GetAppByType(int64(apps.OrgId), 4)
	//	mall_org_app, _ := service.GetAppByType(int64(apps.OrgId), 5)
	//	org_app_6, _ := service.GetAppByType(int64(apps.OrgId), 6)
	//	org_app_7, _ := service.GetAppByType(int64(apps.OrgId), 7)
	//	org_app_8, _ := service.GetAppByType(int64(apps.OrgId), 8)
	//	org_app_9, _ := service.GetAppByType(int64(apps.OrgId), 9)
	//	org_app_10, _ := service.GetAppByType(int64(apps.OrgId), 10)
	//	org_app_11, _ := service.GetAppByType(int64(apps.OrgId), 11)
	//	org_app_12, _ := service.GetAppByType(int64(apps.OrgId), 12)
	//	org_app_13, _ := service.GetAppByType(int64(apps.OrgId), 13)
	//	org_app_14, _ := service.GetAppByType(int64(apps.OrgId), 14)
	//	org_app_15, _ := service.GetAppByType(int64(apps.OrgId), 15)
	//
	//	var xt_temp_org_app *models.OrgApp
	//	var mall_temp_org_app *models.OrgApp
	//
	//	if xt_org_app == nil || xt_org_app.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//
	//		app, _ := service.GetOrgAppA(0, 3)
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//		app.Id = 0
	//		app.OrgId = apps.OrgId
	//		app.Creator = int(org.Creator)
	//		app.Number = 0
	//		app.Status = 1
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		service.CreateOrgApp(app)
	//		xt_temp_org_app = app
	//	} else {
	//
	//		xt_temp_org_app = xt_org_app
	//
	//	}
	//
	//	if scrm_org_app == nil || scrm_org_app.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//
	//		app, _ := service.GetOrgAppA(0, 1)
	//		//org, _ := service.GetOrgById(int64(12))
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//
	//		app.OrgId = apps.OrgId
	//		app.Id = 0
	//
	//		app.Creator = int(org.Creator)
	//		app.Number = 0
	//		app.Status = 1
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		service.CreateOrgApp(app)
	//
	//	}
	//
	//	if cdm_org_app == nil || cdm_org_app.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//		app, _ := service.GetOrgAppA(0, 4)
	//		//org, _ := service.GetOrgById(int64(12))
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//
	//		app.OrgId = apps.OrgId
	//		app.Creator = int(org.Creator)
	//		app.Number = 0
	//		app.Id = 0
	//
	//		app.Status = 1
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		service.CreateOrgApp(app)
	//	}
	//
	//	if mall_org_app == nil || mall_org_app.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//		app, _ := service.GetOrgAppA(0, 5)
	//		//org, _ := service.GetOrgById(int64(12))
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//		app.OrgId = apps.OrgId
	//		app.Creator = int(org.Creator)
	//		app.Number = 0
	//		app.Id = 0
	//
	//		app.Status = 1
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		service.CreateOrgApp(app)
	//		mall_temp_org_app = app
	//	} else {
	//		mall_temp_org_app = mall_org_app
	//	}
	//
	//	if org_app_6 == nil || org_app_6.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//		app, _ := service.GetOrgAppA(0, 6)
	//		//org, _ := service.GetOrgById(int64(12))
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//
	//		app.OrgId = apps.OrgId
	//		app.Creator = int(org.Creator)
	//		app.Number = 1
	//		app.Id = 0
	//
	//		app.Status = 1
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		app.Pid = xt_temp_org_app.Id
	//		service.CreateOrgApp(app)
	//
	//	}
	//	if org_app_7 == nil || org_app_7.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//		app, _ := service.GetOrgAppA(0, 7)
	//		//org, _ := service.GetOrgById(int64(12))
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//
	//		app.OrgId = apps.OrgId
	//		app.Creator = int(org.Creator)
	//		app.Number = 2
	//		app.Status = 2
	//		app.Id = 0
	//
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		app.Pid = xt_temp_org_app.Id
	//
	//		service.CreateOrgApp(app)
	//	}
	//	if org_app_8 == nil || org_app_8.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//		app, _ := service.GetOrgAppA(0, 8)
	//		//org, _ := service.GetOrgById(int64(12))
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//
	//		app.OrgId = apps.OrgId
	//		app.Creator = int(org.Creator)
	//		app.Number = 3
	//		app.Id = 0
	//
	//		app.Pid = mall_temp_org_app.Id
	//
	//		app.Status = 1
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		service.CreateOrgApp(app)
	//	}
	//	if org_app_9 == nil || org_app_9.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//		app, _ := service.GetOrgAppA(0, 9)
	//		//org, _ := service.GetOrgById(int64(12))
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//
	//		app.OrgId = apps.OrgId
	//		app.Pid = xt_temp_org_app.Id
	//
	//		app.Creator = int(org.Creator)
	//		app.Number = 4
	//		app.Id = 0
	//
	//		app.Status = 1
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		service.CreateOrgApp(app)
	//
	//	}
	//	if org_app_10 == nil || org_app_10.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//		app, _ := service.GetOrgAppA(0, 10)
	//		//org, _ := service.GetOrgById(int64(12))
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//
	//		app.OrgId = apps.OrgId
	//		app.Creator = int(org.Creator)
	//		app.Pid = xt_temp_org_app.Id
	//
	//		app.Number = 5
	//		app.Id = 0
	//
	//		app.Status = 1
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		service.CreateOrgApp(app)
	//	}
	//	if org_app_11 == nil || org_app_11.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//		app, _ := service.GetOrgAppA(0, 11)
	//		//org, _ := service.GetOrgById(int64(12))
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//
	//		app.OrgId = apps.OrgId
	//		app.Creator = int(org.Creator)
	//		app.Pid = xt_temp_org_app.Id
	//		app.Id = 0
	//
	//		app.Number = 6
	//		app.Status = 1
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		service.CreateOrgApp(app)
	//	}
	//	if org_app_12 == nil || org_app_12.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//		app, _ := service.GetOrgAppA(0, 12)
	//		//org, _ := service.GetOrgById(int64(12))
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//
	//		app.OrgId = apps.OrgId
	//		app.Creator = int(org.Creator)
	//		app.Pid = xt_temp_org_app.Id
	//		app.Number = 7
	//		app.Status = 1
	//		app.Id = 0
	//
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		service.CreateOrgApp(app)
	//	}
	//	if org_app_13 == nil || org_app_13.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//		app, _ := service.GetOrgAppA(0, 13)
	//		//org, _ := service.GetOrgById(int64(12))
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//
	//		app.OrgId = apps.OrgId
	//		app.Creator = int(org.Creator)
	//		app.Pid = xt_temp_org_app.Id
	//		app.Number = 8
	//		app.Id = 0
	//		app.Status = 1
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		service.CreateOrgApp(app)
	//	}
	//	if org_app_14 == nil || org_app_14.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//		app, _ := service.GetOrgAppA(0, 14)
	//		//org, _ := service.GetOrgById(int64(12))
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//
	//		app.OrgId = apps.OrgId
	//		app.Creator = int(org.Creator)
	//		app.Pid = xt_temp_org_app.Id
	//		app.Id = 0
	//		app.Number = 9
	//		app.Status = 1
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		service.CreateOrgApp(app)
	//	}
	//
	//	if org_app_15 == nil || org_app_15.Id == 0 { //判断之前是否有创建该app类型，如果没有则插入数据
	//		app, _ := service.GetOrgAppA(0, 15)
	//		//org, _ := service.GetOrgById(int64(12))
	//		org, _ := service.GetOrgByIdB(int64(apps.OrgId))
	//		if org == nil || org.Id == 0 {
	//			continue
	//		}
	//
	//		app.OrgId = apps.OrgId
	//		app.Creator = int(org.Creator)
	//		app.Pid = xt_temp_org_app.Id
	//		app.Number = 10
	//		app.Status = 1
	//		app.Id = 0
	//		app.ModifyTime = time.Now().Unix()
	//		app.CreateTime = time.Now().Unix()
	//		service.CreateOrgApp(app)
	//	}
	//}

	//for _, role := range org_role {
	//	org_ids = append(org_ids, role.OrgId)
	//}
	//
	//
	////创建内置角色
	//InitRoleAndPurviews(org_ids)

	//var org_id int = 0
	//管理员
	//app_roles  := service.GetAllUserRoleByUserTypeOne(org_id)
	//for _, item := range app_roles{
	//	var ids string
	//	if len(item.RoleIds) == 0{
	//		ids = strconv.FormatInt( item.RoleId,10)
	//	}else{
	//		ids = item.RoleIds + ","+strconv.FormatInt( item.RoleId,10)
	//	}
	//	service.UpdateRoleIds(item.Id, ids)
	//}
	//护士医生
	//app_roles2  := service.GetAllUserRoleByUserTypeOther()
	//	for _, item := range app_roles2{
	//		var ids string
	//		if len(item.RoleIds) == 0{
	//			ids = strconv.FormatInt( item.RoleId,10)
	//		}else{
	//			ids = item.RoleIds + ","+strconv.FormatInt( item.RoleId,10)
	//		}
	//		if item.UserType == 2{
	//			role := service.FindRoleByUserTypeOne(item.OrgId)
	//			ids = ids +"," + strconv.FormatInt(role.Id,10)
	//
	//		} else if item.UserType == 3{
	//			role := service.FindRoleByUserTypeTwo(item.OrgId)
	//			ids = ids +"," + strconv.FormatInt(role.Id,10)
	//		}
	//		service.UpdateRoleIds(item.Id, ids)
	//	}
	//c.ServeSuccessJSON(map[string]interface{}{
	//	"msg": "ok",
	//})

}

func InitRoleAndPurviews(org_ids []int64) {
	roles := LoadRoleConfig("./role.json").Roles
	for _, org_id := range org_ids {
		app, _ := service.GetOrgAppB(org_id, 3)
		role, _ := service.GetSystemRole(org_id)

		if app == nil || app.Id == 0 {
			continue
		}
		if len(role) == 0 {
			for _, item := range roles {
				role := &models.Role{
					RoleName:     item.RoleName,
					RoleIntro:    item.RoleIntroduction,
					Creator:      0,
					OrgId:        org_id,
					AppId:        app.Id,
					IsSuperAdmin: false,
					Status:       1,
					CreateTime:   time.Now().Unix(),
					ModifyTime:   time.Now().Unix(),
					Number:       item.Number,
					IsSystem:     item.IsSystem,
				}
				err := service.CreateOrgRoleB(role)
				if err == nil {
					purview := &models.RolePurview{
						RoleId:     role.Id,
						OrgId:      org_id,
						AppId:      role.AppId,
						PurviewIds: item.PurviewIds,
						Status:     1,
						CreateTime: time.Now().Unix(),
						ModifyTime: time.Now().Unix(),
					}
					func_purview := &models.SgjUserRoleFuncPurview{
						RoleId:     role.Id,
						OrgId:      org_id,
						AppId:      role.AppId,
						PurviewIds: item.FuncIds,
						Status:     1,
						Ctime:      time.Now().Unix(),
						Mtime:      time.Now().Unix(),
					}

					service.CreateRolePurviewB(purview)
					service.CreateFuncRolePurviewB(func_purview)
				}
			}

		}
	}

}

type RoleConfig struct {
	Roles []*models.VMUserRoleAndPurview "json:roles"
}

func LoadRoleConfig(dataFile string) *RoleConfig {
	var config RoleConfig
	_, filename, _, _ := runtime.Caller(1)
	datapath := path.Join(path.Dir(filename), dataFile)
	config_file, err := os.Open(datapath)
	if err != nil {
		emit("Failed to open config file '%s': %s\n", datapath, err)
		return &config
	}

	fi, _ := config_file.Stat()

	buffer := make([]byte, fi.Size())
	_, err = config_file.Read(buffer)

	buffer, err = StripComments(buffer) //去掉注释
	if err != nil {
		emit("Failed to strip comments from json: %s\n", err)
		return &config
	}

	buffer = []byte(os.ExpandEnv(string(buffer))) //特殊
	err = json.Unmarshal(buffer, &config)         //解析json格式数据
	if err != nil {
		emit("Failed unmarshalling json: %s\n", err)
		return &config
	}
	return &config
}
