package models

import (
	"time"

	"go.mongodb.org/mongo-driver/v2/bson"
)

const (
	MonitorHTTP = "http"
	MonitorTCP  = "tcp"
	MonitorICMP = "icmp"
	MonitorTLS  = "tls"
)

const (
	StatusUp      = "up"
	StatusDown    = "down"
	StatusPending = "pending"
)

const RunnerServer = "server"

type MonitorTarget struct {
	URL            string `bson:"url,omitempty" json:"url,omitempty"`
	Host           string `bson:"host,omitempty" json:"host,omitempty"`
	Port           int    `bson:"port,omitempty" json:"port,omitempty"`
	Method         string `bson:"method,omitempty" json:"method,omitempty"`
	ExpectedStatus int    `bson:"expected_status,omitempty" json:"expected_status,omitempty"`
	Keyword        string `bson:"keyword,omitempty" json:"keyword,omitempty"`
	TLSWarnDays    int    `bson:"tls_warn_days,omitempty" json:"tls_warn_days,omitempty"`
	Insecure       bool   `bson:"insecure,omitempty" json:"insecure,omitempty"`
}

type MonitorState struct {
	Status         string     `bson:"status" json:"status"`
	LastCheckAt    *time.Time `bson:"last_check_at,omitempty" json:"last_check_at,omitempty"`
	LatencyMs      int        `bson:"latency_ms" json:"latency_ms"`
	Message        string     `bson:"message,omitempty" json:"message,omitempty"`
	CertExpiryAt   *time.Time `bson:"cert_expiry_at,omitempty" json:"cert_expiry_at,omitempty"`
	Fails          int        `bson:"fails" json:"fails"`
	LastNotifiedAt *time.Time `bson:"last_notified_at,omitempty" json:"last_notified_at,omitempty"`
}

type Monitor struct {
	ID          bson.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"`
	InstanceID  string        `bson:"instance_id" json:"instance_id"`
	MonitorID   string        `bson:"monitor_id" json:"monitor_id"`
	Name        string        `bson:"name" json:"name"`
	Type        string        `bson:"type" json:"type"`
	Target      MonitorTarget `bson:"target" json:"target"`
	IntervalSec int           `bson:"interval_sec" json:"interval_sec"`
	Runner      string        `bson:"runner" json:"runner"`
	Retries     int           `bson:"retries" json:"retries"`
	Enabled     bool          `bson:"enabled" json:"enabled"`
	ChannelIDs  []string      `bson:"channel_ids,omitempty" json:"channel_ids,omitempty"`
	State       MonitorState  `bson:"state" json:"state"`
	CreatedAt   time.Time     `bson:"created_at" json:"created_at"`
}

type Incident struct {
	InstanceID string     `bson:"instance_id" json:"instance_id"`
	IncidentID string     `bson:"incident_id" json:"incident_id"`
	MonitorID  string     `bson:"monitor_id" json:"monitor_id"`
	StartedAt  time.Time  `bson:"started_at" json:"started_at"`
	ResolvedAt *time.Time `bson:"resolved_at,omitempty" json:"resolved_at,omitempty"`
	Cause      string     `bson:"cause,omitempty" json:"cause,omitempty"`
}

type Rollup struct {
	InstanceID  string    `bson:"instance_id" json:"instance_id"`
	MonitorID   string    `bson:"monitor_id" json:"monitor_id"`
	PeriodStart time.Time `bson:"period_start" json:"period_start"`
	Checks      int       `bson:"checks" json:"checks"`
	UpCount     int       `bson:"up_count" json:"up_count"`
	SumLatency  int64     `bson:"sum_latency" json:"sum_latency"`
}
