package site

import (
	"context"

	"github.com/gocql/gocql"
)

// Repository defines the interface for site data access
type Repository interface {
	// Create inserts a new site into all Cassandra tables
	Create(ctx context.Context, site *Site) error

	// GetByID retrieves a site by tenant_id and site_id
	GetByID(ctx context.Context, tenantID, siteID gocql.UUID) (*Site, error)

	// GetByDomain retrieves a site by domain name
	GetByDomain(ctx context.Context, domain string) (*Site, error)

	// GetByAPIKeyHash retrieves a site by API key hash (for authentication)
	GetByAPIKeyHash(ctx context.Context, apiKeyHash string) (*Site, error)

	// ListByTenant retrieves all sites for a tenant (paginated)
	ListByTenant(ctx context.Context, tenantID gocql.UUID, pageSize int, pageState []byte) ([]*Site, []byte, error)

	// Update updates a site in all Cassandra tables
	Update(ctx context.Context, site *Site) error

	// UpdateAPIKey updates the API key for a site (handles sites_by_apikey table correctly)
	// Must provide both old and new API key hashes to properly delete old entry and insert new one
	UpdateAPIKey(ctx context.Context, site *Site, oldAPIKeyHash string) error

	// Delete removes a site from all Cassandra tables
	Delete(ctx context.Context, tenantID, siteID gocql.UUID) error

	// DomainExists checks if a domain is already registered
	DomainExists(ctx context.Context, domain string) (bool, error)

	// UpdateUsage updates only usage tracking fields (optimized for frequent updates)
	UpdateUsage(ctx context.Context, site *Site) error

	// GetAllSitesForUsageReset retrieves all sites for monthly usage counter reset
	// This uses ALLOW FILTERING and should only be used for administrative tasks
	GetAllSitesForUsageReset(ctx context.Context, pageSize int, pageState []byte) ([]*Site, []byte, error)
}
