// Copyright 2021 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package functionality

import (
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	. "github.com/pingcap/endless/pkg/workload"
	. "github.com/pingcap/endless/testcase/geopartition/utils"
)

func flashbackRecoverTest(ctx *SuiteContext) {
	It("Direct placement options should be recovered by flashback/recover table", func() {
		defer func() {
			MustExec(ctx.DB, "DROP TABLE IF EXISTS t1,t2,t3,tx")
			MustExec(ctx.DB, "DROP PLACEMENT POLICY IF EXISTS p1")
			MustExec(ctx.DB, "DROP PLACEMENT POLICY IF EXISTS p2")
			MustExec(ctx.DB, "DROP PLACEMENT POLICY IF EXISTS p3")
		}()

		MustExec(ctx.DB, "DROP TABLE IF EXISTS t1,t2,t3,tx")
		MustExec(ctx.DB, "DROP PLACEMENT POLICY IF EXISTS p1")
		MustExec(ctx.DB, "DROP PLACEMENT POLICY IF EXISTS p2")
		MustExec(ctx.DB, "DROP PLACEMENT POLICY IF EXISTS p3")
		MustExec(ctx.DB, "CREATE PLACEMENT POLICY p1 "+
			"LEADER_CONSTRAINTS='[+region=us-east-1,+disk=ssd]' "+
			"FOLLOWER_CONSTRAINTS='[+region=us-east-2]'",
		)
		MustExec(ctx.DB, "CREATE PLACEMENT POLICY p2 "+
			"LEADER_CONSTRAINTS='[+region=us-east-2,+disk=ssd]' "+
			"FOLLOWER_CONSTRAINTS='[+region=us-east-1]'",
		)
		MustExec(ctx.DB, "CREATE PLACEMENT POLICY p3 "+
			"LEADER_CONSTRAINTS='[+region=us-east-1,+disk=ssd]' "+
			"FOLLOWERS=1",
		)
		MustExec(ctx.DB, "CREATE TABLE t1(id int) PLACEMENT POLICY p1")
		MustExec(ctx.DB, "CREATE TABLE t2(id int) PLACEMENT POLICY p2")
		MustExec(ctx.DB, "CREATE TABLE t3(id int) PLACEMENT POLICY p3")
		MustExec(ctx.DB, "DROP TABLE t1,t2,t3")
		MustExec(ctx.DB, "DROP PLACEMENT POLICY p1")

		// flashback
		MustExec(ctx.DB, "FLASHBACK TABLE t1")
		data := ReadAll(MustQuery(ctx.DB, "SHOW CREATE TABLE t1"))
		Expect(data[0][1]).To(Equal("CREATE TABLE `t1` (\n" +
			"  `id` int(11) DEFAULT NULL\n" +
			") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"))

		// flashback and rename
		MustExec(ctx.DB, "FLASHBACK TABLE t2 TO tx")
		data = ReadAll(MustQuery(ctx.DB, "SHOW CREATE TABLE tx"))
		Expect(data[0][1]).To(Equal("CREATE TABLE `tx` (\n" +
			"  `id` int(11) DEFAULT NULL\n" +
			") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"))

		// recover
		MustExec(ctx.DB, "RECOVER TABLE t3")
		data = ReadAll(MustQuery(ctx.DB, "SHOW CREATE TABLE t3"))
		Expect(data[0][1]).To(Equal("CREATE TABLE `t3` (\n" +
			"  `id` int(11) DEFAULT NULL\n" +
			") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"))
	})
}
