package entity

import (
	"encoding/json"

	app_entity "github.com/tidbcloud/dataflow-service/app/repo/entity"
	"github.com/tidbcloud/dataflow-service/pkg/log"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

func (i *Import) BeforeSave(tx *gorm.DB) error {
	appImp := i.convert2AppEntity(tx)
	if appImp == nil {
		return nil
	}

	app_entity.GetEventHookerManager().RunBeforeSave(app_entity.ImportDisplayType, tx, appImp)
	return nil
}

func (i *Import) AfterSave(tx *gorm.DB) error {
	appImp := i.convert2AppEntity(tx)
	if appImp == nil {
		return nil
	}

	app_entity.GetEventHookerManager().RunAfterSave(app_entity.ImportDisplayType, tx, appImp)
	return nil
}

func (i *Import) convert2AppEntity(tx *gorm.DB) *app_entity.Import {
	logger := log.GetLogger(tx.Statement.Context)
	oJSON, err := json.Marshal(i)
	if err != nil {
		logger.Warn("Import failed to marshal",
			zap.Any("entity", i),
			zap.Error(err))
		return nil
	}

	// Deserialize internal.Import into an empty app_entity.Import
	var result app_entity.Import
	err = json.Unmarshal(oJSON, &result)
	if err != nil {
		logger.Warn("Import failed to unmarshal",
			zap.Any("entity", i),
			zap.Error(err))

		return nil
	}
	return &result
}
