// Copyright (C) 2019 Marius Schellenberger

package authdav

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

// Matcher is the matcher function type
type Matcher func(path string) bool

// Filter defines an interface to filter paths or files
type Filter interface {
	Filter(path string) error
}

// ErrMacOSFilter error returned by the MacOSFilter
var ErrMacOSFilter = errors.New("authdav: MacOS filter: access denied")

// MacOSFilter implements a filter for MacOS specific files
type MacOSFilter struct {
	match []Matcher
}

// NewMacOSFilter returns a new MacOSFilter
func NewMacOSFilter() *MacOSFilter {
	return &MacOSFilter{
		match: []Matcher{
			func(p string) bool {
				return p == ".DS_Store"
			},
			func(p string) bool {
				return strings.HasPrefix(p, "._")
			},
		},
	}
}

// Filter implements the Filter interface
func (f *MacOSFilter) Filter(path string) error {
	_, file := filepath.Split(path)
	for _, m := range f.match {
		if m(file) {
			return ErrMacOSFilter
		}
	}
	return nil
}
