package public
import (
	"os"
	"encoding/json"
	"bytes"
	"strings"
	"net"
	"bufio"
	"math/rand"
	"time"
	"os/exec"
	"io/ioutil"
	
	"golang.org/x/text/encoding/simplifiedchinese"
)
// 获取 环境变量
// 如果空 输出错误
// 但不退出
func GetEnv(e string) string{
	r := os.Getenv(e)
	PrintLog(e,"->",r)
	// 获取为空
	if r == "" {
		PrintLog("环境错误！")
	}
	return r
}
func GetEnvFqdn(s string)string{
	cmd,err := exec.Command("whoami","/fqdn").Output()
	if err !=nil {
		PrintLog(err)
	}
	out,err := simplifiedchinese.GBK.NewDecoder().Bytes(cmd)
	if err !=nil {
		PrintLog(err)
	}

	for _,each := range strings.Split(string(out),","){
		if strings.Index(each,s) != -1{
			return  each[3:]
		}
	}
	return ""
}
// 获取 消息内容
func ParseJsonHead(b []byte)string{
	//{"msgtype":"report","msgstate":"","username":"zhiweiadserver","computername":"ADSERVER","report":"下班"}
	// 提取第一个冒号后的第二位和第一个逗号的前一位
	// 也就是msgtype的内容
	msgtype := b[bytes.IndexByte(b,':')+2:bytes.IndexByte(b,',')-1]

	return string(msgtype)
}

// 解析Json 并放到变量中
func ParseJsonBody(unmsg []byte,v interface{}){
	// 填写
	if err := json.Unmarshal(unmsg,v) ;err != nil{
		PrintLog("Parse Json Error ",err)
	}
}

// Jsom 转 Byte
func JsonToByte(v interface{}) []byte{
	textbyte,err := json.Marshal(v)
	if err !=nil {
		PrintLog("Json to String Error ",v,err)
	}
	return textbyte
}

// 存在文件
func Exist(path string) bool {
	_, err := os.Stat(path)    	// os.Stat获取文件信息

	return  !os.IsNotExist(err)
}
// 不存在文件
func NotExist(path string) bool {
	_, err := os.Stat(path)    //os.Stat获取文件信息
	return os.IsNotExist(err)
}
// 是否为文件夹
func IsDir(path string) bool {
	s, err := os.Stat(path)
	if err != nil {
		return false
	}
	return s.IsDir()
}

// 是否为文件
func IsFile(path string) bool {
	return !IsDir(path)
}

func Mkdir(dir string){
	os.Mkdir(dir,os.ModeSetuid)
}
func WriteBytesFile(file string ,data []byte)error{
	return ioutil.WriteFile(file,data,os.ModeSetuid)
}
func CreateExtTempate(dist*string) []byte {
	base := BackupReplaceKey
	var ret bytes.Buffer
	file, err := os.Open(DocuBase + BackupVersion + "base"+BackupExtFile)
    if err != nil {
		PrintLog(err)
		return nil
    }
    defer file.Close()
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
		lineText := scanner.Bytes()
		if bytes.Index(lineText,base) != -1 {
			lineText = bytes.Replace(lineText,base, []byte(*dist),1)
		}
		ret.Write(lineText)
		ret.Write([]byte("\n"))
	}
	//PrintLog(ret.String())
	return ret.Bytes()
}

// 从连接中 获取ip
func GetConnIP(s net.Addr) string {
	return strings.Split(s.String(),":")[0]
}
// 
func PrimaryUser(s string) bool{
	if strings.Index(s,"zhiwei") == -1{
		return true
	}
	return false
}
// 随机
func Rand(i * int)int{
	rand.Seed(time.Now().UnixNano())
	return rand.Intn(*i)
}
func Delay(i int){
	PrintLog("Delay ",i)
	time.Sleep(time.Duration(i) * time.Second)
}
func RandDelay(i int){
	ri := Rand(&i)
	PrintLog("RandDelay ",ri)
	time.Sleep(time.Duration(ri) * time.Second)
}

func AdminUser( )bool{
	switch User_name{
	case AD_User_taotengfei:
		return true
	case AD_User_tengfei:
		return true
	case AD_User_main_admin:
		return true
	}
	return false
}
func TheUser(s  string)bool{
	if s == User_name || AdminUser() { return true}
	return false
}
func ReadDir(s string) ([]os.FileInfo,error){
	f,err := ioutil.ReadDir(s)
	return f,err
}
func GetNewestDir(rdir ,extdir string) string {
	f,err := ioutil.ReadDir(rdir)
	if err !=nil{
		PrintLog(err)

	}
	//var filearge := []byte
	firstModTime	:= f[0].ModTime()
	firstName		:= f[0].Name()
	for _,i  := range f{
		fileModTime := i.ModTime()
		filename 	:= i.Name()
		if i.IsDir() && i.Name() != extdir{
			if firstModTime.Before(fileModTime){
				firstModTime 	= fileModTime
				firstName		= filename
			}

		}
	}
	return firstName
}
func HasSuffix(str * string,sub string)bool{
	return strings.HasSuffix(*str,sub)
}
func TrimSuffix(str ,s string)string{
	return strings.TrimSuffix(str,s)
}
func Exit(){
	os.Exit(0)
}
func NowTimestamp() int64 {
	return time.Now().Unix()
}
func UnixTimeParse(t *int64) string {
	return time.Unix(*t,0).String()
}