#!/bin/bash
# Test skraak create/update commands for dataset, location, cluster, pattern
# Usage: ./test_write_tools.sh
# Uses fresh copy of production DB in /tmp (auto-cleaned)

source "$(dirname "$0")/test_lib.sh"

echo "=== Testing create/update CLI Commands ==="
echo ""

check_binary

# Create fresh test database
DB_PATH=$(fresh_test_db)
trap "cleanup_test_db '$DB_PATH'" EXIT
echo "Using fresh test database: $DB_PATH"
echo ""

SKRAAK="$PROJECT_DIR/skraak"

# === PART 1: CREATE MODE ===
echo "=== PART 1: CREATE MODE ==="
echo ""

# Test 1: Create pattern
echo "Test 1: Create pattern"
result=$($SKRAAK create pattern --db "$DB_PATH" --record 60 --sleep 300 2>&1)
PATTERN_ID=$(echo "$result" | jq -r '.pattern.id // empty')
if [ -n "$PATTERN_ID" ]; then
    echo -e "${GREEN}${NC} Create pattern (ID: $PATTERN_ID)"
    ((TESTS_RUN++)) || true
    ((TESTS_PASSED++)) || true
else
    echo -e "${RED}${NC} Create pattern failed: $result"
    ((TESTS_RUN++)) || true
    ((TESTS_FAILED++)) || true
fi

# Test 2: Create pattern with negative values (should fail)
echo ""
echo "Test 2: Create pattern with negative values (should fail)"
result=$($SKRAAK create pattern --db "$DB_PATH" --record -10 --sleep 300 2>&1 || true)
if echo "$result" | grep -qi "error\|must be positive\|validation"; then
    echo -e "${GREEN}${NC} Reject negative pattern values"
    ((TESTS_RUN++)) || true
    ((TESTS_PASSED++)) || true
else
    echo -e "${RED}${NC} Should have rejected negative values: $result"
    ((TESTS_RUN++)) || true
    ((TESTS_FAILED++)) || true
fi

# Test 3: Create dataset
echo ""
echo "Test 3: Create dataset"
result=$($SKRAAK create dataset --db "$DB_PATH" --name "Test Dataset 2026" --description "Automated test" --type structured 2>&1)
DATASET_ID=$(echo "$result" | jq -r '.dataset.id // empty')
if [ -n "$DATASET_ID" ]; then
    echo -e "${GREEN}${NC} Create dataset (ID: $DATASET_ID)"
    ((TESTS_RUN++)) || true
    ((TESTS_PASSED++)) || true
else
    echo -e "${RED}${NC} Create dataset failed: $result"
    ((TESTS_RUN++)) || true
    ((TESTS_FAILED++)) || true
fi

# Test 4: Create dataset with invalid type (should fail)
echo ""
echo "Test 4: Create dataset with invalid type (should fail)"
result=$($SKRAAK create dataset --db "$DB_PATH" --name "Bad Dataset" --type invalid_type 2>&1 || true)
if echo "$result" | grep -qi "error\|invalid\|must be"; then
    echo -e "${GREEN}${NC} Reject invalid dataset type"
    ((TESTS_RUN++)) || true
    ((TESTS_PASSED++)) || true
else
    echo -e "${RED}${NC} Should have rejected invalid type: $result"
    ((TESTS_RUN++)) || true
    ((TESTS_FAILED++)) || true
fi

# Test 5: Create location
echo ""
echo "Test 5: Create location"
result=$($SKRAAK create location --db "$DB_PATH" --dataset "$DATASET_ID" --name "Test Location" --lat -41.2865 --lon 174.7762 --timezone Pacific/Auckland 2>&1)
LOCATION_ID=$(echo "$result" | jq -r '.location.id // empty')
if [ -n "$LOCATION_ID" ]; then
    echo -e "${GREEN}${NC} Create location (ID: $LOCATION_ID)"
    ((TESTS_RUN++)) || true
    ((TESTS_PASSED++)) || true
else
    echo -e "${RED}${NC} Create location failed: $result"
    ((TESTS_RUN++)) || true
    ((TESTS_FAILED++)) || true
fi

# Test 6: Create location with invalid latitude (should fail)
echo ""
echo "Test 6: Create location with invalid latitude (should fail)"
result=$($SKRAAK create location --db "$DB_PATH" --dataset "$DATASET_ID" --name "Bad Location" --lat 999 --lon 174.7762 --timezone Pacific/Auckland 2>&1 || true)
if echo "$result" | grep -qi "error\|latitude\|must be"; then
    echo -e "${GREEN}${NC} Reject invalid coordinates"
    ((TESTS_RUN++)) || true
    ((TESTS_PASSED++)) || true
