package repository

import (
	"dataservices/commons/database"
	"dataservices/commons/errs"
	"dataservices/commons/utils"
	"dataservices/internal/entity"

	"gorm.io/gorm/clause"
)

func CreateApiKey(apiKey *entity.DataAPIKey) (*entity.DataAPIKey, error) {
	err := database.DBConn.DB.Table(entity.TableDataApiKeys).Save(&apiKey).Error
	if err != nil {
		return nil, errs.WrapGORMError(err, "Failed to create apikey")
	}
	return apiKey, nil
}

func DeleteApiKey(apiKeyId uint64, createdBy string) error {
	if err := database.DBConn.DB.Table(entity.TableDataApiKeys).Where("id=?", apiKeyId).Updates(&entity.DataAPIKey{UpdatedBy: createdBy, IsDeleted: 1}).Error; err != nil {
		return errs.WrapGORMError(err, "Failed to delete apikey: %d", apiKeyId)
	}
	return nil
}

func GetApiKeyByKey(key string) (*entity.DataAPIKey, error) {
	res := entity.DataAPIKey{}
	err := database.DBConn.DB.Table(entity.TableDataApiKeys).Where("api_key=? and is_deleted=0", key).Find(&res).Error
	if err != nil {
		return nil, errs.WrapGORMError(err, "Failed to get apikey: %s", key)
	}
	return &res, nil
}

func GetApiKeyById(apikeyId uint64) (*entity.DataAPIKey, error) {
	res := entity.DataAPIKey{}
	err := database.DBConn.DB.Table(entity.TableDataApiKeys).Where("id=? and is_deleted=0", apikeyId).Find(&res).Error
	if err != nil {
		return nil, errs.WrapGORMError(err, "Failed to get apikey: %d", apikeyId)
	}
	return &res, nil
}

func AuthAPIKey(dataAppId uint64, apikey string) (bool, error) {
	res := entity.DataAPIKey{}
	err := database.DBConn.DB.Table(entity.TableDataApiKeys).Where("dataapp_id=? and api_key=? and is_deleted=0", dataAppId, apikey).Find(&res).Error
	if err != nil {
		return false, errs.WrapGORMError(err, "Failed to check apikey auth: %d", dataAppId)
	}
	if res.ID != 0 {
		return true, nil
	} else {
		return false, nil
	}
}

func ListApiKeys(appId uint64, source []string) ([]*entity.DataAPIKey, error) {
	var res []*entity.DataAPIKey
	txDB := database.DBConn.DB.Table(entity.TableDataApiKeys).Where("dataapp_id=? and is_deleted=0", appId)
	if len(source) > 0 {
		txDB.Clauses(clause.IN{Column: "source", Values: utils.ToGeneralArr(source...)})
	}
	err := txDB.Find(&res).Error
	if err != nil {
		return nil, errs.WrapGORMError(err, "Failed to list app's apikey: %d", appId)
	}
	return res, nil
}

func CreateDataAPIConsoleMessage(param entity.DataAPIConsoleMessage) error {
	err := database.DBConn.DB.Table(entity.TableDataAPIConsoleMessage).Save(&param).Error
	if err != nil {
		return errs.WrapGORMError(err, "Failed to create console message")
	}
	return nil
}
