package main

import (
	"fmt"
	"log"
	"strings"
	"sync"
	"time"
)

func prepareDB(pgc, tidbc dbCfg, pp prepare) {
	total := 1000 * 1000 //100w
	if pp.Total >= 10 {
		total = pp.Total
	}
	if pp.OneTime <= 0 {
		pp.OneTime = 10
	}
	nthread := pp.NThread
	if nthread <= 0 {
		nthread = default_parallel
	}
	dbname := "sbtest"
	if pp.Db != "" {
		dbname = pp.Db
	}
	tblname := ""
	if pp.Table != "" {
		tblname = pp.Table
	} else {
		tblname = fmt.Sprintf("sbtest_%d", time.Now().Second()%100000)
	}
	//prepare;
	var wg sync.WaitGroup
	wg.Add(nthread)
	avg := total / nthread
	for i := 0; i < nthread; i++ {
		go func(idx int) {
			worker(pgc, tidbc, dbname, tblname, avg, pp.OneTime, idx)
			wg.Done()
		}(i * avg)
	}
	wg.Wait()
}

func worker(pgc, tidbc dbCfg, db, tbl string, total, base int, beg int) {
	LogInfo("worker%d '%s.%s' total=%d,loop_size=%d...", beg, db, tbl, total, base)
	tidb, err := makeTidbDatabase(tidbc, db)
	if err != nil {
		LogErr(err.Error())
		return
	}
	pg, err := makePGDatabase(pgc, db)
	if err != nil {
		LogErr(err.Error())
		return
	}
	times := total / base
	hdr := fmt.Sprintf("insert into %s(id,decimal_test,iv,varchar_test,text_test,date_test,time_test)values", tbl)
	for i := 0; i < times; i++ {
		pos := beg + i*base
		tisql := hdr + worker_loop(base, pos, db_tidb)
		pgsql := hdr + worker_loop(base, pos, db_pg)
		_, err = tidb.db.Exec(tisql)
		if err != nil {
			log.Fatalf("tisql=%s,err:%s", tisql, err.Error())
		}
		_, err = pg.db.Exec(pgsql)
		if err != nil {
			log.Fatalf("err:%s", err.Error())
		}
	}
}

func worker_loop(base, pos int, dt dbType) string {
	t := time.Now()
	var s string
	values := make([]string, base)
	values[0] = fmt.Sprintf("(%d,null,null,null,null,null,null)", pos)
	for j := 1; j < base; j++ {
		idx := pos + j
		switch idx % 4 {
		//case 0: blank;
		case 1:
			s = fmt.Sprintf("just-for-test-%d", idx)
		case 2:
			s = " "
		}
		values[j] = fmt.Sprintf("(%d,%d,%d,'%s','%s','%s','%s')",
			int64(idx),
			int64(idx)%100,
			int32(idx),
			s,
			s,
			t.Format("2006-01-02"), //2006-01-02T15:04:05Z07:00
			t.Format("15:04:05"),
		)
	}
	return strings.Join(values, ",")
}
