package vercel

import (
	"context"
	serrors "errors"

	"github.com/pingcap/errors"
	"github.com/tidbcloud/pkgv2/tracing"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"gorm.io/gorm"
)

type CheckDAO interface {
	AddCheck(ctx context.Context, check Check) error
	DeleteCheck(ctx context.Context, id string) error
	GetCheckByDeploymentID(ctx context.Context, deploymentID string) (check *Check, err error)
}

type checkDAOImpl struct {
	db *gorm.DB
}

func NewXCheckDAO(db *gorm.DB) CheckDAO {
	return &checkDAOImpl{
		db: db,
	}
}

func (d *checkDAOImpl) AddCheck(ctx context.Context, check Check) (err error) {
	ctx, span := Tracer.Start(ctx, "checkDAOImpl.AddCheck")
	defer func() {
		tracing.EndSpan(span, err)
	}()

	err = d.db.Create(&check).Error
	if err != nil {
		return errors.Trace(err)
	}
	tilog.Info(ctx, "Succeed to add check")

	return nil
}

func (d *checkDAOImpl) DeleteCheck(ctx context.Context, id string) (err error) {
	ctx, span := Tracer.Start(ctx, "checkDAOImpl.DeleteCheck")
	defer func() {
		tracing.EndSpan(span, err)
	}()

	err = d.db.Where("id = ?", id).Delete(&Check{}).Error
	if err != nil {
		return errors.Trace(err)
	}
	tilog.Info(ctx, "Succeed to delete check")

	return nil
}

func (d *checkDAOImpl) GetCheckByDeploymentID(ctx context.Context, deploymentID string) (check *Check, err error) {
	_, span := Tracer.Start(ctx, "checkDAOImpl.GetCheckByDeploymentID")
	defer func() {
		tracing.EndSpan(span, err)
	}()

	err = d.db.Preload("VercelIntegrationConfiguration").Where("deployment_id = ?", deploymentID).First(&check).Error
	if err != nil {
		if serrors.Is(err, gorm.ErrRecordNotFound) {
			return nil, nil
		} else {
			return nil, errors.Trace(err)
		}
	}

	return check, nil
}
