package service

import (
	"context"

	"security-center-backend/internal/service/directory"
)

type EmployeeLookup interface {
	FindByID(ctx context.Context, id uint64) (*directory.Employee, error)
	ListActive(ctx context.Context) ([]directory.Employee, error)
	ListByDepartment(ctx context.Context, departmentID string) ([]directory.Employee, error)
}

type SubmitterLookup interface {
	FindEmployeeIDByUserID(ctx context.Context, userID uint64) (uint64, error)
}

type EntityStore interface {
	GetEntityFields(ctx context.Context, entityType string) ([]FieldInfo, error)
	FindMatches(ctx context.Context, entityType string, entityID *uint64, rawConditions interface{}, limit int) ([]map[string]interface{}, error)
	FetchEntity(ctx context.Context, entityType string, id uint64) (map[string]interface{}, error)
}

type EventFeed interface {
	ListVulnerabilityCreates(ctx context.Context, lastVulnerabilityID uint64, limit int) ([]VulnerabilityCreateRef, error)
	ListVulnerabilityEvents(ctx context.Context, lastEventID uint64, limit int) ([]VulnerabilityEventRef, error)
	ListAssetHistoryChanges(ctx context.Context, lastHistoryID uint64, limit int) ([]AssetHistoryRef, error)
}

type SettingsSnapshot struct {
	Notifications NotificationSettings `json:"notifications"`
}

type NotificationSettings struct {
	LarkAlerts                         bool   `json:"lark_alerts"`
	LarkWebhook                        string `json:"lark_webhook"`
	LarkAppID                          string `json:"lark_app_id"`
	LarkAppSecret                      string `json:"lark_app_secret"`
	LarkReceiveIDType                  string `json:"lark_receive_id_type"`
	VulnerabilitySLARemindersEnabled   bool   `json:"vulnerability_sla_reminders_enabled"`
	VulnerabilitySLADueSoonBeforeHours int    `json:"vulnerability_sla_due_soon_before_hours"`
	VulnerabilitySLAOverdueRepeatHours int    `json:"vulnerability_sla_overdue_repeat_hours"`
}

type RuleConditions struct {
	Combinator string      `json:"combinator,omitempty"`
	Conditions []Condition `json:"conditions,omitempty"`
}

type Condition struct {
	Field          string      `json:"field"`
	Operator       string      `json:"op,omitempty"`
	LegacyOperator string      `json:"operator,omitempty"`
	Value          interface{} `json:"value"`
}

func (c Condition) effectiveOperator() string {
	if c.Operator != "" {
		return c.Operator
	}
	return c.LegacyOperator
}

type VulnerabilityCreateRef struct {
	ID uint64
}

type VulnerabilityEventRef struct {
	ID              uint64
	VulnerabilityID uint64
	EventType       string
}

type AssetHistoryRef struct {
	ID      uint64
	AssetID uint64
	Action  string
}
