package controller

import (
	"fmt"
	"glc/com"
	"glc/conf"
	"glc/gweb"
	"glc/ldb/status"
	"glc/ldb/sysmnt"
	"glc/ver"
	"time"

	"github.com/gotoeasy/glang/cmn"
)

var glcLatest string = ""
var glcOrigin string = ""

// 查询是否开启智能助手
func ChatAiController(req *gweb.HttpRequest) *gweb.HttpResult {
	return gweb.Result(conf.IsEnableChatAi())
}

// 查询是否测试模式
func TestModeController(req *gweb.HttpRequest) *gweb.HttpResult {
	return gweb.Result(conf.IsTestMode())
}

// 查询版本信息
func VersionController(req *gweb.HttpRequest) *gweb.HttpResult {
	rs := cmn.OfMap("version", ver.VERSION, "latest", glcLatest) // version当前版本号，latest最新版本号
	return gweb.Result(rs)
}

func SetOrigin(req *gweb.HttpRequest) {
	origin := req.GinCtx.GetHeader("Origin")
	if origin != "" {
		glcOrigin = origin
	}
}

// 查询日志仓名称列表
func StorageNamesController(req *gweb.HttpRequest) *gweb.HttpResult {
	if (!InWhiteList(req) && InBlackList(req)) || (conf.IsEnableLogin() && GetUsernameByToken(req.GetToken()) == "") {
		return gweb.Error403() // 黑名单检查、登录检查
	}

	rs := com.GetStorageNames(conf.GetStorageRoot(), ".sysmnt")
	return gweb.Result(rs)
}

// 查询系统名称列表
func SystemNamesController(req *gweb.HttpRequest) *gweb.HttpResult {
	if (!InWhiteList(req) && InBlackList(req)) || (conf.IsEnableLogin() && GetUsernameByToken(req.GetToken()) == "") {
		return gweb.Error403() // 黑名单检查、登录检查
	}

	if conf.IsEnableLogin() {
		username := GetUsernameByToken(req.GetToken())
		mnt := sysmnt.NewSysmntStorage()
		if username == conf.GetUsername() {
			names := mnt.GetSysUsernames()
			var all []string
			var m map[string]bool = make(map[string]bool)
			for i := 0; i < len(names); i++ {
				user := mnt.GetSysUser(names[i])
				if user != nil && user.Systems != "*" {
					ary := cmn.Split(user.Systems, ",")
					for j := 0; j < len(ary); j++ {
						if !m[cmn.ToLower(ary[j])] {
							m[cmn.ToLower(ary[j])] = true
							all = append(all, ary[j])
						}
					}
				}
			}
			return gweb.Result(all)
		} else {
			user := mnt.GetSysUser(username)
			if user != nil && user.Systems != "*" {
				return gweb.Result(cmn.Split(user.Systems, ",")) // 管理员及全部权限的用户以外，按设定的系统返回
			}
		}
	}

	return gweb.Ok() // 都有权限，不返回结果
}

// 查询日志仓信息列表
func StorageListController(req *gweb.HttpRequest) *gweb.HttpResult {
	token := req.GetToken()
	if (!InWhiteList(req) && InBlackList(req)) || (conf.IsEnableLogin() && GetUsernameByToken(token) == "") {
		return gweb.Error403() // 黑名单检查、登录检查
	}
	if conf.IsEnableLogin() {
		catchSession.Set(token, GetUsernameByToken(token)) // 会话重新计时
	}

	rs := sysmnt.GetStorageList()
	return gweb.Result(rs)
}

// 删除指定日志仓
func StorageDeleteController(req *gweb.HttpRequest) *gweb.HttpResult {
	if (!InWhiteList(req) && InBlackList(req)) || (conf.IsEnableLogin() && GetUsernameByToken(req.GetToken()) == "") {
		return gweb.Error403() // 黑名单检查、登录检查
	}

	name := req.GetFormParameter("storeName")
	if name == ".sysmnt" {
		return gweb.Error500("不能删除 .sysmnt")
	} else if conf.IsStoreNameAutoAddDate() {
		if conf.GetSaveDays() > 0 {
			ymd := cmn.Right(name, 8)
			if cmn.Len(ymd) == 8 && cmn.Startwiths(ymd, "20") {
				msg := fmt.Sprintf("当前是日志仓自动维护模式，最多保存 %d 天，不支持手动删除", conf.GetSaveDays())
				return gweb.Error500(msg)
			}
		}
	} else if name == "logdata" {
		return gweb.Error500("日志仓 " + name + " 正在使用，不能删除")
	}

	if status.IsStorageOpening(name) {
		return gweb.Error500("日志仓 " + name + " 正在使用，不能删除")
	}

	err := sysmnt.DeleteStorage(name)
	if err != nil {
		cmn.Error("日志仓", name, "删除失败", err)
		return gweb.Error500("日志仓 " + name + " 正在使用，不能删除")
	}

	cacheTime = time.Now().Add(-1 * time.Hour) // 让检索时不用缓存名，避免查询不存在的日志仓

	return gweb.Ok()
}

// 尝试查询最新版本号（注：服务不一定总是可用，每小时查取一次）
func init() {
	go func() {
		url := "https://glc.gotoeasy.top/glogcenter/current/version.json?v=" + ver.VERSION + "&h=" + cmn.Base62Encode(cmn.StringToBytes(glcOrigin))
		v := cmn.GetGlcLatestVersion(url)
		glcLatest = cmn.IifStr(v != "", v, glcLatest)
		ticker := time.NewTicker(time.Hour)
		for range ticker.C {
			url = "https://glc.gotoeasy.top/glogcenter/current/version.json?v=" + ver.VERSION + "&h=" + cmn.Base62Encode(cmn.StringToBytes(glcOrigin))
			v = cmn.GetGlcLatestVersion(url)
			glcLatest = cmn.IifStr(v != "", v, glcLatest)
		}
	}()
}
