package router



import (

	"encoding/json"

	"fmt"

	"net/http"

	"os"



	"bilidown/util"

	"bilidown/util/res_error"

)



func API() *http.ServeMux {

	router := http.NewServeMux()

	router.HandleFunc("/getVideoInfo", getVideoInfo)

	router.HandleFunc("/getSeasonInfo", getSeasonInfo)

	router.HandleFunc("/getQRInfo", getQRInfo)

	router.HandleFunc("/getQRStatus", getQRStatus)

	router.HandleFunc("/checkLogin", checkLogin)

	router.HandleFunc("/getPlayInfo", getPlayInfo)

	router.HandleFunc("/createTask", createTask)

	router.HandleFunc("/getActiveTask", getActiveTask)

	router.HandleFunc("/getTaskList", getTaskList)

	router.HandleFunc("/showFile", showFile)

	router.HandleFunc("/getFields", getFields)

	router.HandleFunc("/saveFields", saveFields)

	router.HandleFunc("/logout", logout)

	router.HandleFunc("/quit", quit)

	router.HandleFunc("/getPopularVideos", getPopularVideos)

	router.HandleFunc("/deleteTask", deleteTask)

	router.HandleFunc("/getRedirectedLocation", getRedirectedLocation)

	router.HandleFunc("/downloadVideo", downloadVideo)

	router.HandleFunc("/getSeasonsArchivesListFirstBvid", getSeasonsArchivesListFirstBvid)

	router.HandleFunc("/getFavList", getFavList)

	return router

}



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

	if r.ParseForm() != nil {

		res_error.Send(w, res_error.ParamError)

		return

	}

	url := r.FormValue("url")

	if !util.IsValidURL(url) {

		res_error.Send(w, res_error.URLFormatError)

		return

	}

	if location, err := util.GetRedirectedLocation(url); err != nil {

		res_error.Send(w, res_error.NoLocationError)

		return

	} else {

		util.Res{Success: true, Message: "获取成功", Data: location}.Write(w)

		return

	}

}



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

	util.Res{Success: true, Message: "退出成功"}.Write(w)

	go func() {

		os.Exit(0)

	}()

}



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

	db := util.MustGetDB()

	defer db.Close()



	fields, err := util.GetFields(db, util.FieldUtil{}.AllowSelect()...)

	if err != nil {

		util.Res{Success: false, Message: err.Error()}.Write(w)

		return

	}

	util.Res{Success: true, Data: fields}.Write(w)

}



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

	if r.Method != http.MethodPost {

		util.Res{Success: false, Message: "不支持的请求方法"}.Write(w)

		return

	}

	defer r.Body.Close()

	var body [][2]string



	err := json.NewDecoder(r.Body).Decode(&body)

	if err != nil {

		util.Res{Success: false, Message: "参数错误"}.Write(w)

		return

	}



	db := util.MustGetDB()

	defer db.Close()



	fu := util.FieldUtil{}



	for _, d := range body {

		if !fu.IsAllowUpdate(d[0]) {

			util.Res{Success: false, Message: fmt.Sprintf("字段 %s 不允许修改", d[0])}.Write(w)

			return

		}



		if d[0] == "download_folder" {

			if _, err := os.Stat(d[1]); os.IsNotExist(err) {

				if err := os.MkdirAll(d[1], os.ModePerm); err != nil {

					util.Res{Success: false, Message: fmt.Sprintf("目录创建失败:%s", d[1])}.Write(w)

					return

				}

			} else if err != nil {

				util.Res{Success: false, Message: fmt.Sprintf("路径设置失败:%v", err)}.Write(w)

				return

			}

		}

	}



	err = util.SaveFields(db, body)

	if err != nil {

		util.Res{Success: false, Message: err.Error()}.Write(w)

		return

	}

	util.Res{Success: true, Message: "保存成功"}.Write(w)

}