package vercel

import (
	"context"
	"fmt"

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

type VercelIntegrationConfigurationDAO interface {
	AddVercelIntegrationConfiguration(ctx context.Context, configuraiton VercelIntegrationConfiguration) error
	GetIntegrationConfigurationByID(ctx context.Context, ID string) (*VercelIntegrationConfiguration, error)
}

type vercelIntegrationConfigurationDAOImpl struct {
	db *gorm.DB
}

func NewVercelIntegrationConfigurationDAO(db *gorm.DB) VercelIntegrationConfigurationDAO {
	return &vercelIntegrationConfigurationDAOImpl{
		db: db,
	}
}

func (d *vercelIntegrationConfigurationDAOImpl) AddVercelIntegrationConfiguration(ctx context.Context, configuraiton VercelIntegrationConfiguration) (err error) {
	ctx, span := Tracer.Start(ctx, "vercelIntegrationConfigurationDAOImpl.AddVercelIntegrationConfiguration")
	defer func() {
		tracing.EndSpan(span, err)
	}()

	err = d.db.Clauses(clause.OnConflict{
		Columns:   []clause.Column{{Name: "id"}},
		DoUpdates: clause.AssignmentColumns([]string{"api_access_token", "updated_at"}),
	}).Create(&configuraiton).Error

	if err != nil {
		return errors.Trace(err)
	}

	tilog.Info(ctx, fmt.Sprintf("Succeed to install integration, configuration: %#v", configuraiton))
	return nil
}

func (d *vercelIntegrationConfigurationDAOImpl) GetIntegrationConfigurationByID(ctx context.Context, ID string) (_ *VercelIntegrationConfiguration, err error) {
	_, span := Tracer.Start(ctx, "vercelIntegrationConfigurationDAOImpl.GetIntegrationConfigurationByID")
	defer func() {
		tracing.EndSpan(span, err)
	}()

	var record VercelIntegrationConfiguration
	if err = d.db.Where("id = ?", ID).First(&record).Error; err != nil {
		return nil, errors.Trace(err)
	}
	return &record, nil
}
