package store

import (
	"encoding/json"
	"time"

	"github.com/pingcap/test-infra/common/model"
	"github.com/pingcap/test-infra/common/model/tcms/taskruns"
)

type SvcTaskRunDBO struct {
	ID                   model.ID        `db:"id"`
	CreateAt             time.Time       `db:"create_at"`
	UpdateAt             time.Time       `db:"update_at"`
	CreateByID           model.ID        `db:"create_by_id"`
	UpdateByID           model.ID        `db:"update_by_id"`
	SpecSvcTaskName      string          `db:"spec_svc_task_name"`
	SpecInputs           json.RawMessage `db:"spec_inputs"`
	StatusCompleted      bool            `db:"status_completed"`
	StatusMessage        string          `db:"status_message"`
	StatusOutputs        json.RawMessage `db:"status_outputs"`
	StatusImplementation json.RawMessage `db:"status_implementation"`
}

func (o *SvcTaskRunDBO) From(obj taskruns.SvcTaskRun) (err error) {
	o.ID = obj.MetaData.ID
	o.CreateAt = obj.MetaData.CreateAt
	o.UpdateAt = obj.MetaData.UpdateAt
	o.CreateByID = obj.MetaData.CreateByID
	o.UpdateByID = obj.MetaData.UpdateByID
	o.SpecSvcTaskName = obj.Spec.SvcTaskName
	o.SpecInputs, err = json.Marshal(obj.Spec.Inputs)
	if err != nil {
		return err
	}
	o.StatusCompleted = obj.Status.Completed
	o.StatusMessage = obj.Status.Message
	o.StatusOutputs, err = json.Marshal(obj.Status.Outputs)
	if err != nil {
		return err
	}
	o.StatusImplementation, err = json.Marshal(obj.Status.Implementation)
	if err != nil {
		return err
	}

	return
}

func (o *SvcTaskRunDBO) To() (obj *taskruns.SvcTaskRun, err error) {
	obj = &taskruns.SvcTaskRun{}
	obj.MetaData.ID = o.ID
	obj.MetaData.CreateAt = o.CreateAt
	obj.MetaData.UpdateAt = o.UpdateAt
	obj.MetaData.CreateByID = o.CreateByID
	obj.MetaData.UpdateByID = o.UpdateByID
	obj.Spec.SvcTaskName = o.SpecSvcTaskName
	err = json.Unmarshal(o.SpecInputs, &obj.Spec.Inputs)
	if err != nil {
		return nil, err
	}
	obj.Status.Completed = o.StatusCompleted
	obj.Status.Message = o.StatusMessage
	err = json.Unmarshal(o.StatusOutputs, &obj.Status.Outputs)
	if err != nil {
		return nil, err
	}
	err = json.Unmarshal(o.StatusImplementation, &obj.Status.Implementation)
	if err != nil {
		return nil, err
	}
	obj.FillHeader()
	return obj, err
}
