// Copyright (C) MongoDB, Inc. 2017-present.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

package wiremessage

import (
	"errors"
	"fmt"
	"github.com/mongodb/mongo-go-driver/x/bsonx"
)

// KillCursors represents the OP_KILL_CURSORS message of the MongoDB wire protocol.
type KillCursors struct {
	MsgHeader         Header
	Zero              int32
	NumberOfCursorIDs int32
	CursorIDs         []int64

	DatabaseName   string
	CollectionName string
}

// MarshalWireMessage implements the Marshaler and WireMessage interfaces.
func (kc KillCursors) MarshalWireMessage() ([]byte, error) {
	b := make([]byte, 0, kc.Len())
	return kc.AppendWireMessage(b)
}

// ValidateWireMessage implements the Validator and WireMessage interfaces.
func (kc KillCursors) ValidateWireMessage() error {
	if int(kc.MsgHeader.MessageLength) != kc.Len() {
		return errors.New("incorrect header: message length is not correct")
	}
	if kc.MsgHeader.OpCode != OpKillCursors {
		return errors.New("incorrect header: op code is not OpGetMore")
	}
	if kc.NumberOfCursorIDs != int32(len(kc.CursorIDs)) {
		return errors.New("incorrect number of cursor IDs")
	}

	return nil
}

// AppendWireMessage implements the Appender and WireMessage interfaces.
func (kc KillCursors) AppendWireMessage(b []byte) ([]byte, error) {
	var err error
	err = kc.MsgHeader.SetDefaults(kc.Len(), OpKillCursors)

	b = kc.MsgHeader.AppendHeader(b)
	b = appendInt32(b, kc.Zero)
	b = appendInt32(b, kc.NumberOfCursorIDs)
	for _, id := range kc.CursorIDs {
		b = appendInt64(b, id)
	}

	return b, err
}

// String implements the fmt.Stringer interface.
func (kc KillCursors) String() string {
	return fmt.Sprintf(
		`OP_KILL_CURSORS{MsgHeader: %s, Zero: %d, Number of Cursor IDS: %d, Cursor IDs: %v}`,
		kc.MsgHeader, kc.Zero, kc.NumberOfCursorIDs, kc.CursorIDs,
	)
}

// Len implements the WireMessage interface.
func (kc KillCursors) Len() int {
	// Header + Zero + Number IDs + 8 * Number IDs
	return 16 + 4 + 4 + int(kc.NumberOfCursorIDs*8)
}

// UnmarshalWireMessage implements the Unmarshaler interface.
func (kc *KillCursors) UnmarshalWireMessage([]byte) error {
	panic("not implemented")
}

// CommandDocument creates a BSON document representing this command.
func (kc KillCursors) CommandDocument() bsonx.Doc {
	cursors := make([]bsonx.Val, len(kc.CursorIDs))
	for i, id := range kc.CursorIDs {
		cursors[i] = bsonx.Int64(id)
	}

	return bsonx.Doc{
		{"killCursors", bsonx.String(kc.CollectionName)},
		{"cursors", bsonx.Array(cursors)},
	}
}
