package ether

import (
	"github.com/pingcap/wormhole/pkg/whpb"
)

// Command is an interface to generate WorkerHeartbeatResponse
type Command interface {
	Generate() *whpb.WorkerHeartbeatResponse
}

type signContract struct {
	worker *workerInfo
	job    *jobInfo
}

func newSignContractCmd(worker *workerInfo, job *jobInfo) *signContract {
	return &signContract{
		worker: worker,
		job:    job,
	}
}

// Generate implements Command's Generate interface
func (s *signContract) Generate() *whpb.WorkerHeartbeatResponse {
	header := &whpb.ResponseHeader{
		WorkerId: s.worker.GetId(),
	}

	response := &whpb.WorkerHeartbeatResponse{
		Header:  header,
		NewJobs: []*whpb.Job{s.job.getJob()},
	}

	return response
}

type releaseContract struct {
	worker *workerInfo
	job    *jobInfo
}

func newReleaseContract(worker *workerInfo, job *jobInfo) *releaseContract {
	return &releaseContract{
		worker: worker,
		job:    job,
	}
}

// Generate implements Command's Generate interface
func (s *releaseContract) Generate() *whpb.WorkerHeartbeatResponse {
	header := &whpb.ResponseHeader{
		WorkerId: s.worker.GetId(),
	}

	response := &whpb.WorkerHeartbeatResponse{
		Header:         header,
		ObsoleteJobIds: []uint64{s.job.GetId()},
	}

	return response
}
