// Copyright 2025 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,
// See the License for the specific language governing permissions and
// limitations under the License.

package dc

import (
	"bytes"
	"database/sql"
	"fmt"

	"workload/schema"
)

const createTable1 = `CREATE TABLE IF NOT EXISTS dc_%d (
    ID decimal(22,0) NOT NULL,
    col1 varchar(50) NOT NULL,
    col2 varchar(100) NOT NULL,
    col3 varchar(10) NOT NULL,
    col4 varchar(20) NOT NULL DEFAULT '105',
    col5 varchar(18) DEFAULT NULL,
    col6 varchar(3) DEFAULT NULL,
    col7 varchar(14) DEFAULT NULL,
    col8 tinyint(4) DEFAULT NULL,
    col9 varchar(50) DEFAULT NULL,
    col10 varchar(6) DEFAULT NULL,
    col11 varchar(6) DEFAULT NULL,
    col12 decimal(22,6) DEFAULT NULL,
    col13 decimal(22,6) DEFAULT NULL,
    col14 decimal(22,6) DEFAULT NULL,
    col15 decimal(22,6) DEFAULT NULL,
    col16 decimal(22,6) DEFAULT NULL,
    col17 datetime DEFAULT NULL,
    col18 datetime DEFAULT NULL,
    col19 datetime DEFAULT NULL,
    col20 datetime DEFAULT NULL,
    col21 int(1) DEFAULT NULL,
    col22 decimal(22,6) NOT NULL DEFAULT '0.000000',
    col23 decimal(22,6) NOT NULL DEFAULT '0.000000',
    col24 int(1) DEFAULT NULL,
    col25 varchar(2) DEFAULT NULL,
    col26 int(1) NOT NULL DEFAULT '0',
    col27 varchar(2) NOT NULL DEFAULT '-1',
    col28 int(1) NOT NULL DEFAULT '5',
    col29 varchar(50) DEFAULT NULL,
    col30 varchar(16) DEFAULT NULL,
    col31 datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
    col32 varchar(124) DEFAULT NULL,
    col33 varchar(40) DEFAULT NULL,
    col34 decimal(22,6) NOT NULL DEFAULT '0.00',
    col35 int(1) DEFAULT NULL,
    col36 datetime DEFAULT CURRENT_TIMESTAMP,
    col37 varchar(50) DEFAULT NULL,
    col38 varchar(20) DEFAULT NULL,
    col39 varchar(50) DEFAULT NULL,
    col40 int(1) NOT NULL DEFAULT '1',
    col41 int(2) NOT NULL DEFAULT '-1',
    col42 varchar(100) DEFAULT '',
    col43 varchar(256) DEFAULT NULL,
    col44 varchar(10) NOT NULL DEFAULT '00',
    col45 varchar(64) NOT NULL DEFAULT '',
    col46 varchar(128) NOT NULL DEFAULT '',
    col47 varchar(128) NOT NULL DEFAULT '',
    col48 varchar(128) NOT NULL DEFAULT '',
    col49 decimal(22,6) NOT NULL DEFAULT '0',
    col50 varchar(100) NOT NULL DEFAULT 'NA',
    col51 datetime DEFAULT NULL,
    col52 decimal(22,6) NOT NULL DEFAULT '0',
    col53 decimal(22,6) NOT NULL DEFAULT '0',
    KEY key1 (col2,col17),
    KEY key2 (col17,col20,col1,ID),
    KEY key3 (col36),
    PRIMARY KEY (col1),
    KEY key4 (col20,col4,col3),
    KEY key5 (col2,col20,col17,col4),
    KEY key6 (col31,col21)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
`

const createTable2 = `CREATE TABLE IF NOT EXISTS t_%d (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  col1 varchar(100) NOT NULL,
  col2 varchar(100) DEFAULT NULL,
  col3 date DEFAULT NULL,
  col4 date DEFAULT NULL,
  col5 bigint(20) DEFAULT '0',
  col6 date DEFAULT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY key (col1)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=2993907144'
`

