/***************************************************
 ** @Desc : This file for 共有方法
 ** @Time : 2019.04.01 11:48
 ** @Author : Joker
 ** @File : public_method
 ** @Last Modified by : Joker
 ** @Last Modified time: 2019-11-29 11:05:28
 ** @Software: GoLand
****************************************************/
package sys

import (
	"agent/sys/enum"
	"fmt"
	"math/rand"
	"os"
	"strconv"
	"strings"
	"time"
)

type PublicMethod struct{}

// 返回当前时间的字符串:2006-01-02 15:04:05
func (*PublicMethod) GetNowTime() string {
	return time.Now().Format("2006-01-02 15:04:05")
}

// 返回当前时间的字符串:20060102150405
func (*PublicMethod) GetNowTimeV2() string {
	return time.Now().Format("20060102150405")
}

// 返回格式化的字符串:2006-01-02 15:04:05
func (*PublicMethod) ParseDatetime(t time.Time) string {
	f := t.Format("2006-01-02 15:04:05")
	if strings.Compare("0001-01-01 00:00:00", f) == 0 {
		f = ""
	}
	return f
}

// 比较是否是同一天
func (*PublicMethod) IsSameDay(d string) (bool, string) {
	now := time.Now()
	parse, e := time.Parse("2006-01-02 15:04:05", d)
	if e != nil {
		return false, fmt.Sprintf("比较时间：%s 格式不对, %v", d, e)
	}
	year := now.Year()-parse.Year() == 0
	mouth := strings.Compare(now.Month().String(), parse.Month().String()) == 0
	day := now.Day()-parse.Day() == 0
	if year && mouth && day {
		return true, ""
	}
	return false, fmt.Sprintf("比较时间：%s 与今天不是同一天，当天收益清零", d)
}

// 在数字、大写字母、小写字母范围内生成num位的随机字符串
func (*PublicMethod) RandomString(length int) string {
	// 48 ~ 57 数字
	// 65 ~ 90 A ~ Z
	// 97 ~ 122 a ~ z
	// 一共62个字符，在0~61进行随机，小于10时，在数字范围随机，
	// 小于36在大写范围内随机，其他在小写范围随机
	rand.Seed(time.Now().UnixNano())
	result := make([]string, 0, length)
	for i := 0; i < length; i++ {
		t := rand.Intn(62)
		if t < 10 {
			result = append(result, strconv.Itoa(rand.Intn(10)))
		} else if t < 36 {
			result = append(result, string(rand.Intn(26)+65))
		} else {
			result = append(result, string(rand.Intn(26)+97))
		}
	}
	return strings.Join(result, "")
}

// 生成n位随机数字字符串
func (*PublicMethod) RandomIntOfString(length int) string {
	result := make([]string, 0, length)
	rand.Seed(time.Now().UnixNano())
	for i := 0; i < length; i++ {
		randInt := rand.Intn(10)
		result = append(result, strconv.Itoa(randInt))
	}
	return strings.Join(result, "")
}

// @Description: 返回当前操作数据库的状态
// @Author: Joker
// @Date: 2019.04.01 14:37
// @Param: code: 状态码,msg; 状态信息:url: 跳转地址; data: json内容
// @return: Json串
func (*PublicMethod) JsonFormat(code int, data interface{}, msg string, url string) (json map[string]interface{}) {
	if code == 9 {
		json = map[string]interface{}{
			"code": code,
			"data": data,
			"msg":  msg,
			"url":  url,
		}
	} else {
		json = map[string]interface{}{
			"code": code,
			"msg":  msg,
			"url":  url,
		}
	}
	return json
}

// 返回当前操作数据库的状态:成功/失败
func (*PublicMethod) GetDatabaseStatus(code int) map[string]interface{} {
	msg := enum.FailedString
	if code == enum.SuccessFlag {
		msg = enum.SuccessString
	}
	out := make(map[string]interface{})
	out["code"] = code
	out["msg"] = msg
	return out
}

// 格式化浮点数
func (*PublicMethod) FormatFloat64ToString(f float64) string {
	if f < 0 {
		f = 0
	}
	return fmt.Sprintf("%0.2f", f)
}

// 判断文件或文件夹是否存在
// 使用os.Stat()函数返回的错误值进行判断:
// 如果返回的错误为nil,说明文件或文件夹存在
// 如果返回的错误类型
// 使用os.IsNotExist()判断为true,说明文件或文件夹不存在
// 如果返回的错误为其它类型,则不确定是否在存在
func (*PublicMethod) PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}
