package app

import (
	"net/http"
	"time"

	"context"

	"github.com/weaveworks/scope/report"
)

// Raw report handler
func makeRawReportHandler(rep Reporter) CtxHandlerFunc {
	return func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
		timestamp := deserializeTimestamp(r.URL.Query().Get("timestamp"))
		rawReport, err := rep.Report(ctx, timestamp)
		if err != nil {
			respondWith(ctx, w, http.StatusInternalServerError, err)
			return
		}
		censorCfg := report.GetCensorConfigFromRequest(r)
		respondWithReport(ctx, w, r, report.CensorRawReport(rawReport, censorCfg))
	}
}

type probeDesc struct {
	ID       string    `json:"id"`
	Hostname string    `json:"hostname"`
	Version  string    `json:"version"`
	LastSeen time.Time `json:"lastSeen"`
}

// Probe handler
func makeProbeHandler(rep Reporter) CtxHandlerFunc {
	return func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
		r.ParseForm()
		if _, sparse := r.Form["sparse"]; sparse {
			// if we have reports, we must have connected probes
			hasProbes, err := rep.HasReports(ctx, time.Now())
			if err != nil {
				respondWith(ctx, w, http.StatusInternalServerError, err)
			}
			respondWith(ctx, w, http.StatusOK, hasProbes)
			return
		}
		rpt, err := rep.Report(ctx, time.Now())
		if err != nil {
			respondWith(ctx, w, http.StatusInternalServerError, err)
			return
		}
		result := []probeDesc{}
		for _, n := range rpt.Host.Nodes {
			id, _ := n.Latest.Lookup(report.ControlProbeID)
			hostname, _ := n.Latest.Lookup(report.HostName)
			version, dt, _ := n.Latest.LookupEntry(report.ScopeVersion)
			result = append(result, probeDesc{
				ID:       id,
				Hostname: hostname,
				Version:  version,
				LastSeen: dt,
			})
		}
		respondWith(ctx, w, http.StatusOK, result)
	}
}
