//go:build integration
// +build integration

package integration_test

import (
	"fmt"
	"strconv"
	"testing"
)

func TestCounterUpdateSemantics(t *testing.T) {
	session := newSession(t, sessionOptions{disableHostLookup: true})

	keyspace := uniqueKeyspace()
	if err := session.Query(createKeyspaceCQL(keyspace)).Exec(); err != nil {
		t.Fatalf("create keyspace failed: %v", err)
	}
	t.Cleanup(func() {
		_ = session.Query(dropKeyspaceCQL(keyspace)).Exec()
	})

	table := "counter_updates"
	create := fmt.Sprintf("CREATE TABLE %s.%s (id int PRIMARY KEY, cnt counter)", keyspace, table)
	if err := session.Query(create).Exec(); err != nil {
		t.Fatalf("create table failed: %v", err)
	}

	update := fmt.Sprintf("UPDATE %s.%s SET cnt = cnt + 1 WHERE id = 1", keyspace, table)
	if err := session.Query(update).Exec(); err != nil {
		t.Fatalf("increment failed: %v", err)
	}

	update = fmt.Sprintf("UPDATE %s.%s SET cnt = cnt + ? WHERE id = ?", keyspace, table)
	if err := session.Query(update, 5, 1).Exec(); err != nil {
		t.Fatalf("bind marker increment failed: %v", err)
	}

	update = fmt.Sprintf("UPDATE %s.%s SET cnt = cnt - 2 WHERE id = 1", keyspace, table)
	if err := session.Query(update).Exec(); err != nil {
		t.Fatalf("decrement failed: %v", err)
	}

	rows, err := scanRows(session, fmt.Sprintf("SELECT cnt FROM %s.%s WHERE id = 1", keyspace, table))
	if err != nil {
		t.Fatalf("select failed: %v", err)
	}
	if len(rows) != 1 {
		t.Fatalf("expected 1 row, got %d", len(rows))
	}
	value, err := strconv.ParseInt(asString(rows[0]["cnt"]), 10, 64)
	if err != nil {
		t.Fatalf("parse counter value failed: %v", err)
	}
	if value != 4 {
		t.Fatalf("unexpected counter value: %d", value)
	}
}
