package internal

import (
	"mime"
	"os"
	"strings"
	"unicode/utf8"
)

func MediaType(fpath string) string {
	if strings.HasSuffix(fpath, ".gmi") {
		// This may not be present in the listings searched by mime.TypeByExtension,
		// so provide a dedicated fast path for it here.
		return "text/gemini"
	}

	slashIdx := strings.LastIndex(fpath, "/")
	dotIdx := strings.LastIndex(fpath[slashIdx+1:], ".")
	if dotIdx == -1 {
		return "application/octet-stream"
	}
	ext := fpath[slashIdx+1+dotIdx:]

	mtype := mime.TypeByExtension(ext)
	if mtype == "" {
		if ContentsAreText(fpath) {
			return "text/plain"
		}
		return "application/octet-stream"
	}
	return mtype
}

func ContentsAreText(fpath string) bool {
	f, err := os.Open(fpath)
	if err != nil {
		return false
	}
	defer func() { _ = f.Close() }()

	var buf [1024]byte
	n, err := f.Read(buf[:])
	if err != nil {
		return false
	}

	for i, c := range string(buf[:n]) {
		if i+utf8.UTFMax > n {
			// incomplete last char
			break
		}
		if c == 0xFFFD || c < ' ' && c != '\n' && c != '\t' && c != '\f' {
			return false
		}
	}
	return true
}