package cql

import (
	"fmt"

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

const schemaChangeEventType = "SCHEMA_CHANGE"

func buildSchemaChangeEventBody(change *types.SchemaChange) ([]byte, error) {
	if change == nil {
		return nil, fmt.Errorf("schema change is required")
	}
	body := make([]byte, 0, 64)
	body = append(body, writeString(schemaChangeEventType)...)
	body = append(body, writeString(change.ChangeType)...)
	body = append(body, writeString(change.Target)...)

	switch change.Target {
	case "KEYSPACE":
		body = append(body, writeString(change.Keyspace)...)
	case "TABLE", "TYPE":
		body = append(body, writeString(change.Keyspace)...)
		body = append(body, writeString(change.Name)...)
	default:
		return nil, fmt.Errorf("unsupported schema change target %q", change.Target)
	}
	return body, nil
}

func buildSchemaChangeEventFrame(protoVer byte, change *types.SchemaChange) (*Frame, error) {
	body, err := buildSchemaChangeEventBody(change)
	if err != nil {
		return nil, err
	}
	return &Frame{
		Version: ResponseVersion(protoVer),
		Flags:   0,
		Stream:  -1,
		Opcode:  OpcodeEvent,
		Length:  int32(len(body)),
		Body:    body,
	}, nil
}
