package sql_test

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/deepequal/assertdeep"
	"go.skia.org/infra/go/sql/pool"
	"go.skia.org/infra/go/sql/schema"
	"go.skia.org/infra/perf/go/config"
	"go.skia.org/infra/perf/go/sql"
	"go.skia.org/infra/perf/go/sql/expectedschema"
	"go.skia.org/infra/perf/go/sql/sqltest"
)

const DropTables = `
	DROP TABLE IF EXISTS Alerts;
	DROP TABLE IF EXISTS AnomalyGroups;
	DROP TABLE IF EXISTS Commits;
	DROP TABLE IF EXISTS Culprits;
	DROP TABLE IF EXISTS Favorites;
	DROP TABLE IF EXISTS GraphsShortcuts;
	DROP TABLE IF EXISTS ParamSets;
	DROP TABLE IF EXISTS Postings;
	DROP TABLE IF EXISTS Regressions;
	DROP TABLE IF EXISTS Regressions2;
	DROP TABLE IF EXISTS Shortcuts;
	DROP TABLE IF EXISTS SourceFiles;
	DROP TABLE IF EXISTS Subscriptions;
	DROP TABLE IF EXISTS TraceValues;
	DROP TABLE IF EXISTS UserIssues;
`

// LiveSchema has to reflect what's live in prod right now
const LiveSchema = `
CREATE TABLE IF NOT EXISTS Alerts (
	id INT PRIMARY KEY DEFAULT unique_rowid(),
	alert TEXT,
	config_state INT DEFAULT 0,
	last_modified INT,
	sub_name STRING,
	sub_revision STRING
  );
  CREATE TABLE IF NOT EXISTS AnomalyGroups (
	id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
	creation_time TIMESTAMPTZ DEFAULT now(),
	anomaly_ids UUID ARRAY,
	group_meta_data JSONB,
	common_rev_start INT,
	common_rev_end INT,
	action TEXT,
	action_time TIMESTAMPTZ,
	bisection_id TEXT,
	reported_issue_id TEXT,
	culprit_ids UUID ARRAY,
	last_modified_time TIMESTAMPTZ
  );
  CREATE TABLE IF NOT EXISTS Commits (
	commit_number INT PRIMARY KEY,
	git_hash TEXT UNIQUE NOT NULL,
	commit_time INT,
	author TEXT,
	subject TEXT
  );
  CREATE TABLE IF NOT EXISTS Culprits (
	id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
	host STRING,
	project STRING,
	ref STRING,
	revision STRING,
	last_modified INT,
	anomaly_group_ids STRING ARRAY,
	issue_ids STRING ARRAY,
	group_issue_map JSONB,
	UNIQUE INDEX by_revision (revision, host, project, ref)
  );
  CREATE TABLE IF NOT EXISTS Favorites (
	id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
	user_id STRING NOT NULL,
	name STRING,
	url STRING NOT NULL,
	description STRING,
	last_modified INT,
	INDEX by_user_id (user_id)
  );
  CREATE TABLE IF NOT EXISTS GraphsShortcuts (
	id TEXT UNIQUE NOT NULL PRIMARY KEY,
	graphs TEXT
  );
  CREATE TABLE IF NOT EXISTS ParamSets (
	tile_number INT,
	param_key STRING,
	param_value STRING,
	PRIMARY KEY (tile_number, param_key, param_value),
	INDEX by_tile_number (tile_number DESC)
  );
  CREATE TABLE IF NOT EXISTS Postings (
	tile_number INT,
	key_value STRING NOT NULL,
	trace_id BYTES,
	PRIMARY KEY (tile_number, key_value, trace_id),
	INDEX by_trace_id (tile_number, trace_id, key_value),
	INDEX by_key_value (tile_number, key_value)
  );
  CREATE TABLE IF NOT EXISTS Regressions (
	commit_number INT,
	alert_id INT,
	regression TEXT,
	migrated BOOL,
	regression_id TEXT,
	PRIMARY KEY (commit_number, alert_id)
  );
  CREATE TABLE IF NOT EXISTS Regressions2 (
	id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
	commit_number INT,
	prev_commit_number INT,
	alert_id INT,
	creation_time TIMESTAMPTZ DEFAULT now(),
	median_before REAL,
	median_after REAL,
	is_improvement BOOL,
	cluster_type TEXT,
	cluster_summary JSONB,
	frame JSONB,
	triage_status TEXT,
	triage_message TEXT,
	INDEX by_alert_id (alert_id),
	INDEX by_commit_alert (commit_number, alert_id)
  );
  CREATE TABLE IF NOT EXISTS Shortcuts (
	id TEXT UNIQUE NOT NULL PRIMARY KEY,
	trace_ids TEXT
  );
  CREATE TABLE IF NOT EXISTS SourceFiles (
	source_file_id INT PRIMARY KEY DEFAULT unique_rowid(),
	source_file STRING UNIQUE NOT NULL,
	INDEX by_source_file (source_file, source_file_id)
  );
  CREATE TABLE IF NOT EXISTS Subscriptions (
	name STRING UNIQUE NOT NULL,
	revision STRING NOT NULL,
	bug_labels STRING ARRAY,
	hotlists STRING ARRAY,
	bug_component STRING,
	bug_priority INT,
	bug_severity INT,
	bug_cc_emails STRING ARRAY,
	contact_email STRING,
	PRIMARY KEY(name, revision)
  );
  CREATE TABLE IF NOT EXISTS TraceValues (
	trace_id BYTES,
	commit_number INT,
	val REAL,
	source_file_id INT,
	PRIMARY KEY (trace_id, commit_number),
	INDEX by_source_file_id (source_file_id, trace_id)
  );
  CREATE TABLE IF NOT EXISTS UserIssues (
	user_id TEXT NOT NULL,
	trace_key TEXT NOT NULL,
	commit_position INT NOT NULL,
	issue_id INT NOT NULL,
	last_modified TIMESTAMPTZ DEFAULT now(),
	PRIMARY KEY(trace_key, commit_position)
  );
  `

func getSchema(t *testing.T, db pool.Pool) *schema.Description {
	ret, err := schema.GetDescription(context.Background(), db, sql.Tables{}, string(config.CockroachDBDataStoreType))
	require.NoError(t, err)
	require.NotEmpty(t, ret.ColumnNameAndType)
	return ret
}

func Test_LiveToNextSchemaMigration(t *testing.T) {
	ctx := context.Background()
	db := sqltest.NewCockroachDBForTests(t, "desc")

	expectedSchema := getSchema(t, db)

	_, err := db.Exec(ctx, DropTables)
	require.NoError(t, err)
	_, err = db.Exec(ctx, LiveSchema)
	require.NoError(t, err)
	_, err = db.Exec(ctx, expectedschema.FromLiveToNext)
	require.NoError(t, err)

	migratedSchema := getSchema(t, db)
	assertdeep.Equal(t, expectedSchema, migratedSchema)
	// Test the test, make sure at least one known column is present.
	require.Equal(t, "text def: nullable:NO", migratedSchema.ColumnNameAndType["graphsshortcuts.id"])
}
