// Copyright (C) 2020 The Syncthing Authors.
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// You can obtain one at https://mozilla.org/MPL/2.0/.

// +build windows

package fs

import (
	"path/filepath"
	"strings"
	"syscall"
)

type basicRealCaserWindows struct {
	uri string
}

func newBasicRealCaser(fs Filesystem) realCaser {
	return &basicRealCaserWindows{fs.URI()}
}

// RealCase returns the correct case for the given name, which is a relative
// path below root, as it exists on disk.
func (r *basicRealCaserWindows) realCase(name string) (string, error) {
	if name == "." {
		return ".", nil
	}
	path := r.uri
	comps := strings.Split(name, string(PathSeparator))
	var err error
	for i, comp := range comps {
		path = filepath.Join(path, comp)
		comps[i], err = r.realCaseBase(path)
		if err != nil {
			return "", err
		}
	}
	return filepath.Join(comps...), nil
}

func (*basicRealCaserWindows) realCaseBase(path string) (string, error) {
	p, err := syscall.UTF16PtrFromString(fixLongPath(path))
	if err != nil {
		return "", err
	}
	var fd syscall.Win32finddata
	h, err := syscall.FindFirstFile(p, &fd)
	if err != nil {
		return "", err
	}
	syscall.FindClose(h)
	return syscall.UTF16ToString(fd.FileName[:]), nil
}

func (r *basicRealCaserWindows) dropCache() {}