package cvt

import (
	"google.golang.org/protobuf/types/known/timestamppb"
	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	apiv1 "github.com/tidbcloud/infra-provider/api/tidbcloud/cluster-server/v1"
)

func time2PB(t *v1.Time) *timestamppb.Timestamp {
	if t == nil {
		return nil
	}
	return timestamppb.New(t.Time)
}

func stepPhases2PB(phases []cloudv1.StepPhase) []*apiv1.StepPhase {
	if len(phases) == 0 {
		return nil
	}
	out := make([]*apiv1.StepPhase, 0, len(phases))
	for i := range phases {
		p := &phases[i]
		out = append(out, &apiv1.StepPhase{
			Name:             p.Name,
			BeginTime:        time2PB(p.BeginTime),
			EndTime:          time2PB(p.EndTime),
			ProgressInfo:     p.ProgressInfo,
			Done:             int32(p.Done),
			Total:            int32(p.Total),
			MaxDone:          int32(p.MaxDone),
			LastProgressTime: time2PB(p.LastProgressTime),
		})
	}
	return out
}

func UpgradeOperation2PB(uo *cloudv1.UpgradeOperation) *apiv1.UpgradeNodesResponse {
	resp := &apiv1.UpgradeNodesResponse{
		Message:  uo.Status.Reason,
		Duration: uo.Status.Duration,
	}
	if uo.Status.BeginTime != nil {
		resp.StartTime = time2PB(uo.Status.BeginTime)
	}
	if uo.Status.EndTime != nil {
		resp.EndTime = time2PB(uo.Status.EndTime)
	}

	step := uo.Status.CurrentStep
	if step == nil && len(uo.Status.FinishedSteps) > 0 {
		last := uo.Status.FinishedSteps[len(uo.Status.FinishedSteps)-1]
		step = &last
	}
	if step != nil {
		resp.Phases = stepPhases2PB(step.Phases)
		resp.LastProgressTime = time2PB(step.LastProgressTime)
	}
	return resp
}
