package main

import (
	"os"
	"path"
	"unsafe"

	log "github.com/sirupsen/logrus"
	"golang.org/x/sys/windows"
)

func (s *serviceClient) setDefaultFonts() {
	defaultFontPath := s.getWindowsFontFilePath()

	if _, err := os.Stat(defaultFontPath); err != nil {
		log.Errorf("Failed to find default font file: %v", err)
		return
	}

	os.Setenv("FYNE_FONT", defaultFontPath)
}

func (s *serviceClient) getWindowsFontFilePath() string {
	var (
		fontFolder  = "C:/Windows/Fonts"
		fontMapping = map[string]string{
			"default":     "Segoeui.ttf",
			"zh-CN":       "Msyh.ttc",
			"am-ET":       "Ebrima.ttf",
			"nirmala":     "Nirmala.ttf",
			"chr-CHER-US": "Gadugi.ttf",
			"zh-HK":       "Msjh.ttc",
			"zh-TW":       "Msjh.ttc",
			"ja-JP":       "Yugothm.ttc",
			"km-KH":       "Leelawui.ttf",
			"ko-KR":       "Malgun.ttf",
			"th-TH":       "Leelawui.ttf",
			"ti-ET":       "Ebrima.ttf",
		}
		nirMalaLang = []string{
			"as-IN",
			"bn-BD",
			"bn-IN",
			"gu-IN",
			"hi-IN",
			"kn-IN",
			"kok-IN",
			"ml-IN",
			"mr-IN",
			"ne-NP",
			"or-IN",
			"pa-IN",
			"si-LK",
			"ta-IN",
			"te-IN",
		}
	)

	// getUserDefaultLocaleName.Call() panics if the func is not found
	defer func() {
		if r := recover(); r != nil {
			log.Errorf("Recovered from panic: %v", r)
		}
	}()

	kernel32 := windows.NewLazySystemDLL("kernel32.dll")
	getUserDefaultLocaleName := kernel32.NewProc("GetUserDefaultLocaleName")

	buf := make([]uint16, 85) // LOCALE_NAME_MAX_LENGTH is usually 85
	r, _, err := getUserDefaultLocaleName.Call(uintptr(unsafe.Pointer(&buf[0])), uintptr(len(buf)))
	// returns 0 on failure, err is always non-nil
	// https://learn.microsoft.com/en-us/windows/win32/api/winnls/nf-winnls-getuserdefaultlocalename
	if r == 0 {
		log.Errorf("GetUserDefaultLocaleName call failed: %v", err)
		return path.Join(fontFolder, fontMapping["default"])
	}

	defaultLanguage := windows.UTF16ToString(buf)

	for _, lang := range nirMalaLang {
		if defaultLanguage == lang {
			return path.Join(fontFolder, fontMapping["nirmala"])
		}
	}

	if font, ok := fontMapping[defaultLanguage]; ok {
		return path.Join(fontFolder, font)
	}

	return path.Join(fontFolder, fontMapping["default"])
}