package file

import (
	"fmt"
	"net/http"
	"os"
)

// const (
// 	//经过测试，linux下，延时需要大于100ms
// 	TIME_DELAY_AFTER_WRITE = 200
// )

// type Response struct {
// 	Data []string `json:"data"`
// }

// type MMLRequest struct {
// 	MML []string `json:"mml"`
// }

// func GetFile(w http.ResponseWriter, r *http.Request) {
// 	log.Debug("PostMMLToNF processing... ")

// 	vars := mux.Vars(r)
// 	neType := vars["elementTypeValue"]
// 	params := r.URL.Query()
// 	neId := params["ne_id"]
// 	log.Debug("neType:", neType, "neId", neId)

// 	neInfo := new(dborm.NeInfo)
// 	var err error
// 	if len(neId) == 0 {
// 		log.Error("ne_id NOT FOUND")
// 		services.ResponseBadRequest400WrongParamValue(w)
// 		return
// 	}
// 	neInfo, err = dborm.XormGetNeInfo(neType, neId[0])
// 	if err != nil {
// 		log.Error("dborm.XormGetNeInfo is failed:", err)
// 		services.ResponseInternalServerError500DatabaseOperationFailed(w)
// 		return
// 	}

// 	var buf [8192]byte
// 	var n int
// 	var mmlResult []string

// 	if neInfo != nil {
// 		hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port)
// 		conn, err := net.Dial("tcp", hostMML)
// 		if err != nil {
// 			errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err)
// 			log.Error(errMsg)
// 			mmlResult = append(mmlResult, errMsg)
// 			response := Response{mmlResult}
// 			services.ResponseWithJson(w, http.StatusOK, response)
// 			return
// 		}

// 		loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password)
// 		n, err = conn.Write([]byte(loginStr))
// 		if err != nil {
// 			log.Errorf("Error: %s", err.Error())
// 			return
// 		}

// 		time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)

// 		n, err = conn.Read(buf[0:])
// 		if err != nil {
// 			log.Errorf("Error: %s", err.Error())
// 			return
// 		}
// 		log.Debug(string(buf[0:n]))

// 		body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen))
// 		if err != nil {
// 			log.Error("io.ReadAll is failed:", err)
// 			services.ResponseNotFound404UriNotExist(w, r)
// 			return
// 		}
// 		log.Debug("Body:", string(body))

// 		mmlRequest := new(MMLRequest)
// 		_ = json.Unmarshal(body, mmlRequest)

// 		for _, mml := range mmlRequest.MML {
// 			mmlCommand := fmt.Sprintf("%s\n", mml)
// 			log.Debug("mml command:", mmlCommand)
// 			n, err = conn.Write([]byte(mmlCommand))
// 			if err != nil {
// 				log.Errorf("Error: %s", err.Error())
// 				return
// 			}
// 			time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)

// 			n, err = conn.Read(buf[0:])
// 			if err != nil {
// 				log.Errorf("Error: %s", err.Error())
// 				return
// 			}
// 			log.Debug(string(buf[0 : n-len(neType)-2]))
// 			mmlResult = append(mmlResult, string(buf[0:n-len(neType)-2]))
// 		}
// 	}

// 	response := Response{mmlResult}
// 	services.ResponseWithJson(w, http.StatusOK, response)
// }

// 格式文件大小单位
func FormatFileSize(fileSize float64) (size string) {
	if fileSize < 1024 {
		return fmt.Sprintf("%.2fB", fileSize/float64(1))
	} else if fileSize < (1024 * 1024) {
		return fmt.Sprintf("%.2fKB", fileSize/float64(1024))
	} else if fileSize < (1024 * 1024 * 1024) {
		return fmt.Sprintf("%.2fMB", fileSize/float64(1024*1024))
	} else if fileSize < (1024 * 1024 * 1024 * 1024) {
		return fmt.Sprintf("%.2fGB", fileSize/float64(1024*1024*1024))
	} else if fileSize < (1024 * 1024 * 1024 * 1024 * 1024) {
		return fmt.Sprintf("%.2fTB", fileSize/float64(1024*1024*1024*1024))
	} else {
		return fmt.Sprintf("%.2fEB", fileSize/float64(1024*1024*1024*1024*1024))
	}
}

func IsSymlink(mode os.FileMode) bool {
	return mode&os.ModeSymlink != 0
}

const dotCharacter = 46

func IsHidden(path string) bool {
	return path[0] == dotCharacter
}

func GetMimeType(path string) string {
	file, err := os.Open(path)
	if err != nil {
		return ""
	}
	defer file.Close()

	buffer := make([]byte, 512)
	_, err = file.Read(buffer)
	if err != nil {
		return ""
	}
	mimeType := http.DetectContentType(buffer)
	return mimeType
}

func GetSymlink(path string) string {
	linkPath, err := os.Readlink(path)
	if err != nil {
		return ""
	}
	return linkPath
}
