package httpapi

import (
	"context"
	"time"

	"github.com/dtoro/oikos/internal/httpapi/gen"
)

func (s *Server) GetFleetHealth(ctx context.Context, req gen.GetFleetHealthRequestObject) (gen.GetFleetHealthResponseObject, error) {
	resp := gen.GetFleetHealth200JSONResponse{}
	resp.Entities = []struct {
		Health      gen.HealthSummaryEntitiesHealth `json:"health"`
		LastCheckAt *time.Time                      `json:"last_check_at"`
		Slug        string                          `json:"slug"`
		Trend       *gen.HealthSummaryEntitiesTrend `json:"trend"`
		Type        string                          `json:"type"`
	}{}

	// Exclude 'check' entities (internal probes) — only entities actually
	// being monitored should count toward fleet health.
	rows, err := s.pool.Query(ctx, `
		SELECT e.slug, e.type, st.health, st.last_check_at
		FROM entity_status st JOIN entities e ON e.id = st.entity_id
		WHERE e.type <> 'check'
		ORDER BY e.slug`)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	stale := 0
	for rows.Next() {
		var slug, typ, health string
		var lastCheck *time.Time
		if err := rows.Scan(&slug, &typ, &health, &lastCheck); err != nil {
			return nil, err
		}
		switch health {
		case "healthy":
			resp.Summary.Healthy++
		case "degraded":
			resp.Summary.Degraded++
		case "down":
			resp.Summary.Down++
		case "stale":
			stale++
		default:
			resp.Summary.Unknown++
		}
		resp.Entities = append(resp.Entities, struct {
			Health      gen.HealthSummaryEntitiesHealth `json:"health"`
			LastCheckAt *time.Time                      `json:"last_check_at"`
			Slug        string                          `json:"slug"`
			Trend       *gen.HealthSummaryEntitiesTrend `json:"trend"`
			Type        string                          `json:"type"`
		}{
			Health:      gen.HealthSummaryEntitiesHealth(health),
			LastCheckAt: lastCheck,
			Slug:        slug,
			Type:        typ,
		})
	}
	if stale > 0 {
		resp.Summary.Stale = &stale
	}
	return resp, rows.Err()
}

func (s *Server) ExportSeeds(ctx context.Context, req gen.ExportSeedsRequestObject) (gen.ExportSeedsResponseObject, error) {
	exports, err := s.seeds.Export(ctx)
	if err != nil {
		return nil, err
	}
	return gen.ExportSeeds200JSONResponse{
		Ontology:  string(exports["ontology.yaml"]),
		Inventory: string(exports["inventory.yaml"]),
		Policy:    string(exports["policy.yaml"]),
	}, nil
}