package executor

import (
	"context"
	"fmt"

	"github.com/everything-on-mysql/cassandra-on-mysql/pkg/cql/cqlerrors"
	"github.com/everything-on-mysql/cassandra-on-mysql/pkg/cql/parser"
)

func (e *ddlExecutor) executeTruncate(ctx context.Context, user, password string, stmt *parser.TruncateStatement) (*QueryResult, error) {
	if stmt == nil {
		return nil, cqlerrors.Invalid("invalid TRUNCATE statement")
	}
	if err := e.validateTableName(stmt.Table); err != nil {
		return nil, err
	}
	if err := e.ensureUserKeyspace(stmt.Table.Schema); err != nil {
		return nil, err
	}
	if err := e.ensureSchemaExists(ctx, user, password, stmt.Table.Schema); err != nil {
		return nil, err
	}

	if e.schemaManager != nil {
		exists, err := e.schemaManager.TableExists(ctx, user, password, stmt.Table.Schema, stmt.Table.Name)
		if err != nil {
			return nil, err
		}
		if !exists {
			return nil, cqlerrors.Invalid(fmt.Sprintf("table %q.%q does not exist", stmt.Table.Schema, stmt.Table.Name))
		}
	}

	sql, err := e.translator.Translate(stmt)
	if err != nil {
		return nil, cqlerrors.Invalid(err.Error())
	}

	conn, release, err := e.getConn(ctx, user, password)
	if err != nil {
		return nil, fmt.Errorf("failed to get connection: %w", err)
	}
	if release != nil {
		defer release()
	}

	// TRUNCATE does not change schema, so no schema change event.
	return e.executeDDL(ctx, conn, sql)
}
