package misc

import (
	"bytes"
	"encoding/json"
	"fmt"
	"reflect"
	"strings"
	"time"

	"github.com/cuigh/auxo/data/guid"
	"github.com/cuigh/auxo/util/i18n"
)

var Funcs = map[string]interface{}{
	//"time": func(t time.Time) string {
	//	return t.Local().Format("2006-01-02 15:04:05")
	//},
	"join": strings.Join,
	"elem": func(i interface{}) interface{} {
		v := reflect.ValueOf(i)
		for v.Kind() == reflect.Ptr {
			v = v.Elem()
		}
		return v.Interface()
	},
	"trimZero": func(v interface{}) interface{} {
		s := fmt.Sprint(v)
		if s == "0" {
			return ""
		}
		return s
	},
	"trimPrefix": func(s, prefix string) string {
		return strings.TrimPrefix(s, prefix)
	},
}

func NewID() string {
	return guid.New().String()
}

func Message(lang string) func(key string, args ...interface{}) string {
	t, err := i18n.Find(lang, "en")
	if err != nil {
		panic(err)
	}
	if t == nil {
		panic("can't find language files")
	}

	return func(key string, args ...interface{}) string {
		if s := t.Format(key, args...); s != "" {
			return s
		}
		return "[" + key + "]"
	}
}

func FormatTime(offset int32) func(t time.Time) string {
	const layout = "2006-01-02 15:04:05"

	var loc *time.Location
	if offset == 0 {
		loc = time.Local
	} else {
		loc = time.FixedZone("", int(offset))
	}

	return func(t time.Time) string {
		return t.In(loc).Format(layout)
	}
}

func Page(count, pageIndex, pageSize int) (start, end int) {
	start = pageSize * (pageIndex - 1)
	end = pageSize * pageIndex
	if count < start {
		start, end = 0, 0
	} else if count < end {
		end = count
	}
	return
}

func JSONIndent(raw []byte) (s string, err error) {
	buf := &bytes.Buffer{}
	err = json.Indent(buf, raw, "", "    ")
	if err == nil {
		s = buf.String()
	}
	return
}
