package db

import (
	"log/slog"

	sq "github.com/Masterminds/squirrel"
)

// Region sync status values stored in region_routes.sync_status.
const (
	SyncStatusPending = "pending"
	SyncStatusSyncing = "syncing"
	SyncStatusFailed  = "failed"
	SyncStatusSynced  = "synced"
)

func (db *realDB) InsertAuditLog(api_name, cluster_type, cluster_id string, request_ts_ms, commit_ts_ms int64, request, response string) error {
	_, err := db.Exec("INSERT INTO audit_logs (api_name, cluster_type, cluster_id, request_ts_ms, commit_ts_ms, request, response) VALUES (?,?,?,?,?,?,?)", api_name, cluster_type, cluster_id, request_ts_ms, commit_ts_ms, request, response)
	return err
}

func (db *realDB) UpsertRegionalService(clusterType, logicalRegion, endpoint string) error {
	builder := sq.Insert("region_routes").
		Columns("cluster_type", "logical_region", "endpoint", "sync_status").
		Values(clusterType, logicalRegion, endpoint, SyncStatusPending).
		Suffix("ON DUPLICATE KEY UPDATE endpoint = VALUES(endpoint), sync_status = VALUES(sync_status)")
	sqlStr, args, err := builder.ToSql()
	if err != nil {
		return err
	}
	slog.Info("UpsertRegionalService", "sql", sqlStr, "args", args)
	_, err = db.Exec(sqlStr, args...)
	return err
}

func (db *realDB) DeleteRegionalService(clusterType, logicalRegion string) error {
	builder := sq.Delete("region_routes").
		Where(sq.Eq{"cluster_type": clusterType, "logical_region": logicalRegion})
	sqlStr, args, err := builder.ToSql()
	if err != nil {
		return err
	}
	slog.Info("DeleteRegionalService", "sql", sqlStr, "args", args)
	_, err = db.Exec(sqlStr, args...)
	return err
}

func (db *realDB) ListRegionalServices() ([]*RegionRoute, error) {
	var items []*RegionRoute
	err := db.Select(&items, "select * from region_routes")
	if err != nil {
		return nil, err
	}
	return items, nil
}

func (db *realDB) GetRegionalService(clusterType, logicalRegion string) (*RegionRoute, error) {
	var item RegionRoute
	err := db.Get(&item, "select * from region_routes where cluster_type = ? and logical_region = ?", clusterType, logicalRegion)
	if err != nil {
		return nil, err
	}
	return &item, nil
}

func (db *realDB) UpdateRegionalServiceSyncStatus(clusterType, logicalRegion, syncStatus string) error {
	_, err := db.Exec("UPDATE region_routes SET sync_status = ? WHERE cluster_type = ? AND logical_region = ?", syncStatus, clusterType, logicalRegion)
	return err
}
