//
//  Copyright 2026 The InfiniFlow Authors. All Rights Reserved.
//
//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//

package cli

// Command represents a parsed command from the CLI
type Command struct {
	Type   string
	Params map[string]interface{}
}

// Token types for the lexer
const (
	// Keywords
	TokenLogin = iota
	TokenLogout
	TokenRegister
	TokenList
	TokenServices
	TokenShow
	TokenCreate
	TokenService
	TokenShutdown
	TokenRestart
	TokenUsers
	TokenDrop
	TokenUser
	TokenAlter
	TokenActive
	TokenInactive
	TokenAdmin
	TokenServer
	TokenAPI
	TokenAdd
	TokenLive
	TokenHealth
	TokenHost
	TokenDelete
	TokenPassword
	TokenDataset
	TokenDatasets
	TokenChunkStore
	TokenOf
	TokenAgents
	TokenSearches
	TokenRole
	TokenRoles
	TokenDescription
	TokenGrant
	TokenRevoke
	TokenAll
	TokenPermission
	TokenTo
	TokenFrom
	TokenFor
	TokenResources
	TokenOn
	TokenSet
	TokenReset
	TokenVersion
	TokenVar
	TokenVars
	TokenConfigs
	TokenConfig
	TokenEnvs
	TokenKey
	TokenKeys
	TokenGenerate
	TokenAvailable
	TokenSupported
	TokenModel
	TokenModels
	TokenProvider
	TokenProviders
	TokenDefault
	TokenChats
	TokenChat
	TokenMessage
	TokenImage
	TokenVideo
	TokenAudio
	TokenStream
	TokenFiles
	TokenAs
	TokenParse
	TokenImport
	TokenInto
	TokenIn
	TokenWith
	TokenParser
	TokenPipeline
	TokenSearch
	TokenAgent
	TokenMemories
	TokenMemory
	TokenRetrieve
	TokenCurrent
	TokenFingerprint
	TokenLicense
	TokenVision
	TokenEmbedding
	TokenRerank
	TokenASR
	TokenTTS
	TokenOCR
	TokenDocParse
	TokenEmbed
	TokenText
	TokenQuery
	TokenFormat
	TokenParam
	TokenPlay
	TokenSave
	TokenTop
	TokenDimension
	TokenAsync
	TokenSync
	TokenBenchmark
	TokenPing
	TokenToken
	TokenTokens
	TokenUnset
	TokenIndex
	TokenVector
	TokenSize
	TokenStore
	TokenEngine
	TokenName // For ALTER PROVIDER <name> NAME <new_name>
	TokenBalance
	TokenInstance
	TokenInstances
	TokenDisable
	TokenEnable
	TokenUse
	TokenCheck
	TokenThink
	TokenEffort
	TokenVerbosity
	TokenNone
	TokenMinimal
	TokenLow
	TokenMedium
	TokenHigh
	TokenMax
	TokenLS
	TokenCat
	TokenInsert
	TokenFile
	TokenMetadata
	TokenTable
	TokenGet
	TokenUpdate
	TokenRemove
	TokenExplain
	TokenChunk
	TokenChunks
	TokenDocument
	TokenDocuments
	TokenTag
	TokenRegion
	TokenURL
	TokenTask
	TokenTasks
	TokenIngestor
	TokenIngestors
	TokenStart
	TokenStop
	TokenIngestion
	TokenCache
	TokenMQ
	TokenPublish
	TokenPull
	TokenPending
	TokenNoACK
	TokenAnalyze
	TokenSummary
	TokenStats
	TokenStorage
	TokenQuota
	TokenTree
	TokenOrphan
	TokenHour
	TokenDay
	TokenMonth
	TokenDays
	TokenWindow
	TokenActivity
	TokenData
	TokenPurge
	TokenPlan
	TokenPreview
	TokenOpenaiChat
	TokenLog
	TokenLogs
	TokenLevel
	TokenDebug
	TokenInfo
	TokenWarn
	TokenError
	TokenFatal
	TokenPanic
	// Literals
	TokenIdentifier
	TokenQuotedString
	TokenInteger
	TokenFloat
	TokenNumber = TokenInteger // Alias for integer tokens in path parsing (e.g., version numbers like 1.0.0)

	// Special
	_ = iota
	TokenSemicolon
	TokenComma
	TokenSlash
	TokenEOF
	TokenDash
	TokenIllegal
	TokenLBracket // '['
	TokenRBracket // ']'
)

// Token represents a lexical token
type Token struct {
	Type  int
	Value string
}

// NewCommand creates a new command with the given type
func NewCommand(cmdType string) *Command {
	return &Command{
		Type:   cmdType,
		Params: make(map[string]interface{}),
	}
}
