package cvt

import (
	"encoding/json"

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

type m2e struct{}

func (cvt m2e) Privilege(m *privmod.Privilege) *privent.Privilege {
	e := &privent.Privilege{
		ID:         m.ID.Uint64(),
		CreatedAt:  m.CreatedAt.Unix(),
		Type:       privent.PrivilegeType(m.Type),
		Source:     m.Source,
		Reason:     m.Reason,
		ExpiredAt:  m.ExpiredAt.Unix(),
		ClosedAt:   timeutil.TimeToTs(m.ClosedAt),
		Applicant:  m.Applicant,
		Phase:      privent.PrivilegePhase(m.Phase),
		ApprovalID: m.ApprovalID,
	}

	if m.Content != nil {
		content := privent.PrivilegeContent{}
		if err := json.Unmarshal(m.Content, &content); err != nil {
			panic(err)
		}
		e.Content = content
	}

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

	return e
}

func (cvt m2e) PrivilegeBinding(m *privmod.PrivilegeBinding) *privent.PrivilegeBinding {
	e := &privent.PrivilegeBinding{
		ID:   m.ID.Uint64(),
		User: m.User,
	}

	return e
}
