package store

import (
	"encoding/json"
	"time"

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

type SvcTaskDBO 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"`
	Name           string          `db:"name"`
	Description    string          `db:"description"`
	Inputs         json.RawMessage `db:"inputs"`
	Outputs        json.RawMessage `db:"outputs"`
	Implementation json.RawMessage `db:"implementation"`
}

func (o *SvcTaskDBO) From(obj taskruns.SvcTask) (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.Name = obj.Name
	o.Description = obj.Description
	o.Inputs, err = json.Marshal(obj.Inputs)
	if err != nil {
		return err
	}
	o.Outputs, err = json.Marshal(obj.Outputs)
	if err != nil {
		return err
	}
	o.Implementation, err = json.Marshal(obj.Implementation)
	if err != nil {
		return err
	}

	return
}

func (o *SvcTaskDBO) To() (obj *taskruns.SvcTask, err error) {
	obj = &taskruns.SvcTask{}
	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.Name = o.Name
	obj.Description = o.Description
	err = json.Unmarshal(o.Inputs, &obj.Inputs)
	if err != nil {
		return nil, err
	}
	err = json.Unmarshal(o.Outputs, &obj.Outputs)
	if err != nil {
		return nil, err
	}
	err = json.Unmarshal(o.Implementation, &obj.Implementation)
	if err != nil {
		return nil, err
	}
	obj.FillHeader()

	return obj, err
}
