// Copyright 2025 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//  1. Redistributions of source code must retain the above copyright notice, this
//     list of conditions and the following disclaimer.
//
//  2. Redistributions in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//
//  3. Neither the name of the copyright holder nor the names of its
//     contributors may be used to endorse or promote products derived from
//     this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

package common

import (
	"path/filepath"

	"dawn.googlesource.com/dawn/tools/src/fileutils"
	"dawn.googlesource.com/dawn/tools/src/oswrapper"
)

func CreateFSTestOSWrapperWithFakeDefaultPaths() (oswrapper.FSTestOSWrapper, error) {
	wrapper := oswrapper.CreateFSTestOSWrapper()
	err := SetUpFakeDefaultPaths(wrapper)
	if err != nil {
		return wrapper, err
	}
	return wrapper, nil
}

func SetUpFakeDefaultPaths(fsWriter oswrapper.FSTestOSWrapper) error {
	err := fileutils.SetUpFakeDawnRoot(fsWriter)
	if err != nil {
		return err
	}
	root := fileutils.DawnRoot(fsWriter)

	defaultFiles := []string{
		RelativeExpectationsPath,
		RelativeCompatExpectationsPath,
		RelativeSlowExpectationsPath,
		RelativeTestListPath,
	}
	for _, relativePath := range defaultFiles {
		fullPath := filepath.Join(root, relativePath)
		err = fsWriter.MkdirAll(filepath.Dir(fullPath), 0o666)
		if err != nil {
			return err
		}
		f, err := fsWriter.Create(fullPath)
		if err != nil {
			return err
		}
		f.Close()
	}

	defaultDirectories := []string{
		RelativeCTSPath,
	}
	for _, relativePath := range defaultDirectories {
		fullPath := filepath.Join(root, relativePath)
		err = fsWriter.MkdirAll(fullPath, 0o666)
		if err != nil {
			return err
		}
	}
	return nil
}
