package data

import (
	"bufio"
	"database/sql"
	"fmt"
	"os"

	"github.com/juju/errors"
	"github.com/ngaut/log"
)

func execSQL(db *sql.DB, sql string) error {
	if len(sql) == 0 {
		return nil
	}

	log.Debugf("execute sql %s", sql)
	_, err := db.Exec(sql)
	if err != nil {
		return errors.Annotatef(err, "failed to exec sql %s", sql)
	}

	return nil
}

func loadDDLFile(fileName string) ([]string, error) {
	var ddls []string
	file, err := os.Open(fileName)
	if err != nil {
		return ddls, errors.Trace(err)
	}

	defer file.Close()

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		ddls = append(ddls, scanner.Text())
	}

	if err := scanner.Err(); err != nil {
		return ddls, errors.Trace(err)
	}

	return ddls, nil
}

func cleanTable(db *sql.DB, dbName string, tableName string) error {
	sql := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s", dbName)
	err := execSQL(db, sql)
	if err != nil {
		return errors.Trace(err)
	}

	sql = fmt.Sprintf("DROP TABLE IF EXISTS `%s`.`%s`;", dbName, tableName)
	err = execSQL(db, sql)
	if err != nil {
		return errors.Trace(err)
	}

	sql = fmt.Sprintf("CREATE TABLE IF NOT EXISTS `%s`.`%s` (id bigint NOT NULL AUTO_INCREMENT,update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, primary key(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;", dbName, tableName)
	err = execSQL(db, sql)
	if err != nil {
		return errors.Trace(err)
	}

	return nil
}

func getRandID(db *sql.DB, schemaName, tableName string) (int, error) {
	sql := fmt.Sprintf("SELECT id FROM `%s`.`%s` ORDER BY RAND() LIMIT 1", schemaName, tableName)
	rows, err := db.Query(sql)
	if err != nil {
		return 0, errors.Trace(err)
	}
	defer rows.Close()

	var (
		id int
	)

	for rows.Next() {
		if err = rows.Scan(&id); err != nil {
			return 0, errors.Trace(err)
		}
	}
	return id, nil
}
