package replication

import (
	"encoding/hex"
	"fmt"
	"io"
)

// we don't parse all event, so some we will use GenericEvent instead
type GenericEvent struct {
	Data []byte
}

func (e *GenericEvent) Dump(w io.Writer) {
	fmt.Fprintf(w, "Event data: \n%s", hex.Dump(e.Data))
	fmt.Fprintln(w)
}

func (e *GenericEvent) Decode(data []byte) error {
	e.Data = data

	return nil
}

//below events are generic events, maybe later I will consider handle some.

// type StartEventV3 struct {
// 	Version         uint16
// 	ServerVersion   [50]byte
// 	CreateTimestamp uint32
// }

// type StopEvent struct{}

// type LoadEvent struct {
// 	SlaveProxyID uint32
// 	ExecTime     uint32
// 	SkipLines    uint32
// 	TableNameLen uint8
// 	SchemaLen    uint8
// 	NumFileds    uint32
// 	FieldTerm    uint8
// 	EnclosedBy   uint8
// 	LineTerm     uint8
// 	LineStart    uint8
// 	EscapedBy    uint8
// 	OptFlags     uint8
// 	EmptyFlags   uint8

// 	//len = 1 * NumFields
// 	FieldNameLengths []byte

// 	//len = sum(FieldNameLengths) + NumFields
// 	//array of nul-terminated strings
// 	FieldNames []byte

// 	//len = TableNameLen + 1, nul-terminated string
// 	TableName []byte

// 	//len = SchemaLen + 1, nul-terminated string
// 	SchemaName []byte

// 	//string.NUL
// 	FileName []byte
// }

// type NewLoadEvent struct {
// 	SlaveProxyID  uint32
// 	ExecTime      uint32
// 	SkipLines     uint32
// 	TableNameLen  uint8
// 	SchemaLen     uint8
// 	NumFields     uint32
// 	FieldTermLen  uint8
// 	FieldTerm     []byte
// 	EnclosedByLen uint8
// 	EnclosedBy    []byte
// 	LineTermLen   uint8
// 	LineTerm      []byte
// 	LineStartLen  uint8
// 	LineStart     []byte
// 	EscapedByLen  uint8
// 	EscapedBy     []byte
// 	OptFlags      uint8

// 	//len = 1 * NumFields
// 	FieldNameLengths []byte

// 	//len = sum(FieldNameLengths) + NumFields
// 	//array of nul-terminated strings
// 	FieldNames []byte

// 	//len = TableNameLen, nul-terminated string
// 	TableName []byte

// 	//len = SchemaLen, nul-terminated string
// 	SchemaName []byte

// 	//string.EOF
// 	FileName []byte
// }

// type CreateFileEvent struct {
// 	FileID    uint32
// 	BlockData []byte
// }

// type AppendBlockEvent struct {
// 	FileID    uint32
// 	BlockData []byte
// }

// type ExecLoadEvent struct {
// 	FileID uint32
// }

// type BeginLoadQueryEvent struct {
// 	FileID    uint32
// 	BlockData []byte
// }

// type ExecuteLoadQueryEvent struct {
// 	SlaveProxyID     uint32
// 	ExecutionTime    uint32
// 	SchemaLength     uint8
// 	ErrorCode        uint16
// 	StatusVarsLength uint16

// 	FileID           uint32
// 	StartPos         uint32
// 	EndPos           uint32
// 	DupHandlingFlags uint8
// }

// type DeleteFileEvent struct {
// 	FileID uint32
// }

// type RandEvent struct {
// 	Seed1 uint64
// 	Seed2 uint64
// }

// type UserVarEvent struct {
// 	NameLength uint32
// 	Name       []byte
// 	IsNull     uint8

// 	//if not is null
// 	Type        uint8
// 	Charset     uint32
// 	ValueLength uint32
// 	Value       []byte

// 	//if more data
// 	Flags uint8
// }

// type IncidentEvent struct {
// 	Type          uint16
// 	MessageLength uint8
// 	Message       []byte
// }

// type HeartbeatEvent struct {
// }
