package clinic_internal_api

import (
	"context"
	"encoding/json"
	"net/url"
	"strconv"
	"time"
)

type HealthCheckReportCheckItem struct {
	Name         string `json:"name"`
	Description  string `json:"description,omitempty"`
	CheckType    string `json:"checkType,omitempty"`
	Status       string `json:"status,omitempty"`
	ErrorMessage string `json:"errorMessage,omitempty"`
}

type HealthCheckReportSummary struct {
	ReportID        string                       `json:"reportId"`
	StrategyID      string                       `json:"strategyId"`
	OrgID           string                       `json:"orgId"`
	PortalOrgID     string                       `json:"portalOrgId,omitempty"`
	ClusterID       string                       `json:"clusterId"`
	Status          string                       `json:"status"`
	ErrorMessage    string                       `json:"errorMessage,omitempty"`
	CreatedAt       time.Time                    `json:"createdAt"`
	UpdatedAt       time.Time                    `json:"updatedAt"`
	TimeRangeAStart *time.Time                   `json:"timeRangeAStart,omitempty"`
	TimeRangeAEnd   *time.Time                   `json:"timeRangeAEnd,omitempty"`
	TimeRangeBStart *time.Time                   `json:"timeRangeBStart,omitempty"`
	TimeRangeBEnd   *time.Time                   `json:"timeRangeBEnd,omitempty"`
	CheckItems      []HealthCheckReportCheckItem `json:"checkItems"`
}

type HealthCheckReportPage struct {
	Items    []HealthCheckReportSummary `json:"items"`
	Page     int                        `json:"page"`
	PageSize int                        `json:"pageSize"`
	Total    int64                      `json:"total"`
}

type HealthCheckReportItem struct {
	Name         string          `json:"name"`
	Description  string          `json:"description,omitempty"`
	CheckType    string          `json:"checkType,omitempty"`
	Params       json.RawMessage `json:"params,omitempty" swaggertype:"object"`
	Status       string          `json:"status"`
	ErrorMessage string          `json:"errorMessage,omitempty"`
	Content      json.RawMessage `json:"content,omitempty" swaggertype:"object"`
}

type HealthCheckReport struct {
	ReportID        string                  `json:"reportId"`
	StrategyID      string                  `json:"strategyId"`
	OrgID           string                  `json:"orgId"`
	PortalOrgID     string                  `json:"portalOrgId,omitempty"`
	ClusterID       string                  `json:"clusterId"`
	Status          string                  `json:"status"`
	ErrorMessage    string                  `json:"errorMessage,omitempty"`
	CreatedAt       time.Time               `json:"createdAt"`
	UpdatedAt       time.Time               `json:"updatedAt"`
	TimeRangeAStart *time.Time              `json:"timeRangeAStart,omitempty"`
	TimeRangeAEnd   *time.Time              `json:"timeRangeAEnd,omitempty"`
	TimeRangeBStart *time.Time              `json:"timeRangeBStart,omitempty"`
	TimeRangeBEnd   *time.Time              `json:"timeRangeBEnd,omitempty"`
	Items           []HealthCheckReportItem `json:"items"`
}

func (c *Client) ListHealthCheckReports(
	ctx context.Context,
	orgID uint64,
	clusterID string,
	query url.Values,
) (*HealthCheckReportPage, error) {
	var result HealthCheckReportPage
	err := c.getResource(ctx, []string{
		"orgs", strconv.FormatUint(orgID, 10), "clusters", clusterID, "health-check", "reports",
	}, query, &result)
	if result.Items == nil {
		result.Items = make([]HealthCheckReportSummary, 0)
	}
	return &result, err
}

func (c *Client) GetHealthCheckReport(
	ctx context.Context,
	orgID uint64,
	clusterID, reportID string,
	query url.Values,
) (*HealthCheckReport, error) {
	var result HealthCheckReport
	err := c.getResource(ctx, []string{
		"orgs", strconv.FormatUint(orgID, 10), "clusters", clusterID, "health-check", "reports", reportID,
	}, query, &result)
	if result.Items == nil {
		result.Items = make([]HealthCheckReportItem, 0)
	}
	return &result, err
}