const createTable3 = `CREATE TABLE IF NOT EXISTS orders_%d (
  ID bigint(20) NOT NULL,
  col1 varchar(20) DEFAULT NULL,
  col2 varchar(50) DEFAULT NULL,
  col3 date NOT NULL,
  col4 varchar(20) DEFAULT NULL,
  col5 varchar(10) DEFAULT NULL,
  col6 varchar(50) DEFAULT NULL,
  col6 varchar(6) DEFAULT NULL,
  col8 decimal(22,6) DEFAULT NULL,
  col9 decimal(22,6) DEFAULT NULL,
  col10 decimal(22,0) DEFAULT NULL,
  col11 decimal(22,6) DEFAULT NULL,
  col12 decimal(22,0) DEFAULT NULL,
  col13 decimal(22,6) NOT NULL DEFAULT '0',
  col14 decimal(22,6) NOT NULL DEFAULT '0',
  col15 decimal(22,6) NOT NULL DEFAULT '0',
  col16 datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  col17 datetime DEFAULT CURRENT_TIMESTAMP,
  col18 varchar(100) DEFAULT NULL,
  col19 varchar(2) DEFAULT NULL,
  col20 decimal(22,6) NOT NULL DEFAULT '0',
  col21 tinyint(4) DEFAULT NULL,
  col22 varchar(20) DEFAULT NULL,
  col23 decimal(22,6) NOT NULL DEFAULT '0',
  col24 tinyint(4) NOT NULL DEFAULT '1',
  col25 decimal(22,6) NOT NULL DEFAULT '0',
  col26 decimal(22,6) NOT NULL DEFAULT '0',
  col27 tinyint(4) NOT NULL DEFAULT '-1',
  col28 decimal(22,6) NOT NULL DEFAULT '0',
  col29 decimal(22,6) DEFAULT '0',
  PRIMARY KEY (ID,col3),
  UNIQUE KEY key (col3,col2,col1,col4,col5,col6,col6,col19,col21,col22,col24,col27),
  KEY key1 (col2,col3),
  KEY key2 (col3,ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
PARTITION BY RANGE COLUMNS(col3)
(PARTITION p20250831 VALUES LESS THAN ('2025-09-01'),
 PARTITION p20250901 VALUES LESS THAN ('2025-09-02'),
 PARTITION p20250902 VALUES LESS THAN ('2025-09-03'),
 PARTITION p20250903 VALUES LESS THAN ('2025-09-04'),
 PARTITION p20250904 VALUES LESS THAN ('2025-09-05'),
 PARTITION p20250905 VALUES LESS THAN ('2025-09-06'),
 PARTITION p20250906 VALUES LESS THAN ('2025-09-07'),
 PARTITION p20250907 VALUES LESS THAN ('2025-09-08'),
 PARTITION p20250908 VALUES LESS THAN ('2025-09-09'),
 PARTITION p20250909 VALUES LESS THAN ('2025-09-10'),
 PARTITION p20250910 VALUES LESS THAN ('2025-09-11'),
 PARTITION p20250911 VALUES LESS THAN ('2025-09-12'),
 PARTITION p20250912 VALUES LESS THAN ('2025-09-13'),
 PARTITION p20250913 VALUES LESS THAN ('2025-09-14'),
 PARTITION p20250914 VALUES LESS THAN ('2025-09-15'),
 PARTITION p20250915 VALUES LESS THAN ('2025-09-16'),
 PARTITION p20250916 VALUES LESS THAN ('2025-09-17'),
 PARTITION p20250917 VALUES LESS THAN ('2025-09-18'),
 PARTITION p20250918 VALUES LESS THAN ('2025-09-19'),
 PARTITION p20250919 VALUES LESS THAN ('2025-09-20'),
 PARTITION p20250920 VALUES LESS THAN ('2025-09-21'),
 PARTITION p20250921 VALUES LESS THAN ('2025-09-22'),
 PARTITION p20250922 VALUES LESS THAN ('2025-09-23'),
 PARTITION p20250923 VALUES LESS THAN ('2025-09-24'),
 PARTITION p20250924 VALUES LESS THAN ('2025-09-25'),
 PARTITION p20250925 VALUES LESS THAN ('2025-09-26'),
 PARTITION p20250926 VALUES LESS THAN ('2025-09-27'),
 PARTITION p20250927 VALUES LESS THAN ('2025-09-28'),
 PARTITION p20250928 VALUES LESS THAN ('2025-09-29'),
 PARTITION p20250929 VALUES LESS THAN ('2025-09-30'),
 PARTITION p20250930 VALUES LESS THAN ('2025-10-01'),
 PARTITION p20251001 VALUES LESS THAN ('2025-10-02'),
 PARTITION p20251002 VALUES LESS THAN ('2025-10-03'),
 PARTITION p20251003 VALUES LESS THAN ('2025-10-04'),
 PARTITION p20251004 VALUES LESS THAN ('2025-10-05'),
 PARTITION p20251005 VALUES LESS THAN ('2025-10-06'),
 PARTITION p20251006 VALUES LESS THAN ('2025-10-07'),
 PARTITION p20251007 VALUES LESS THAN ('2025-10-08'),
 PARTITION p20251008 VALUES LESS THAN ('2025-10-09'),
 PARTITION p20251009 VALUES LESS THAN ('2025-10-10'),
 PARTITION p20251010 VALUES LESS THAN ('2025-10-11'),
 PARTITION p20251011 VALUES LESS THAN ('2025-10-12'),
 PARTITION p20251012 VALUES LESS THAN ('2025-10-13'),
 PARTITION p20251013 VALUES LESS THAN ('2025-10-14'),
 PARTITION p20251014 VALUES LESS THAN ('2025-10-15'),
 PARTITION p20251015 VALUES LESS THAN ('2025-10-16'),
 PARTITION p20251016 VALUES LESS THAN ('2025-10-17'),
 PARTITION p20251017 VALUES LESS THAN ('2025-10-18'),
 PARTITION p20251018 VALUES LESS THAN ('2025-10-19'),
 PARTITION p20251019 VALUES LESS THAN ('2025-10-20'),
 PARTITION p20251020 VALUES LESS THAN ('2025-10-21'),
 PARTITION p20251021 VALUES LESS THAN ('2025-10-22'),
 PARTITION p20251022 VALUES LESS THAN ('2025-10-23'),
 PARTITION p20251023 VALUES LESS THAN ('2025-10-24'),
 PARTITION p20251024 VALUES LESS THAN ('2025-10-25'),
 PARTITION p20251025 VALUES LESS THAN ('2025-10-26'),
 PARTITION p20251026 VALUES LESS THAN ('2025-10-27'),
 PARTITION p20251027 VALUES LESS THAN ('2025-10-28'),
 PARTITION p20251028 VALUES LESS THAN ('2025-10-29'),
 PARTITION p20251029 VALUES LESS THAN ('2025-10-30'),
 PARTITION p20251030 VALUES LESS THAN ('2025-10-31'),
 PARTITION p20251031 VALUES LESS THAN ('2025-11-01'),
 PARTITION p20251101 VALUES LESS THAN ('2025-11-02'),
 PARTITION p20251102 VALUES LESS THAN ('2025-11-03'),
 PARTITION p20251103 VALUES LESS THAN ('2025-11-04'),
 PARTITION p20251104 VALUES LESS THAN ('2025-11-05'),
 PARTITION p20251105 VALUES LESS THAN ('2025-11-06'),
 PARTITION p20251106 VALUES LESS THAN ('2025-11-07'),
 PARTITION p20251107 VALUES LESS THAN ('2025-11-08'),
 PARTITION p20251108 VALUES LESS THAN ('2025-11-09'),
 PARTITION p20251109 VALUES LESS THAN ('2025-11-10'),
 PARTITION p20251110 VALUES LESS THAN ('2025-11-11'),
 PARTITION p20251111 VALUES LESS THAN ('2025-11-12'),
 PARTITION p20251112 VALUES LESS THAN ('2025-11-13'),
 PARTITION p20251113 VALUES LESS THAN ('2025-11-14'),
 PARTITION p20251114 VALUES LESS THAN ('2025-11-15'),
 PARTITION p20251115 VALUES LESS THAN ('2025-11-16'),
 PARTITION p20251116 VALUES LESS THAN ('2025-11-17'),
 PARTITION p20251117 VALUES LESS THAN ('2025-11-18'),
 PARTITION p20251118 VALUES LESS THAN ('2025-11-19'),
 PARTITION p20251119 VALUES LESS THAN ('2025-11-20'),
 PARTITION p20251120 VALUES LESS THAN ('2025-11-21'),
 PARTITION p20251121 VALUES LESS THAN ('2025-11-22'),
 PARTITION p20251122 VALUES LESS THAN ('2025-11-23'),
 PARTITION p20251123 VALUES LESS THAN ('2025-11-24'),
 PARTITION p20251124 VALUES LESS THAN ('2025-11-25'),
 PARTITION p20251125 VALUES LESS THAN ('2025-11-26'),
 PARTITION p20251126 VALUES LESS THAN ('2025-11-27'),
 PARTITION p20251127 VALUES LESS THAN ('2025-11-28'),
 PARTITION p20251128 VALUES LESS THAN ('2025-11-29'),
 PARTITION p20251129 VALUES LESS THAN ('2025-11-30'),
 PARTITION p20251130 VALUES LESS THAN ('2025-12-01'),
 PARTITION p20251201 VALUES LESS THAN ('2025-12-02'),
 PARTITION p20251202 VALUES LESS THAN ('2025-12-03'),
 PARTITION p20251203 VALUES LESS THAN ('2025-12-04'),
 PARTITION p20251204 VALUES LESS THAN ('2025-12-05'),
 PARTITION p20251205 VALUES LESS THAN ('2025-12-06'),
 PARTITION p20251206 VALUES LESS THAN ('2025-12-07'),
 PARTITION p20251207 VALUES LESS THAN ('2025-12-08'),
 PARTITION p20251208 VALUES LESS THAN ('2025-12-09'),
 PARTITION p20251209 VALUES LESS THAN ('2025-12-10'),
 PARTITION p20251210 VALUES LESS THAN ('2025-12-11'),
 PARTITION p20251211 VALUES LESS THAN ('2025-12-12'),
 PARTITION p20251212 VALUES LESS THAN ('2025-12-13'),
 PARTITION p20251213 VALUES LESS THAN ('2025-12-14'),
 PARTITION p20251214 VALUES LESS THAN ('2025-12-15'),
 PARTITION p20251215 VALUES LESS THAN ('2025-12-16'),
 PARTITION p20251216 VALUES LESS THAN ('2025-12-17'),
 PARTITION p20251217 VALUES LESS THAN ('2025-12-18'),
 PARTITION p20251218 VALUES LESS THAN ('2025-12-19'),
 PARTITION p20251219 VALUES LESS THAN ('2025-12-20'),
 PARTITION p20251220 VALUES LESS THAN ('2025-12-21'),
 PARTITION p20251221 VALUES LESS THAN ('2025-12-22'),
 PARTITION p20251222 VALUES LESS THAN ('2025-12-23'),
 PARTITION p20251223 VALUES LESS THAN ('2025-12-24'),
 PARTITION p20251224 VALUES LESS THAN ('2025-12-25'),
 PARTITION p20251225 VALUES LESS THAN ('2025-12-26'),
 PARTITION p20251226 VALUES LESS THAN ('2025-12-27'),
 PARTITION p20251227 VALUES LESS THAN ('2025-12-28'),
 PARTITION p20251228 VALUES LESS THAN ('2025-12-29'),
 PARTITION p20251229 VALUES LESS THAN ('2025-12-30'),
 PARTITION p20251230 VALUES LESS THAN ('2025-12-31'),
 PARTITION p20251231 VALUES LESS THAN ('2026-01-01'))
`

type DCWorkload struct{}

func NewDCWorkload() schema.Workload {
	return &DCWorkload{}
}

// BuildCreateTableStatement returns the create-table sql of the table n
func (c *DCWorkload) BuildCreateTableStatement(n int) string {
	return fmt.Sprintf(createTable1, n)
}

func (c *DCWorkload) BuildInsertSql(tableN int, batchSize int) string {
	var buf bytes.Buffer
	buf.WriteString(BuildInsertForDC(tableN))
	for r := 1; r < batchSize; r++ {
		buf.WriteString(BuildInsertForDC(tableN))
	}
	return buf.String()
}

func (c *DCWorkload) BuildUpdateSql(opts schema.UpdateOption) string {
	panic("unimplemented")
}

func (c *DCWorkload) BuildDeleteSql(opts schema.DeleteOption) string {
	panic("unimplemented")
}

// BuildUpdateSqlWithConn generates update SQL with connection for range updates
func (c *DCWorkload) BuildUpdateSqlWithConn(conn *sql.Conn, opts schema.UpdateOption) string {
	panic("unimplemented")
}
