package domain

import (
	"errors"
	"time"
)

var (
	ErrNotFound   = errors.New("inspire not found")
	ErrForbidden  = errors.New("inspire forbidden")
	ErrValidation = errors.New("inspire validation")
	ErrRemoved    = errors.New("legacy inspire API removed")
	// ErrNotImplemented marks a capability that is wired but has no real backend yet. It must be
	// returned instead of fabricated data, and must never be billed.
	ErrNotImplemented = errors.New("not implemented")
)

func NowNano() int64 { return time.Now().UTC().UnixNano() }

type TrendItem struct {
	ID          string   `bson:"_id" json:"id"`
	OwnerUID    int64    `bson:"owner_uid" json:"owner_uid"` // 0 = global seed
	Kind        string   `bson:"kind" json:"kind"`
	Label       string   `bson:"label" json:"label"`
	Summary     string   `bson:"summary" json:"summary"`
	Heat        int      `bson:"heat" json:"heat"`
	Keywords    []string `bson:"keywords" json:"keywords"`
	Samples     []string `bson:"samples" json:"samples"`
	SourceLabel string   `bson:"source_label" json:"source_label"`
	ObservedAt  int64    `bson:"observed_at" json:"observed_at"`
}

type Element struct {
	ID        string `bson:"_id" json:"id"`
	OwnerUID  int64  `bson:"owner_uid" json:"owner_uid"`
	Kind      string `bson:"kind" json:"kind"`
	Title     string `bson:"title" json:"title"`
	Body      string `bson:"body" json:"body"`
	RefID     string `bson:"ref_id,omitempty" json:"ref_id,omitempty"`
	Reusable  bool   `bson:"reusable" json:"reusable"`
	CreatedAt int64  `bson:"created_at" json:"created_at"`
	UpdatedAt int64  `bson:"updated_at" json:"updated_at"`
}

type ChatMessage struct {
	ID        string     `bson:"id" json:"id"`
	Role      string     `bson:"role" json:"role"` // user|assistant|system
	Text      string     `bson:"text" json:"text"`
	Draft     *ChatDraft `bson:"draft,omitempty" json:"draft,omitempty"`
	CreatedAt int64      `bson:"created_at" json:"created_at"`
}

type ChatDraft struct {
	Title string `bson:"title,omitempty" json:"title,omitempty"`
	Body  string `bson:"body" json:"body"`
}

// Session — 一位會員可有多則靈感對話；active 由 Repository 的 active 指標維護。
type Session struct {
	ID               string        `bson:"_id" json:"id"`
	OwnerUID         int64         `bson:"owner_uid" json:"owner_uid"`
	Title            string        `bson:"title,omitempty" json:"title,omitempty"`
	Messages         []ChatMessage `bson:"messages" json:"messages"`
	PinnedElementIDs []string      `bson:"pinned_element_ids" json:"pinned_element_ids"`
	// ContextSummary — 舊對話摺疊摘要；AI 無狀態，不能只靠「同一個 session」記住
	// 每 inspireSummarizeEvery 則訊息才重算，平常只帶摘要 + 最近幾則
	ContextSummary  string `bson:"context_summary,omitempty" json:"context_summary,omitempty"`
	SummaryMsgCount int    `bson:"summary_msg_count,omitempty" json:"summary_msg_count,omitempty"`
	CreatedAt       int64  `bson:"created_at" json:"created_at"`
	UpdatedAt       int64  `bson:"updated_at" json:"updated_at"`
}

// SessionSummary — 列表用輕量摘要（不含完整 messages）。
type SessionSummary struct {
	ID           string `json:"id"`
	Title        string `json:"title"`
	Preview      string `json:"preview"`
	MessageCount int    `json:"message_count"`
	UpdatedAt    int64  `json:"updated_at"`
	CreatedAt    int64  `json:"created_at"`
	Active       bool   `json:"active"`
}

type ResearchHit struct {
	ID          string   `json:"id"`
	Title       string   `json:"title"`
	Snippet     string   `json:"snippet"`
	URL         string   `json:"url"`
	Summary     string   `json:"summary,omitempty"`
	LearnPoints []string `json:"learn_points,omitempty"`
	ReplyHooks  []string `json:"reply_hooks,omitempty"`
	SourceLabel string   `json:"source_label,omitempty"`
}

type GeneratedImage struct {
	ID     string `json:"id"`
	URL    string `json:"url"`
	Prompt string `json:"prompt"`
}
