package email

import (
	"context"
	"errors"

	msgent "github.com/tidbcloud/devops/entity/message"
	"github.com/tidbcloud/devops/entity/validation"
	"github.com/tidbcloud/devops/pkg/infra/utils/repoopt"
	"github.com/tidbcloud/devops/pkg/service/message/repo/cvt"
	"github.com/tidbcloud/pkgv2/db"
)

type EmailRecordRepo interface {
	Get(ctx context.Context, id uint64) (*msgent.EmailRecord, error)
	List(ctx context.Context, opts ...repoopt.Option) ([]*msgent.EmailRecord, error)
	Create(ctx context.Context, item *msgent.EmailRecord) (*msgent.EmailRecord, error)
	Update(ctx context.Context, item *msgent.EmailRecord) (*msgent.EmailRecord, error)
	Count(ctx context.Context, opts ...repoopt.Option) (int64, error)
	Options() opts
}

func New(db db.Provider, cvter *cvt.Converter) EmailRecordRepo {
	return &emailRecordR{
		driver: &emailRecordD{
			cvter:      cvter,
			dbProvider: db,
		},
	}
}

type emailRecordR struct {
	driver EmailRecordDriver
}

func (r *emailRecordR) Get(ctx context.Context, id uint64) (*msgent.EmailRecord, error) {
	return r.driver.Load(ctx, id)
}

func (r *emailRecordR) List(ctx context.Context, opts ...repoopt.Option) ([]*msgent.EmailRecord, error) {
	return r.driver.Query(ctx, opts...)
}

func (r *emailRecordR) Create(ctx context.Context, item *msgent.EmailRecord) (*msgent.EmailRecord, error) {
	if item.ID != 0 {
		return nil, errors.New("id must be 0 when create")
	}

	if err := validation.Message.EmailRecord(item); err != nil {
		return nil, err
	}

	return r.driver.Save(ctx, item)
}

func (r *emailRecordR) Update(ctx context.Context, item *msgent.EmailRecord) (*msgent.EmailRecord, error) {
	if item.ID == 0 {
		return nil, errors.New("id must not be 0 when update")
	}

	if err := validation.Message.EmailRecord(item); err != nil {
		return nil, err
	}

	return r.driver.Save(ctx, item)
}

func (r *emailRecordR) Count(ctx context.Context, opts ...repoopt.Option) (int64, error) {
	return r.driver.Count(ctx, opts...)
}

func (r *emailRecordR) Options() opts {
	return opts{}
}
