package repositorymodels

import "sync"

type Database struct {
	ID         string `json:"id"`
	TimeStamp  int64  `json:"_ts"`
	ResourceID string `json:"_rid"`
	ETag       string `json:"_etag"`
	Self       string `json:"_self"`
}

type RepositoryStatus int

const (
	StatusOk       = 1
	StatusNotFound = 2
	Conflict       = 3
	BadRequest     = 4
)

type TriggerOperation string

const (
	All     TriggerOperation = "All"
	Create  TriggerOperation = "Create"
	Delete  TriggerOperation = "Delete"
	Replace TriggerOperation = "Replace"
)

type TriggerType string

const (
	Pre  TriggerType = "Pre"
	Post TriggerType = "Post"
)

type Collection struct {
	ID             string                   `json:"id"`
	IndexingPolicy CollectionIndexingPolicy `json:"indexingPolicy"`
	PartitionKey   CollectionPartitionKey   `json:"partitionKey"`
	ResourceID     string                   `json:"_rid"`
	TimeStamp      int64                    `json:"_ts"`
	Self           string                   `json:"_self"`
	ETag           string                   `json:"_etag"`
	Docs           string                   `json:"_docs"`
	Sprocs         string                   `json:"_sprocs"`
	Triggers       string                   `json:"_triggers"`
	Udfs           string                   `json:"_udfs"`
	Conflicts      string                   `json:"_conflicts"`
}

type CollectionIndexingPolicy struct {
	IndexingMode  string                         `json:"indexingMode"`
	Automatic     bool                           `json:"automatic"`
	IncludedPaths []CollectionIndexingPolicyPath `json:"includedPaths"`
	ExcludedPaths []CollectionIndexingPolicyPath `json:"excludedPaths"`
}

type CollectionIndexingPolicyPath struct {
	Path    string `json:"path"`
	Indexes []struct {
		Kind      string `json:"kind"`
		DataType  string `json:"dataType"`
		Precision int    `json:"precision"`
	} `json:"indexes"`
}

type CollectionPartitionKey struct {
	Paths   []string `json:"paths"`
	Kind    string   `json:"kind"`
	Version int      `json:"Version"`
}

type UserDefinedFunction struct {
	Body       string `json:"body"`
	ID         string `json:"id"`
	ResourceID string `json:"_rid"`
	TimeStamp  int64  `json:"_ts"`
	Self       string `json:"_self"`
	ETag       string `json:"_etag"`
}

type StoredProcedure struct {
	Body       string `json:"body"`
	ID         string `json:"id"`
	ResourceID string `json:"_rid"`
	TimeStamp  int64  `json:"_ts"`
	Self       string `json:"_self"`
	ETag       string `json:"_etag"`
}

type Trigger struct {
	Body             string           `json:"body"`
	ID               string           `json:"id"`
	TriggerOperation TriggerOperation `json:"triggerOperation"`
	TriggerType      TriggerType      `json:"triggerType"`
	ResourceID       string           `json:"_rid"`
	TimeStamp        int64            `json:"_ts"`
	Self             string           `json:"_self"`
	ETag             string           `json:"_etag"`
}

type Document map[string]interface{}

type PartitionKeyRange struct {
	ResourceID         string `json:"_rid"`
	ID                 string `json:"id"`
	Etag               string `json:"_etag"`
	MinInclusive       string `json:"minInclusive"`
	MaxExclusive       string `json:"maxExclusive"`
	RidPrefix          int    `json:"ridPrefix"`
	Self               string `json:"_self"`
	ThroughputFraction int    `json:"throughputFraction"`
	Status             string `json:"status"`
	Parents            []any  `json:"parents"`
	TimeStamp          int64  `json:"_ts"`
	Lsn                int    `json:"lsn"`
}

type State struct {
	sync.RWMutex

	// Map databaseId -> Database
	Databases map[string]Database `json:"databases"`

	// Map databaseId -> collectionId -> Collection
	Collections map[string]map[string]Collection `json:"collections"`

	// Map databaseId -> collectionId -> documentId -> Documents
	Documents map[string]map[string]map[string]Document `json:"documents"`

	// Map databaseId -> collectionId -> triggerId -> Trigger
	Triggers map[string]map[string]map[string]Trigger `json:"triggers"`

	// Map databaseId -> collectionId -> spId -> StoredProcedure
	StoredProcedures map[string]map[string]map[string]StoredProcedure `json:"sprocs"`

	// Map databaseId -> collectionId -> udfId -> UserDefinedFunction
	UserDefinedFunctions map[string]map[string]map[string]UserDefinedFunction `json:"udfs"`
}