package db

type state struct {
	Admins       []adminRow       `json:"admins"`
	Feedbacks    []Feedback       `json:"feedbacks"`
	Sources      []Source         `json:"sources"`
	SourceChecks []SourceCheck    `json:"sourceChecks"`
	SourceCalls  []SourceCall     `json:"sourceCalls"`
	AuditLogs    []AuditLog       `json:"auditLogs"`
	NextID       map[string]int64 `json:"nextId"`
}

type adminRow struct {
	ID              int64  `json:"id"`
	Username        string `json:"username"`
	PasswordHash    string `json:"passwordHash"`
	PasswordChanged bool   `json:"passwordChanged"`
	CreatedAt       string `json:"createdAt"`
	UpdatedAt       string `json:"updatedAt"`
}

type DatabaseStatus struct {
	ActiveProvider  string `json:"activeProvider"`
	ConfigProvider  string `json:"configProvider"`
	SQLiteReady     bool   `json:"sqliteReady"`
	RemoteReady     bool   `json:"remoteReady"`
	FailoverActive  bool   `json:"failoverActive"`
	LastError       string `json:"lastError"`
	LastFailoverAt  string `json:"lastFailoverAt"`
	LastRecoveredAt string `json:"lastRecoveredAt"`
	LastSyncAt      string `json:"lastSyncAt"`
	LastSyncError   string `json:"lastSyncError"`
}

type SyncResult struct {
	Direction  string         `json:"direction"`
	Status     string         `json:"status"`
	Skipped    bool           `json:"skipped"`
	Warnings   []string       `json:"warnings,omitempty"`
	Tables     map[string]int `json:"tables"`
	FinishedAt string         `json:"finishedAt"`
}

type AdminUser struct {
	ID              int64  `json:"id"`
	Username        string `json:"username"`
	PasswordChanged bool   `json:"passwordChanged"`
	CreatedAt       string `json:"createdAt"`
	UpdatedAt       string `json:"updatedAt"`
}

type Feedback struct {
	Code                 string   `json:"code"`
	Title                string   `json:"title"`
	Type                 string   `json:"type"`
	Severity             string   `json:"severity"`
	Category             string   `json:"category"`
	Priority             string   `json:"priority"`
	Contact              string   `json:"contact"`
	Body                 string   `json:"body"`
	Status               string   `json:"status"`
	StatusDetail         string   `json:"statusDetail"`
	PublicReply          string   `json:"publicReply"`
	Note                 string   `json:"note"`
	Assignee             string   `json:"assignee"`
	HandledBy            string   `json:"handledBy"`
	DueAt                string   `json:"dueAt"`
	ResolvedAt           string   `json:"resolvedAt"`
	ArchivedAt           string   `json:"archivedAt"`
	SLALevel             string   `json:"slaLevel"`
	SourceChannel        string   `json:"sourceChannel"`
	RiskScore            int      `json:"riskScore"`
	Resolution           string   `json:"resolution"`
	Attachment           string   `json:"attachment"`
	PackagePath          string   `json:"packagePath"`
	EncryptedPackagePath string   `json:"encryptedPackagePath"`
	PackageSha256        string   `json:"packageSha256"`
	PlainPackageSha256   string   `json:"plainPackageSha256"`
	SummaryText          string   `json:"summaryText"`
	IncludedFiles        string   `json:"includedFiles"`
	MailSent             bool     `json:"mailSent"`
	RemoteAddr           string   `json:"remoteAddr"`
	Tags                 []string `json:"tags,omitempty"`
	CreatedAt            string   `json:"createdAt"`
	UpdatedAt            string   `json:"updatedAt"`
	LastActivityAt       string   `json:"lastActivityAt"`
}

type FeedbackComment struct {
	ID        int64  `json:"id"`
	Code      string `json:"code"`
	Author    string `json:"author"`
	Body      string `json:"body"`
	Internal  bool   `json:"internal"`
	CreatedAt string `json:"createdAt"`
}

type FeedbackAttachment struct {
	ID           int64  `json:"id"`
	FeedbackCode string `json:"feedbackCode"`
	Kind         string `json:"kind"`
	Path         string `json:"path"`
	FileName     string `json:"fileName"`
	SHA256       string `json:"sha256"`
	SizeBytes    int64  `json:"sizeBytes"`
	CreatedAt    string `json:"createdAt"`
}

type LegacyFeedbackEvent struct {
	ID           int64  `json:"id"`
	FeedbackCode string `json:"feedbackCode"`
	EventType    string `json:"eventType"`
	Actor        string `json:"actor"`
	FromValue    string `json:"fromValue"`
	ToValue      string `json:"toValue"`
	Message      string `json:"message"`
	CreatedAt    string `json:"createdAt"`
}

type LegacyMailRecord struct {
	ID             int64  `json:"id"`
	FeedbackCode   string `json:"feedbackCode"`
	Kind           string `json:"kind"`
	Status         string `json:"status"`
	ToAddress      string `json:"toAddress"`
	Subject        string `json:"subject"`
	PlainBody      string `json:"plainBody,omitempty"`
	HTMLBody       string `json:"htmlBody,omitempty"`
	AttachmentPath string `json:"attachmentPath"`
	AttachmentName string `json:"attachmentName"`
	ErrorMessage   string `json:"errorMessage"`
	CreatedAt      string `json:"createdAt"`
	SentAt         string `json:"sentAt"`
}

type LegacySyncJob struct {
	ID         int64  `json:"id"`
	Status     string `json:"status"`
	Summary    string `json:"summary"`
	StatsJSON  string `json:"statsJson"`
	StartedAt  string `json:"startedAt"`
	FinishedAt string `json:"finishedAt"`
}

