package database

import (
	"time"
)

// Stats contains database statistics
type Stats struct {
	ASNs                   int
	Prefixes               int
	IPv4Prefixes           int
	IPv6Prefixes           int
	Peerings               int
	Peers                  int
	FileSizeBytes          int64
	LiveRoutes             int
	IPv4PrefixDistribution []PrefixDistribution
	IPv6PrefixDistribution []PrefixDistribution
}

// Store defines the interface for database operations
type Store interface {
	// ASN operations
	GetOrCreateASN(number int, timestamp time.Time) (*ASN, error)
	GetOrCreateASNBatch(asns map[int]time.Time) error

	// Prefix operations
	GetOrCreatePrefix(prefix string, timestamp time.Time) (*Prefix, error)

	// Announcement operations
	RecordAnnouncement(announcement *Announcement) error

	// Peering operations
	RecordPeering(asA, asB int, timestamp time.Time) error

	// Statistics
	GetStats() (Stats, error)

	// Peer operations
	UpdatePeer(peerIP string, peerASN int, messageType string, timestamp time.Time) error
	UpdatePeerBatch(peers map[string]PeerUpdate) error

	// Live route operations
	UpsertLiveRoute(route *LiveRoute) error
	UpsertLiveRouteBatch(routes []*LiveRoute) error
	DeleteLiveRoute(prefix string, originASN int, peerIP string) error
	DeleteLiveRouteBatch(deletions []LiveRouteDeletion) error
	GetPrefixDistribution() (ipv4 []PrefixDistribution, ipv6 []PrefixDistribution, err error)
	GetLiveRouteCounts() (ipv4Count, ipv6Count int, err error)

	// IP lookup operations
	GetASInfoForIP(ip string) (*ASInfo, error)

	// AS and prefix detail operations
	GetASDetails(asn int) (*ASN, []LiveRoute, error)
	GetPrefixDetails(prefix string) ([]LiveRoute, error)
	GetRandomPrefixesByLength(maskLength, ipVersion, limit int) ([]LiveRoute, error)

	// Lifecycle
	Close() error
}

// Ensure Database implements Store
var _ Store = (*Database)(nil)
