package survey

import (
	"context"
	"errors"
	"fmt"

	"github.com/tidbcloud/account/internel/dao/entity"
	"github.com/tidbcloud/tiinf/errs"
	"gorm.io/gorm"
)

const (
	tableName = "surveys"
)

type SurveyDaoIface interface {
	CreateSurvey(ctx context.Context, tx *gorm.DB, survey *entity.Survey) (*entity.Survey, error)
	ListSurveysBySurveyNameIdentTyeVal(ctx context.Context, tx *gorm.DB, surveyName, identTye, identVal string) ([]entity.Survey, error)
}

type SurveyDao struct {
}

func NewSurveyDao() SurveyDaoIface {
	return &SurveyDao{}
}

func (dao *SurveyDao) CreateSurvey(ctx context.Context, tx *gorm.DB, survey *entity.Survey) (*entity.Survey, error) {
	err := tx.Table(tableName).Save(survey).Error
	if err != nil {
		return nil, errs.WrapGORMError(err, fmt.Sprintf("CreateSurvey error: %+v", survey))
	}
	return survey, nil
}

func (dao *SurveyDao) ListSurveysBySurveyNameIdentTyeVal(ctx context.Context, tx *gorm.DB, surveyName, identTye, identVal string) ([]entity.Survey, error) {
	var res []entity.Survey
	err := tx.Table(tableName).Where("survey_name=? and ident_type=? and ident_val=?", surveyName, identTye, identVal).Find(&res).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, nil
		}
		return nil, errs.WrapGORMError(err, fmt.Sprintf("ListSurveysBySurveyNameIdentTyeVal error: %+v, %+v, %+v", surveyName, identTye, identVal))
	}
	return res, nil
}
