package files

import (
	"encoding/base64"
	"encoding/json"
	"godo/libs"
	"net/http"
	"strconv"
	"strings"
)

func HandleReadFile(w http.ResponseWriter, r *http.Request) {

	// 初始值
	path := r.URL.Query().Get("path")
	basePath, err := libs.GetOsDir()
	if err != nil {
		libs.HTTPError(w, http.StatusInternalServerError, err.Error())
		return
	}
	// 非加密文件直接返回base64编码
	isHide := IsHaveHiddenFile(basePath, path)
	//Liuziwang888!@#
	if !isHide {
		fileContent, err := ReadFile(basePath, path)
		if err != nil {
			libs.HTTPError(w, http.StatusNotFound, err.Error())
			return
		}
		data := string(fileContent)
		if !strings.HasPrefix(data, "link::") {
			data = base64.StdEncoding.EncodeToString(fileContent)
		}
		resp := libs.APIResponse{Message: "success", Data: data}
		json.NewEncoder(w).Encode(resp)
		return
	}
	// 有隐藏文件说明这是一个加密过的文件,需要验证密码
	fPwd := r.Header.Get("pwd")
	if fPwd == "" {
		libs.HTTPError(w, http.StatusBadRequest, "密码不能为空")
		return
	}
	salt, err := GetSalt(r)
	if err != nil {
		libs.HTTPError(w, http.StatusInternalServerError, err.Error())
		return
	}
	if !CheckFilePwd(fPwd, salt) {
		libs.HTTPError(w, http.StatusBadRequest, "密码错误")
		return
	}
	// 密码正确则读取内容并解密
	fileContent, err := ReadFile(basePath, path)
	if err != nil {
		libs.HTTPError(w, http.StatusNotFound, err.Error())
		return
	}
	// 解密
	fileContent, err = libs.DecryptData(fileContent, libs.EncryptionKey)
	if err != nil {
		libs.HTTPError(w, http.StatusInternalServerError, err.Error())
		return
	}
	data := string(fileContent)
	if !strings.HasPrefix(data, "link::") {
		data = base64.StdEncoding.EncodeToString(fileContent)
	}
	resp := libs.APIResponse{Message: "success", Data: data}
	json.NewEncoder(w).Encode(resp)
}

// 设置文件密码
func HandleSetFilePwd(w http.ResponseWriter, r *http.Request) {
	fPwd := r.Header.Get("Pwd")
	salt, err := GetSalt(r) // 获取盐值
	// 处理获取盐值时的错误
	if err != nil || fPwd == "" {
		libs.HTTPError(w, http.StatusInternalServerError, err.Error())
		return
	}

	// 服务端再hash加密
	hashPwd := libs.HashPassword(fPwd, salt)

	// 服务端存储
	err = libs.SetConfigByName("filePwd", hashPwd)
	if err != nil {
		libs.HTTPError(w, http.StatusInternalServerError, err.Error())
		return
	}

	// salt值存储
	err = libs.SetConfigByName("salt", salt)
	if err != nil {
		libs.HTTPError(w, http.StatusInternalServerError, err.Error())
		return
	}
	res := libs.APIResponse{Message: "密码设置成功"}
	json.NewEncoder(w).Encode(res)
}

// 更改文件密码
func HandleChangeFilePwd(w http.ResponseWriter, r *http.Request) {
	filePwd := r.Header.Get("Pwd")
	salt, err := GetSalt(r)          // 获取盐值
	if err != nil || filePwd == "" { // 检查错误和密码是否为空
		libs.ErrorMsg(w, "参数错误")
		return
	}
	newPwd := libs.HashPassword(filePwd, salt)
	err = libs.SetConfigByName("filePwd", newPwd)
	if err != nil {
		libs.HTTPError(w, http.StatusInternalServerError, err.Error())
		return
	}
	libs.SuccessMsg(w, "success", "The file password change success!")
}

// 更改加密状态
func HandleSetIsPwd(w http.ResponseWriter, r *http.Request) {
	isPwd := r.URL.Query().Get("ispwd")
	// 0非加密机器 1加密机器
	isPwdValue, err := strconv.Atoi(isPwd)
	if err != nil {
		libs.HTTPError(w, http.StatusBadRequest, err.Error())
		return
	}
	var isPwdBool bool
	if isPwdValue == 0 {
		isPwdBool = false
	} else {
		isPwdBool = true
	}
	err = libs.SetConfigByName("isPwd", isPwdBool)
	if err != nil {
		libs.HTTPError(w, http.StatusInternalServerError, err.Error())
		return
	}
	libs.SuccessMsg(w, "success", "")
}