package exporter

import (
	"strings"
	"testing"

	"github.com/stretchr/testify/assert"
)

type testTables struct {
	TableOne []tableOneRow
	TableTwo []tableTwoRow
}

type tableOneRow struct {
	ColumnOne string `sql:"column_one STRING PRIMARY KEY"`
	ColumnTwo int    `sql:"column_two INT8 NOT NULL"`
}

type tableTwoRow struct {
	CompositeKeyOne []byte `sql:"comp_one BYTES"`
	CompositeKeyTwo []byte `sql:"comp_two BYTES"`
	// This is a test comment
	primaryKey struct{} `sql:"PRIMARY KEY (comp_one, comp_two)"`
	// We have this index for good reasons. Spaces are intentional to make sure they are trimmed
	indexForSearch struct{} `sql:"   INDEX comp_two_desc_idx (comp_two DESC)   "`
	// We have this index for even better reasons.
	otherIndex struct{} `sql:"INDEX comp_two_asc_idx (comp_two ASC)"`
}

func TestGenerateSQL_WellFormedInput_CorrectOutput(t *testing.T) {

	gen := GenerateSQL(testTables{}, "test_package_one", SchemaOnly)
	// We cannot have backticks in the multistring literal, so we substitute $$ for them.
	expectedOutput := strings.ReplaceAll(`package test_package_one

// Generated by //go/sql/exporter/
// DO NOT EDIT

const Schema = $$CREATE TABLE IF NOT EXISTS TableOne (
  column_one STRING PRIMARY KEY,
  column_two INT8 NOT NULL
);
CREATE TABLE IF NOT EXISTS TableTwo (
  comp_one BYTES,
  comp_two BYTES,
  PRIMARY KEY (comp_one, comp_two),
  INDEX comp_two_desc_idx (comp_two DESC),
  INDEX comp_two_asc_idx (comp_two ASC)
);
$$
`, "$$", "`")

	assert.Equal(t, expectedOutput, gen)
}

func TestGenerateSQL_WellFormedInput_CorrectOutputIncludingColumnNames(t *testing.T) {

	gen := GenerateSQL(testTables{}, "test_package_one", SchemaAndColumnNames)
	// We cannot have backticks in the multistring literal, so we substitute $$ for them.
	expectedOutput := strings.ReplaceAll(`package test_package_one

// Generated by //go/sql/exporter/
// DO NOT EDIT

const Schema = $$CREATE TABLE IF NOT EXISTS TableOne (
  column_one STRING PRIMARY KEY,
  column_two INT8 NOT NULL
);
CREATE TABLE IF NOT EXISTS TableTwo (
  comp_one BYTES,
  comp_two BYTES,
  PRIMARY KEY (comp_one, comp_two),
  INDEX comp_two_desc_idx (comp_two DESC),
  INDEX comp_two_asc_idx (comp_two ASC)
);
$$

var TableOne = []string{
	"column_one",
	"column_two",
}

var TableTwo = []string{
	"comp_one",
	"comp_two",
}
`, "$$", "`")

	assert.Equal(t, expectedOutput, gen)
}

type malformedTable struct {
	TableOne []tableOneRow
	TableTwo tableTwoRow
}

func TestGenerateSQL_NonSliceField_Panics(t *testing.T) {

	assert.Panics(t, func() {
		GenerateSQL(malformedTable{}, "test_package_one", SchemaOnly)
	})
}

type missingSQLStructs struct {
	TableOne []tableOneRow
	TableTwo []malformedTable
}

func TestGenerateSQL_MissingSQLStructTag_Panics(t *testing.T) {

	assert.Panics(t, func() {
		GenerateSQL(missingSQLStructs{}, "test_package_one", SchemaOnly)
	})
}
