package cmd

import (
	"encoding/json"
	"errors"
	"io/ioutil"
	"net/url"
	"os"
	"path/filepath"
	"strings"
	"time"

	"github.com/Masterminds/cookoo"
)

var cacheEnabled = true

var errCacheDisabled = errors.New("Cache disabled")

// EnsureCacheDir Creates the $HOME/.glide/cache directory (unless home is
// specified to be different) if it does not exist.
func EnsureCacheDir(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Interrupt) {
	home := p.Get("home", "").(string)
	if home == "" {
		cacheEnabled = false
		Warn("Unable to locate home directory")
		return false, nil
	}
	err := os.MkdirAll(filepath.Join(home, "cache", "info"), os.ModeDir|os.ModePerm)
	if err != nil {
		cacheEnabled = false
		Warn("Error creating Glide directory %s", home)
	}
	return false, nil
}

// Pass in a repo location and get a cache key from it.
func cacheCreateKey(repo string) (string, error) {

	// A url needs a scheme. A git repo such as
	// git@github.com:Masterminds/cookoo.git reworked to the url parser.
	c := strings.Contains(repo, "://")
	if !c {
		repo = "ssh://" + repo
	}

	u, err := url.Parse(repo)
	if err != nil {
		return "", err
	}

	if !c {
		u.Scheme = ""
	}

	var key string
	if u.Scheme != "" {
		key = u.Scheme + "-"
	}
	if u.User != nil && u.User.Username() != "" {
		key = key + u.User.Username() + "-"
	}
	key = key + u.Host
	if u.Path != "" {
		key = key + strings.Replace(u.Path, "/", "-", -1)
	}

	key = strings.Replace(key, ":", "-", -1)

	return key, nil
}

type cacheRepoInfo struct {
	DefaultBranch string `json:"default-branch"`
	LastUpdate    string `json:"last-update"`
}

func saveCacheRepoData(key string, data cacheRepoInfo, location string) error {
	if !cacheEnabled {
		return errCacheDisabled
	}
	data.LastUpdate = time.Now().String()
	d, err := json.Marshal(data)
	if err != nil {
		return err
	}

	p := filepath.Join(location, "cache", "info", key+".json")
	f, err := os.Create(p)
	if err != nil {
		return err
	}
	defer f.Close()

	_, err = f.Write(d)
	return err
}

func cacheRepoData(key, location string) (*cacheRepoInfo, error) {
	if !cacheEnabled {
		return &cacheRepoInfo{}, errCacheDisabled
	}
	c := &cacheRepoInfo{}
	p := filepath.Join(location, "cache", "info", key+".json")
	f, err := ioutil.ReadFile(p)
	if err != nil {
		return &cacheRepoInfo{}, err
	}
	err = json.Unmarshal(f, c)
	if err != nil {
		return &cacheRepoInfo{}, err
	}
	return c, nil
}
