package cvt

import (
	"encoding/json"
	"time"

	privent "github.com/tidbcloud/devops/entity/privilege"
	"github.com/tidbcloud/devops/models/base"
	privmod "github.com/tidbcloud/devops/models/privilege"
	timeutil "github.com/tidbcloud/devops/pkg/infra/utils/time"
)

type e2m struct{}

func (cvt e2m) Privilege(e *privent.Privilege) *privmod.Privilege {
	m := &privmod.Privilege{
		Updatable: base.Updatable{
			Base: base.Base{ID: base.ID(e.ID)},
		},

		Type:       string(e.Type),
		Source:     e.Source,
		Reason:     e.Reason,
		ExpiredAt:  time.Unix(e.ExpiredAt, 0),
		ClosedAt:   timeutil.TsToTime(e.ClosedAt),
		Applicant:  e.Applicant,
		Phase:      string(e.Phase),
		ApprovalID: e.ApprovalID,
	}

	data, err := json.Marshal(e.Content)
	if err != nil {
		panic(e)
	}
	m.Content = data

	for _, binding := range e.Bindings {
		m.Bindings = append(m.Bindings, cvt.PrivilegeBinding(e.ID, binding))
	}

	return m
}

func (cvt e2m) PrivilegeBinding(pid uint64, e *privent.PrivilegeBinding) *privmod.PrivilegeBinding {
	mod := &privmod.PrivilegeBinding{
		ID: base.ID(e.ID),

		User:        e.User,
		PrivilegeID: pid,
	}

	return mod
}
