package main

import (
	"encoding/json"
	"io/ioutil"
	"net/http"

	"kumoly.io/tools/configui/configui"
)

func ListFiles(w http.ResponseWriter, r *http.Request) {
	data, err := json.Marshal(files)
	if err != nil {
		AbortError(w, err)
		return
	}
	w.Write(data)
}

func GetFile(w http.ResponseWriter, r *http.Request) {
	name := r.URL.Query().Get("name")
	file, ok := files[name]
	if name == "" || !ok {
		MakeResponse(w, 404, []byte("file not found"))
		return
	}
	data, err := file.Read()
	if err != nil {
		AbortError(w, err)
		return
	}
	response, err := json.Marshal(map[string]string{
		"path":   file.Path,
		"name":   file.Alias,
		"action": file.Action,
		"data":   string(data),
	})
	if err != nil {
		AbortError(w, err)
		return
	}
	w.Header().Set("Content-Type", "application/json")
	w.Write(response)
}

func PostFile(w http.ResponseWriter, r *http.Request) {
	data, err := ioutil.ReadAll(r.Body)
	r.Body.Close()
	if err != nil {
		AbortError(w, err)
		return
	}
	f := configui.File{}
	if err := json.Unmarshal(data, &f); err != nil {
		AbortError(w, err)
		return
	}
	file, ok := files[f.Alias]
	if !ok {
		MakeResponse(w, 404, []byte("file not found"))
		return
	}
	if err := file.Write([]byte(f.Data)); err != nil {
		AbortError(w, err)
		return
	}
	w.Write([]byte("ok"))
}

func Apply(w http.ResponseWriter, r *http.Request) {
	name := r.URL.Query().Get("name")
	file, ok := files[name]
	if name == "" || !ok {
		MakeResponse(w, 404, []byte("file not found"))
		return
	}
	result, err := file.Do()
	if err != nil {
		AbortError(w, err)
		return
	}
	w.Write([]byte(result))
}

func Download(w http.ResponseWriter, r *http.Request) {
	fs := []string{}
	for _, v := range files {
		fs = append(fs, v.Path)
	}
	w.Header().Set("Content-Disposition", `attachment; filename="export.tar.gz"`)
	bundle(w, fs, false)
}

func LoadConfig(w http.ResponseWriter, r *http.Request) {
	data, err := ioutil.ReadAll(r.Body)
	r.Body.Close()
	if err != nil {
		AbortError(w, err)
		return
	}
	ftmp, err := configui.ReadConfig(string(data))
	if err != nil {
		AbortError(w, err)
		return
	}
	files = configui.GetFileMap(ftmp)
	w.Write([]byte("ok"))
}

func getConfigHandler(w http.ResponseWriter, r *http.Request) {
	data, err := GetConfig()
	if err != nil {
		AbortError(w, err)
		return
	}
	w.Write(data)
}

func GetConfig() ([]byte, error) {
	config := []configui.File{}
	for _, f := range files {
		config = append(config, *f)
	}
	return json.Marshal(config)
}
