package skill

import (
	"context"
	"errors"
)

var (
	// ErrNotFound istenen skill yoksa döner.
	ErrNotFound = errors.New("skill: bulunamadı")
	// ErrDuplicateName aynı ada sahip başka bir skill varsa döner (ad benzersizdir).
	ErrDuplicateName = errors.New("skill: bu ada sahip bir skill zaten var")
)

// ListFilter liste sorgusunu daraltır; sıfır değer "filtre yok" demektir.
type ListFilter struct {
	Status Status // boş = tüm durumlar
	Tag    string // tam eşleşme (küçük harf)
	Query  string // ad veya açıklamada büyük/küçük harf duyarsız alt dize
}

// Repository kalıcı depolama sözleşmesidir. Uygulamalar: MongoDB (mongostore) ve bellek içi (MemoryRepo).
// Tek doğrulama yolu RepositoryContract'tır; iki uygulama da aynı testten geçmelidir.
type Repository interface {
	// Create skill'i ekler. Ad (ya da kimlik) çakışırsa ErrDuplicateName (kimlik için herhangi bir hata).
	Create(ctx context.Context, s *Skill) error
	// Get yoksa ErrNotFound döner.
	Get(ctx context.Context, id string) (*Skill, error)
	// GetByName yoksa ErrNotFound döner.
	GetByName(ctx context.Context, name string) (*Skill, error)
	// Update kaydı TAMAMEN değiştirir (kimliğe göre). Yoksa ErrNotFound; yeni ad başkasınınkiyle çakışırsa ErrDuplicateName.
	Update(ctx context.Context, s *Skill) error
	// Delete yoksa ErrNotFound döner.
	Delete(ctx context.Context, id string) error
	// List ada göre artan sıralı döner (limit<=0: hepsi). Sonuç asla nil değildir.
	List(ctx context.Context, f ListFilter, limit, offset int) ([]Skill, error)
}