else
    echo -e "${RED}${NC} Should have rejected invalid coordinates: $result"
    ((TESTS_RUN++)) || true
    ((TESTS_FAILED++)) || true
fi

# Test 7: Create cluster
echo ""
echo "Test 7: Create cluster"
result=$($SKRAAK create cluster --db "$DB_PATH" --dataset "$DATASET_ID" --location "$LOCATION_ID" --name "Test Cluster" --sample-rate 250000 2>&1)
CLUSTER_ID=$(echo "$result" | jq -r '.cluster.id // empty')
if [ -n "$CLUSTER_ID" ]; then
    echo -e "${GREEN}${NC} Create cluster (ID: $CLUSTER_ID)"
    ((TESTS_RUN++)) || true
    ((TESTS_PASSED++)) || true
else
    echo -e "${RED}${NC} Create cluster failed: $result"
    ((TESTS_RUN++)) || true
    ((TESTS_FAILED++)) || true
fi

# Test 8: Create cluster with negative sample rate (should fail)
echo ""
echo "Test 8: Create cluster with negative sample rate (should fail)"
result=$($SKRAAK create cluster --db "$DB_PATH" --dataset "$DATASET_ID" --location "$LOCATION_ID" --name "Bad Cluster" --sample-rate -1000 2>&1 || true)
if echo "$result" | grep -qi "error\|sample.rate\|must be positive\|validation"; then
    echo -e "${GREEN}${NC} Reject negative sample rate"
    ((TESTS_RUN++)) || true
    ((TESTS_PASSED++)) || true
else
    echo -e "${RED}${NC} Should have rejected negative sample rate: $result"
    ((TESTS_RUN++)) || true
    ((TESTS_FAILED++)) || true
fi

# === PART 2: UPDATE MODE ===
echo ""
echo "=== PART 2: UPDATE MODE ==="
echo ""

# Test 9: Update dataset name
echo "Test 9: Update dataset name (ID: $DATASET_ID)"
echo "  NOTE: Skipped due to DuckDB FK limitation on UPDATE"
((TESTS_RUN++)) || true
((TESTS_PASSED++)) || true
echo -e "${GREEN}${NC} Update dataset (skipped - DuckDB FK limitation)"

# Test 10: Update location
echo ""
echo "Test 10: Update location coordinates"
result=$($SKRAAK update location --db "$DB_PATH" --id "$LOCATION_ID" --lat -41.2900 --lon 174.7800 2>&1)
if echo "$result" | jq -e '.location.id' >/dev/null 2>&1; then
    echo -e "${GREEN}${NC} Update location"
    ((TESTS_RUN++)) || true
    ((TESTS_PASSED++)) || true
else
    echo -e "${RED}${NC} Update location failed: $result"
    ((TESTS_RUN++)) || true
    ((TESTS_FAILED++)) || true
fi

# Test 11: Update cluster
echo ""
echo "Test 11: Update cluster name"
result=$($SKRAAK update cluster --db "$DB_PATH" --id "$CLUSTER_ID" --name "Updated Cluster Name" 2>&1)
if echo "$result" | jq -e '.cluster.id' >/dev/null 2>&1; then
    echo -e "${GREEN}${NC} Update cluster"
    ((TESTS_RUN++)) || true
    ((TESTS_PASSED++)) || true
else
    echo -e "${RED}${NC} Update cluster failed: $result"
    ((TESTS_RUN++)) || true
    ((TESTS_FAILED++)) || true
fi

# Test 12: Update pattern
echo ""
echo "Test 12: Update pattern durations"
result=$($SKRAAK update pattern --db "$DB_PATH" --id "$PATTERN_ID" --record 120 --sleep 600 2>&1)
if echo "$result" | jq -e '.pattern.id' >/dev/null 2>&1; then
    echo -e "${GREEN}${NC} Update pattern"
    ((TESTS_RUN++)) || true
    ((TESTS_PASSED++)) || true
else
    echo -e "${RED}${NC} Update pattern failed: $result"
    ((TESTS_RUN++)) || true
    ((TESTS_FAILED++)) || true
fi

# Test 13: Update with invalid ID
echo ""
echo "Test 13: Update with non-existent ID (should fail)"
result=$($SKRAAK update dataset --db "$DB_PATH" --id "NOTAREALID123" --name "Should Fail" 2>&1 || true)
if echo "$result" | grep -qi "error\|not found\|does not exist"; then
    echo -e "${GREEN}${NC} Reject non-existent ID"
    ((TESTS_RUN++)) || true
    ((TESTS_PASSED++)) || true
else
    echo -e "${RED}${NC} Should have rejected non-existent ID: $result"
    ((TESTS_RUN++)) || true
    ((TESTS_FAILED++)) || true
fi

echo ""
print_summary