type FeedbackDetail struct {
	Feedback
	Comments     []FeedbackComment     `json:"comments"`
	Attachments  []FeedbackAttachment  `json:"attachments"`
	Events       []AuditLog            `json:"events"`
	LegacyEvents []LegacyFeedbackEvent `json:"legacyEvents"`
	MailRecords  []LegacyMailRecord    `json:"mailRecords"`
}

type FeedbackFilters struct {
	Status   string
	Category string
	Priority string
	Query    string
	Assignee string
	Tag      string
	Sort     string
}

type FeedbackUpdate struct {
	Status       string   `json:"status"`
	Category     string   `json:"category"`
	Priority     string   `json:"priority"`
	StatusDetail string   `json:"statusDetail"`
	HandledBy    string   `json:"handledBy"`
	Assignee     string   `json:"assignee"`
	DueAt        string   `json:"dueAt"`
	SLALevel     string   `json:"slaLevel"`
	Resolution   string   `json:"resolution"`
	Note         string   `json:"note"`
	PublicReply  string   `json:"publicReply"`
	Actor        string   `json:"actor"`
	Tags         []string `json:"tags"`
}

type ReleasePackage struct {
	ID        int64  `json:"id"`
	Product   string `json:"product"`
	Version   string `json:"version"`
	Platform  string `json:"platform"`
	Arch      string `json:"arch"`
	FileName  string `json:"fileName"`
	URL       string `json:"url"`
	SHA256    string `json:"sha256"`
	SizeBytes int64  `json:"sizeBytes"`
	Enabled   bool   `json:"enabled"`
	CreatedAt string `json:"createdAt"`
	UpdatedAt string `json:"updatedAt"`
}

type ReleaseNotice struct {
	ID             int64  `json:"id"`
	Version        string `json:"version"`
	Build          string `json:"build"`
	Channel        string `json:"channel"`
	Title          string `json:"title"`
	Message        string `json:"message"`
	ReleaseNotes   string `json:"releaseNotes"`
	MessageMD      string `json:"messageMd"`
	ReleaseNotesMD string `json:"releaseNotesMd"`
	DownloadURL    string `json:"downloadUrl"`
	NoticeFile     string `json:"noticeFile"`
	RawJSON        string `json:"rawJson"`
	PublishedAt    string `json:"publishedAt"`
	CreatedAt      string `json:"createdAt"`
	UpdatedAt      string `json:"updatedAt"`
}

type ReleaseNoticeRevision struct {
	ID        int64  `json:"id"`
	Version   string `json:"version"`
	RawJSON   string `json:"rawJson"`
	Note      string `json:"note"`
	CreatedBy string `json:"createdBy"`
	CreatedAt string `json:"createdAt"`
}

type Source struct {
	ID                 int64  `json:"id"`
	CategoryID         string `json:"categoryId"`
	CategoryName       string `json:"categoryName"`
	SourceID           string `json:"sourceId"`
	Name               string `json:"name"`
	Description        string `json:"description"`
	Method             string `json:"method"`
	APIURL             string `json:"apiUrl"`
	URLTemplate        string `json:"urlTemplate"`
	ThumbnailURL       string `json:"thumbnailUrl"`
	ProxyMode          string `json:"proxyMode"`
	TimeoutMS          int    `json:"timeoutMs"`
	RetryCount         int    `json:"retryCount"`
	CacheSeconds       int    `json:"cacheSeconds"`
	CheckIntervalSec   int    `json:"checkIntervalSec"`
	Enabled            bool   `json:"enabled"`
	ClientVisible      bool   `json:"clientVisible"`
	SupportedFormats   string `json:"supportedFormats"`
	LastStatus         string `json:"lastStatus"`
	LastLatencyMS      int    `json:"lastLatencyMs"`
	LastCheckedAt      string `json:"lastCheckedAt"`
	LastError          string `json:"lastError"`
	ConsecutiveFailure int    `json:"consecutiveFailure"`
	CreatedAt          string `json:"createdAt"`
	UpdatedAt          string `json:"updatedAt"`
}

type SourceCheck struct {
	ID        int64  `json:"id"`
	SourceID  int64  `json:"sourceDbId"`
	Status    string `json:"status"`
	LatencyMS int    `json:"latencyMs"`
	Error     string `json:"error"`
	CheckedAt string `json:"checkedAt"`
}

type SourceCall struct {
	ID        int64  `json:"id"`
	SourceID  string `json:"sourceId"`
	Status    string `json:"status"`
	LatencyMS int    `json:"latencyMs"`
	Error     string `json:"error"`
	Client    string `json:"client"`
	CreatedAt string `json:"createdAt"`
}

type AuditLog struct {
	ID        int64  `json:"id"`
	Actor     string `json:"actor"`
	Type      string `json:"type"`
	Target    string `json:"target"`
	Message   string `json:"message"`
	IP        string `json:"ip"`
	UserAgent string `json:"userAgent"`
	CreatedAt string `json:"createdAt"`
}

type AuditFilters struct {
	Page    int
	PerPage int
	Type    string
	Target  string
	Query   string
}

type AuditPage struct {
	Items   []AuditLog `json:"items"`
	Total   int        `json:"total"`
	Page    int        `json:"page"`
	PerPage int        `json:"perPage"`
}

type LegacyJsonRevision struct {
	ID        int64  `json:"id"`
	Name      string `json:"name"`
	Raw       string `json:"raw"`
	Note      string `json:"note"`
	CreatedBy string `json:"createdBy"`
	CreatedAt string `json:"createdAt"`
}
