package cache

import (
	"context"
	"time"
)

type Client interface {
	// Set добавляет в кеш под ключем key значение value
	//
	// Если такого ключа с таким типом значения нет,
	// то возвращает ошибку ErrKeyExists
	Set(ctx context.Context, key string, valueType ValueType, value any, expiration time.Duration) error

	// Del удаляет значение по ключу key и указанному valueType
	//
	// Если такого ключа с таким типом значения нет,
	// то возвращает ошибку ErrKeyNotFound
	Del(ctx context.Context, key string, valueType ValueType) error

	// Get возвращает значение по ключу key и valueType
	//
	// Если такого ключа с таким типом значения нет,
	// то возвращает ошибку ErrKeyNotFound
	//
	// В случае, если получаемое значение не является строкой,
	// необходимо воспользоваться соответсвующим методом под
	// этот тип данных
	Get(ctx context.Context, key string, valueType ValueType) (string, error)

	// TODO: По необходимости расширить необходимыми методами
}

type (
	Type      uint
	ValueType string
	Config    any
)

const (
	ValkeyCacheType Type = iota
)

const (
	LogoValueType      ValueType = "value_logo_type"
	DocumentsValueType ValueType = "value_documents_type"

	PswResetOTPValueType   ValueType = "value_otp_type"
	PswResetTokenValueType ValueType = "value_token_type"

	IntegrationCompanyValueType ValueType = "integration:company"
	IntegrationVacancyValueType ValueType = "integration:vacancy"
)
