package tools

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"io/ioutil"
	"strconv"
	"time"
)

func StringToInt64(e string) (int64, error) {
	return strconv.ParseInt(e, 10, 64)
}

func StringToInt(e string) (int, error) {
	return strconv.Atoi(e)
}

func GetTimestamp(change string) string {
	t, _ := time.Parse(time.RFC3339, change)
	timeUint := t.In(time.Local).Format("2006-01-02 15:04:05")
	return timeUint
}

func GetCurrntTimeStr() string {

	NowTimeZone := time.FixedZone("CST", 8*3600)
	//time.Local, _ = time.LoadLocation("Asia/Chongqing")
	//timelocal := time.LoadLocation("Asia/Chongqing")
	//time.Local = timelocal
	//time.LoadLocation("Asia/Chongqing")
	//return time.Now().Local().Format("2006-01-02 15:04:05")
	return time.Now().In(NowTimeZone).Format("2006-01-02 15:04:05")
}

func SubTimeSecond(inDate string) int64 {
	NowTimeZone := time.FixedZone("CST", 8*3600)
	timeLayout := "2006-01-02 15:04:05" //转化所需模板

	stamp, _ := time.ParseInLocation(timeLayout, inDate, time.Local)
	sr := stamp.Unix()
	timestamp := time.Now().In(NowTimeZone).Format("2006-01-02 15:04:05")
	now, _ := time.ParseInLocation(timeLayout, timestamp, time.Local)

	return now.Unix() - sr
}

//获取日期
func GetCurrntDateStr() string {
	NowTimeZone := time.FixedZone("CST", 8*3600)
	return time.Now().In(NowTimeZone).Format("2006-01-02")
}

func GetPayRemainingTime(inDate string) int64 {
	NowTimeZone := time.FixedZone("CST", 8*3600)
	timeLayout := "2006-01-02 15:04:05" //转化所需模板
	//fmt.Println("inDate = ", inDate)
	stamp, _ := time.ParseInLocation(timeLayout, inDate, time.Local)
	sr := stamp.Unix()
	timestamp := time.Now().In(NowTimeZone).Format("2006-01-02 15:04:05")
	now, _ := time.ParseInLocation(timeLayout, timestamp, time.Local)

	fmt.Println("sr = ", sr)
	fmt.Println("timestamp", now.Unix())
	return 900 - (now.Unix() - sr)
}

//输入日期减去当前日期
func InDateSubNow(inDate string) int64 {
	NowTimeZone := time.FixedZone("CST", 8*3600)
	timeLayout := "2006-01-02 15:04:05" //转化所需模板
	//fmt.Println("inDate = ", inDate)
	stamp, _ := time.ParseInLocation(timeLayout, inDate, time.Local)
	sr := stamp.Unix()
	timestamp := time.Now().In(NowTimeZone).Format("2006-01-02 15:04:05")
	now, _ := time.ParseInLocation(timeLayout, timestamp, time.Local)

	return sr - now.Unix()
}

//输入日期相减得出天数
func DateSubDate(startDate string, endDate string) (float64, error) {
	timeLayout := "2006-01-02" //转化所需模板
	start, err := time.ParseInLocation(timeLayout, startDate, time.Local)
	if err != nil {
		return 0, err
	}
	end, err := time.ParseInLocation(timeLayout, endDate, time.Local)
	if err != nil {
		return 0, err
	}
	return start.Sub(end).Hours(), nil

}

func TimeToStr(tm int64) string {

	timeLayout := "2006-01-02 15:04:05"
	// time.Unix的第二个参数传递0或10结果一样,因为都不大于1e9
	timeStr := time.Unix(tm, 0).Format(timeLayout)

	return timeStr

}

//加天数
func DateAdd(startDate string, num time.Duration) (string, error) {
	timeLayout := "2006-01-02" //转化所需模板
	start, err := time.ParseInLocation(timeLayout, startDate, time.Local)
	if err != nil {
		return "", err
	}
	return start.Add(num).Format("2006-01-02"), nil
}

func GetCurrntTime() time.Time {
	NowTimeZone := time.FixedZone("CST", 8*3600)
	return time.Now().In(NowTimeZone)
}

func GetNowTimeStamp() int64 {

	return time.Now().Unix()
}

func GetTimeStamp(timeIn string) (int64, error) {
	tm2, err := time.Parse("2006-01-02 15:04:05", timeIn)
	if err != nil {
		return 0, err
	}

	return tm2.Unix() - 8*3600, nil

}

func StructToJsonStr(e interface{}) (string, error) {
	if b, err := json.Marshal(e); err == nil {
		return string(b), err
	} else {
		return "", err
	}
}

func GetBodyString(c *gin.Context) (string, error) {
	body, err := ioutil.ReadAll(c.Request.Body)
	if err != nil {
		fmt.Printf("read body err, %v\n", err)
		return string(body), nil
	} else {
		return "", err
	}
}

func JsonStrToMap(e string) (map[string]interface{}, error) {
	var dict map[string]interface{}
	if err := json.Unmarshal([]byte(e), &dict); err == nil {
		return dict, err
	} else {
		return nil, err
	}
}

func StructToMap(data interface{}) (map[string]interface{}, error) {
	dataBytes, err := json.Marshal(data)
	if err != nil {
		return nil, err
	}
	mapData := make(map[string]interface{})
	err = json.Unmarshal(dataBytes, &mapData)
	if err != nil {
		return nil, err
	}
	return mapData, nil
}