package utils

import (
	"archive/zip"
	"bytes"
	"fmt"
	"io/ioutil"
	"os"
	"path"
	"strings"
	"time"

	"hack-browser-data/log"
)

const Prefix = "[x]: "

func IntToBool(a int) bool {
	switch a {
	case 0, -1:
		return false
	}
	return true
}

func BookMarkType(a int64) string {
	switch a {
	case 1:
		return "url"
	default:
		return "folder"
	}
}

func TimeStampFormat(stamp int64) time.Time {
	s1 := time.Unix(stamp, 0)
	if s1.Local().Year() > 9999 {
		return time.Date(9999, 12, 13, 23, 59, 59, 0, time.Local)
	}
	return s1
}

func TimeEpochFormat(epoch int64) time.Time {
	maxTime := int64(99633311740000000)
	if epoch > maxTime {
		return time.Date(2049, 1, 1, 1, 1, 1, 1, time.Local)
	}
	t := time.Date(1601, 1, 1, 0, 0, 0, 0, time.UTC)
	d := time.Duration(epoch)
	for i := 0; i < 1000; i++ {
		t = t.Add(d)
	}
	return t
}

func ReadFile(filename string) (string, error) {
	s, err := ioutil.ReadFile(filename)
	return string(s), err
}

func WriteFile(filename string, data []byte) error {
	err := ioutil.WriteFile(filename, data, 0644)
	if err != nil {
		return nil
	}
	return err
}

func FormatFileName(dir, browser, filename, format string) string {
	r := strings.Replace(strings.TrimSpace(strings.ToLower(browser)), " ", "_", -1)
	p := path.Join(dir, fmt.Sprintf("%s_%s.%s", r, filename, format))
	return p
}

func MakeDir(dirName string) error {
	if _, err := os.Stat(dirName); os.IsNotExist(err) {
		return os.Mkdir(dirName, 0700)
	}
	return nil
}

func Compress(exportDir string) error {
	files, err := ioutil.ReadDir(exportDir)
	if err != nil {
		log.Error(err)
	}
	var b = new(bytes.Buffer)
	zw := zip.NewWriter(b)
	for _, f := range files {
		fw, _ := zw.Create(f.Name())
		fileName := path.Join(exportDir, f.Name())
		fileContent, err := ioutil.ReadFile(fileName)
		if err != nil {
			zw.Close()
			return err
		}
		_, err = fw.Write(fileContent)
		if err != nil {
			zw.Close()
			return err
		}
		err = os.Remove(fileName)
		if err != nil {
			log.Error(err)
		}
	}
	if err := zw.Close(); err != nil {
		return err
	}
	zipName := exportDir + `/archive.zip`
	outFile, _ := os.Create(zipName)
	_, err = b.WriteTo(outFile)
	if err != nil {
		return err
	}
	fmt.Printf("%s Compress success, zip filename is %s \n", Prefix, zipName)
	return nil
}
