package pimport

import (
	"encoding/json"

	"github.com/pingcap/errors"
	"github.com/pingcap/log"
	"go.uber.org/zap"
	"k8s.io/client-go/kubernetes"
)

// ProgressGetter used to get the running task information from lightning
type ProgressGetter interface {
	// data from from /progress/task API of lightning
	Task() (*TaskProgress, error)
	// data from from /progress/table?t={t} API of lightning
	Table(t string) (*TableCheckpoint, error)
}

type proxyProgressGetter struct {
	cli  kubernetes.Interface
	ns   string
	name string
	port string
}

func newProxyProgressGetter(cli kubernetes.Interface, ns, name, port string) ProgressGetter {
	return &proxyProgressGetter{
		cli:  cli,
		ns:   ns,
		name: name,
		port: port,
	}
}

func (g *proxyProgressGetter) Task() (*TaskProgress, error) {
	resp := g.cli.CoreV1().Services(g.ns).ProxyGet("https", g.name, g.port, "/progress/task", nil)

	data, err := resp.DoRaw()

	if err != nil {
		return nil, errors.AddStack(err)
	}

	log.Debug("get task", zap.String("json", string(data)))

	task := new(TaskProgress)
	err = json.Unmarshal(data, task)
	if err != nil {
		return nil, errors.AddStack(err)
	}

	return task, nil
}

func (g *proxyProgressGetter) Table(t string) (*TableCheckpoint, error) {
	param := map[string]string{
		"t": t,
	}
	resp := g.cli.CoreV1().Services(g.ns).ProxyGet("https", g.name, g.port, "/progress/table", param)

	data, err := resp.DoRaw()
	if err != nil {
		return nil, errors.AddStack(err)
	}

	log.Debug("get table", zap.String("table", t))

	cp := new(TableCheckpoint)
	err = json.Unmarshal(data, cp)
	if err != nil {
		return nil, errors.AddStack(err)
	}

	return cp, nil
}
