package store

import (
	"context"
	"errors"
	"time"

	"github.com/hhs/camtalk/internal/models"
)

var (
	// ErrMessageNotFound 消息不存在。
	ErrMessageNotFound = errors.New("message not found")
)

// MessageRepository 消息持久化接口。
type MessageRepository interface {
	// SaveMessage 保存一条消息。
	SaveMessage(ctx context.Context, sessionID string, msg models.Message, tokensUsed int) error

	// GetMessages 获取会话的消息列表（分页，按 created_at 升序）。
	// beforeID 为 0 时从最新开始查询。
	GetMessages(ctx context.Context, sessionID string, limit int, beforeID int64) ([]StoredMessage, error)

	// GetLastMessage 获取会话的最后一条消息。
	GetLastMessage(ctx context.Context, sessionID string) (*StoredMessage, error)

	// GetMessageCount 获取会话的消息总数。
	GetMessageCount(ctx context.Context, sessionID string) (int, error)

	// GetSessionMessageStats 批量查询多个会话的消息统计（last_message + message_count）。
	// 返回的 map key 为 sessionID，仅包含有消息的会话。
	GetSessionMessageStats(ctx context.Context, sessionIDs []string) (map[string]SessionMessageStats, error)
}

// SessionMessageStats 单个会话的消息统计（SQL 聚合查询结果）。
type SessionMessageStats struct {
	LastMessage  string
	MessageCount int
}

// StoredMessage 持久化消息模型（store 层）。
type StoredMessage struct {
	ID         int64     `json:"id"`
	SessionID  string    `json:"-"`
	Role       string    `json:"role"`
	Content    string    `json:"content"`
	TokensUsed int       `json:"tokens_used"`
	CreatedAt  time.Time `json:"created_at"`
}
