//
// Copyright 2019-2022 Nestybox, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

package utils

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

type FilepathSlice []string

func (fp FilepathSlice) Len() int {
	return len(fp)
}

// Compares the number of "/" separated elements in paths fp[i] and fp[j].
func (fp FilepathSlice) Less(i, j int) bool {
	iClean := filepath.Clean(fp[i])
	jClean := filepath.Clean(fp[j])
	iElems := strings.Split(iClean, "/")
	jElems := strings.Split(jClean, "/")
	return len(iElems) < len(jElems)
}

func (fp FilepathSlice) Swap(i, j int) {
	tmp := fp[i]
	fp[i] = fp[j]
	fp[j] = tmp
}

// Sorts the give set of filepaths hierarchically; paths must be absolute.
func FilepathSort(paths []string) {
	sort.Sort(FilepathSlice(paths))
}
