package tool

import (
	"context"
	"errors"
)

// Repository kalıcı depolama sözleşmesidir. Uygulamalar: MongoDB (mongostore) ve
// bellek içi (MemoryRepo). Tek doğrulama yolu RepositoryContract'tır (skill ile aynı desen).
//
// Depo YALNIZCA saklar: doğrulama, izin ve yürütme Registry'nin işidir.
type Repository interface {
	// Create tool'u ekler. Ad (ya da kimlik) çakışırsa ErrDuplicateName.
	Create(ctx context.Context, t *Tool) error
	// Get yoksa ErrNotFound döner.
	Get(ctx context.Context, id string) (*Tool, error)
	// GetByName yoksa ErrNotFound döner.
	GetByName(ctx context.Context, name string) (*Tool, 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, t *Tool) 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) ([]Tool, error)
}

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

var (
	// ErrInvalidInput genel girdi doğrulama hatası (tool adı boş, geçersiz durum vb.).
	ErrInvalidInput = errors.New("tool: geçersiz girdi")
)
