package agent

import (
	"context"
	"encoding/json"
	"net/http"
	"path/filepath"

	"github.com/pingcap/errors"
	"github.com/tidbcloud/dataflow-service/internal/constants"
)

type LightningClient struct {
	AgentClient
	lightningAddr string
}

func (c *LightningClient) requestLightning(ctx context.Context, method, path string, body any) ([]byte, error) {

	path = filepath.Join("proxy/lightning", path)
	extraHeaders := map[string]string{
		constants.LightningAddrHeader: c.lightningAddr,
	}
	return c.FetchResponseWithHeader(ctx, method, path, body, extraHeaders, defaultErrorUnwrapper)
}

type TableProgress struct {
	TotalWritten int64      `json:"w"`
	TotalSize    int64      `json:"z"`
	Status       taskStatus `json:"s"`
	Message      string     `json:"m,omitempty"`
}

type TaskProgress struct {
	Tables  map[string]*TableProgress `json:"t"`
	Status  taskStatus                `json:"s"`
	Message string                    `json:"m,omitempty"`
}

type TasksResponse struct {
	ID    int64  `json:"id"`
	Error string `json:"error"`
}

type taskStatus uint8

const (
	// nolint: unused
	taskStatusNotStarted taskStatus = iota
	taskStatusRunning
	taskStatusCompleted
)

func (c *LightningClient) GetTaskProgress(ctx context.Context) (*TaskProgress, error) {
	path := "progress/task"
	respBytes, err := c.requestLightning(ctx, http.MethodGet, path, nil)
	if err != nil {
		return nil, err
	}

	resp := new(TaskProgress)
	if err = json.Unmarshal(respBytes, resp); err != nil {
		return nil, errors.Trace(err)
	}
	return resp, nil
}
