package ddl

import (
	"github.com/juju/errors"
	"github.com/pingcap/tidb/ast"
	tddl "github.com/pingcap/tidb/ddl"
	"github.com/pingcap/tidb/model"
	"github.com/pingcap/tidb/mysql"
	"github.com/pingcap/wormhole/pkg/whpb"
)

func (d *ddl) CreateSchema(s *ast.CreateDatabaseStmt) (err error) {
	schema := model.NewCIStr(s.Name)
	if err = checkTooLongSchema(schema); err != nil {
		return errors.Trace(err)
	}

	d.dbs.mu.Lock()
	defer d.dbs.mu.Unlock()

	_, ok := d.dbs.data[schema.O]
	if ok && s.IfNotExists {
		// do nothing
		return nil
	}
	detail := &whpb.SchemaDetail{
		Schema: s.Name,
		Table:  "",
		Detail: nil,
	}
	err = d.etcdClient.SaveSchemaDetail(d.dbinfo.GetHost(), d.dbinfo.GetPort(), s.Name, "", detail)
	if err != nil {
		return errors.Trace(err)
	}
	d.dbs.data[schema.O] = make(map[string]*model.TableInfo)
	return nil
}

func checkTooLongSchema(schema model.CIStr) error {
	if len(schema.O) > mysql.MaxDatabaseNameLength {
		return tddl.ErrTooLongIdent.Gen("[ddl] too long schema %s", schema)
	}
	return nil
}

func (d *ddl) DropSchema(s *ast.DropDatabaseStmt) (err error) {
	schema := model.NewCIStr(s.Name)

	d.dbs.mu.Lock()
	defer d.dbs.mu.Unlock()

	_, ok := d.dbs.data[schema.O]
	if !ok {
		return nil
	}
	host := d.dbinfo.GetHost()
	port := d.dbinfo.GetPort()
	err = d.etcdClient.DeleteSchemaDetail(host, port, schema.String(), "")
	if err != nil {
		return errors.Trace(err)
	}
	delete(d.dbs.data, schema.O)
	return nil
}
