package intmslibrarycontrol1

import (
	"context"
	"fmt"
	"strings"
	"unicode/utf16"

	dcerpc "github.com/oiweiwei/go-msrpc/dcerpc"
	errors "github.com/oiweiwei/go-msrpc/dcerpc/errors"
	uuid "github.com/oiweiwei/go-msrpc/midl/uuid"
	iunknown "github.com/oiweiwei/go-msrpc/msrpc/dcom/iunknown/v0"
	ndr "github.com/oiweiwei/go-msrpc/ndr"
)

var (
	_ = context.Background
	_ = fmt.Errorf
	_ = utf16.Encode
	_ = strings.TrimPrefix
	_ = ndr.ZeroString
	_ = (*uuid.UUID)(nil)
	_ = (*dcerpc.SyntaxID)(nil)
	_ = (*errors.Error)(nil)
	_ = iunknown.GoPackage
)

// INtmsLibraryControl1 server interface.
type LibraryControl1Server interface {

	// IUnknown base class.
	iunknown.UnknownServer

	// The EjectNtmsMedia method ejects media from theport of a library.
	EjectNTMSMedia(context.Context, *EjectNTMSMediaRequest) (*EjectNTMSMediaResponse, error)

	// The InjectNtmsMedia method allows media to be inserted into the port of an online
	// library.
	InjectNTMSMedia(context.Context, *InjectNTMSMediaRequest) (*InjectNTMSMediaResponse, error)

	// The AccessNtmsLibraryDoor method unlocks the door of an online library.
	AccessNTMSLibraryDoor(context.Context, *AccessNTMSLibraryDoorRequest) (*AccessNTMSLibraryDoorResponse, error)

	// The CleanNtmsDrive method queues a cleaning request for a drive.
	CleanNTMSDrive(context.Context, *CleanNTMSDriveRequest) (*CleanNTMSDriveResponse, error)

	// The DismountNtmsDrive method moves a medium from a drive to its storage slot.
	DismountNTMSDrive(context.Context, *DismountNTMSDriveRequest) (*DismountNTMSDriveResponse, error)

	// The InventoryNtmsLibrary method queues a request to perform an inventory of an online
	// library.
	InventoryNTMSLibrary(context.Context, *InventoryNTMSLibraryRequest) (*InventoryNTMSLibraryResponse, error)

	// INtmsLibraryControl1_LocalOnlyOpnum09 operation.
	LibraryControl1LocalOnlyOpnum09(context.Context, *LibraryControl1LocalOnlyOpnum09Request) (*LibraryControl1LocalOnlyOpnum09Response, error)

	// The CancelNtmsLibraryRequest method cancels outstanding library requests.
	CancelNTMSLibraryRequest(context.Context, *CancelNTMSLibraryRequestRequest) (*CancelNTMSLibraryRequestResponse, error)

	// The ReserveNtmsCleanerSlot method reserves a slot in an online library for a drive
	// cleaner cartridge.
	ReserveNTMSCleanerSlot(context.Context, *ReserveNTMSCleanerSlotRequest) (*ReserveNTMSCleanerSlotResponse, error)

	// The ReleaseNtmsCleanerSlot method removes an existing slot reservation for a cleaning
	// cartridge.
	ReleaseNTMSCleanerSlot(context.Context, *ReleaseNTMSCleanerSlotRequest) (*ReleaseNTMSCleanerSlotResponse, error)

	// The InjectNtmsCleaner method allows a cleaner cartridge to be inserted into an online
	// library unit.
	InjectNTMSCleaner(context.Context, *InjectNTMSCleanerRequest) (*InjectNTMSCleanerResponse, error)

	// The EjectNtmsCleaner method ejects the cleaning cartridge from the currently reserved
	// cleaner slot.
	EjectNTMSCleaner(context.Context, *EjectNTMSCleanerRequest) (*EjectNTMSCleanerResponse, error)

	// The DeleteNtmsLibrary method deletes a library and all the devices in it. Any media
	// in the library are moved to the offline library.
	DeleteNTMSLibrary(context.Context, *DeleteNTMSLibraryRequest) (*DeleteNTMSLibraryResponse, error)

	// The DeleteNtmsDrive method deletes a drive.
	DeleteNTMSDrive(context.Context, *DeleteNTMSDriveRequest) (*DeleteNTMSDriveResponse, error)

	// The GetNtmsRequestOrder method retrieves the order in which a request will be processed
	// in the library queue.
	GetNTMSRequestOrder(context.Context, *GetNTMSRequestOrderRequest) (*GetNTMSRequestOrderResponse, error)

	// The SetNtmsRequestOrder method sets the order in which a request will be processed
	// in the library queue.
	SetNTMSRequestOrder(context.Context, *SetNTMSRequestOrderRequest) (*SetNTMSRequestOrderResponse, error)

	// The DeleteNtmsRequests method deletes a request or a list of requests. Requests that
	// have already been submitted or are queued, waiting, or in progress MUST NOT be deleted.
	DeleteNTMSRequests(context.Context, *DeleteNTMSRequestsRequest) (*DeleteNTMSRequestsResponse, error)

	// The BeginNtmsDeviceChangeDetection method begins a device change detection session.
	// The libraries for which media change detection is required MUST be set using the
	// SetNtmsDeviceChangeDetection method. Implementation of this method is optional.<23>
	// The server MAY return a non-implemented error (ERROR_CALL_NOT_IMPLEMENTED, 0x80070078).<24>
	BeginNTMSDeviceChangeDetection(context.Context, *BeginNTMSDeviceChangeDetectionRequest) (*BeginNTMSDeviceChangeDetectionResponse, error)

	// The SetNtmsDeviceChangeDetection method sets one or more target devices for change
	// detection. Implementation of this method is optional.<25> The server MAY return a
	// non-implemented error (ERROR_CALL_NOT_IMPLEMENTED, 0x80070078). <26>
	SetNTMSDeviceChangeDetection(context.Context, *SetNTMSDeviceChangeDetectionRequest) (*SetNTMSDeviceChangeDetectionResponse, error)

	// The EndNtmsDeviceChangeDetection method ends device change detection for one or more
	// target devices. Implementation of this method is optional.<27> The server MAY return
	// a non-implemented error (ERROR_CALL_NOT_IMPLEMENTED, 0x80070078). <28>
	EndNTMSDeviceChangeDetection(context.Context, *EndNTMSDeviceChangeDetectionRequest) (*EndNTMSDeviceChangeDetectionResponse, error)
}

func RegisterLibraryControl1Server(conn dcerpc.Conn, o LibraryControl1Server, opts ...dcerpc.Option) {
	conn.RegisterServer(NewLibraryControl1ServerHandle(o), append(opts, dcerpc.WithAbstractSyntax(LibraryControl1SyntaxV0_0))...)
}

func NewLibraryControl1ServerHandle(o LibraryControl1Server) dcerpc.ServerHandle {
	return func(ctx context.Context, opNum int, r ndr.Reader) (dcerpc.Operation, error) {
		return LibraryControl1ServerHandle(ctx, o, opNum, r)
	}
}

func LibraryControl1ServerHandle(ctx context.Context, o LibraryControl1Server, opNum int, r ndr.Reader) (dcerpc.Operation, error) {
	switch opNum {
	case 0: // EjectNtmsMedia
		op := &xxx_EjectNTMSMediaOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &EjectNTMSMediaRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.EjectNTMSMedia(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 1: // InjectNtmsMedia
		op := &xxx_InjectNTMSMediaOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &InjectNTMSMediaRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.InjectNTMSMedia(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 2: // AccessNtmsLibraryDoor
		op := &xxx_AccessNTMSLibraryDoorOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &AccessNTMSLibraryDoorRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.AccessNTMSLibraryDoor(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 3: // CleanNtmsDrive
		op := &xxx_CleanNTMSDriveOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &CleanNTMSDriveRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.CleanNTMSDrive(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 4: // DismountNtmsDrive
		op := &xxx_DismountNTMSDriveOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &DismountNTMSDriveRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.DismountNTMSDrive(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 5: // InventoryNtmsLibrary
		op := &xxx_InventoryNTMSLibraryOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &InventoryNTMSLibraryRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.InventoryNTMSLibrary(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 6: // INtmsLibraryControl1_LocalOnlyOpnum09
		op := &xxx_LibraryControl1LocalOnlyOpnum09Operation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &LibraryControl1LocalOnlyOpnum09Request{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.LibraryControl1LocalOnlyOpnum09(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 7: // CancelNtmsLibraryRequest
		op := &xxx_CancelNTMSLibraryRequestOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &CancelNTMSLibraryRequestRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.CancelNTMSLibraryRequest(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 8: // ReserveNtmsCleanerSlot
		op := &xxx_ReserveNTMSCleanerSlotOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &ReserveNTMSCleanerSlotRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.ReserveNTMSCleanerSlot(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 9: // ReleaseNtmsCleanerSlot
		op := &xxx_ReleaseNTMSCleanerSlotOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &ReleaseNTMSCleanerSlotRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.ReleaseNTMSCleanerSlot(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 10: // InjectNtmsCleaner
		op := &xxx_InjectNTMSCleanerOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &InjectNTMSCleanerRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.InjectNTMSCleaner(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 11: // EjectNtmsCleaner
		op := &xxx_EjectNTMSCleanerOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &EjectNTMSCleanerRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.EjectNTMSCleaner(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 12: // DeleteNtmsLibrary
		op := &xxx_DeleteNTMSLibraryOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &DeleteNTMSLibraryRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.DeleteNTMSLibrary(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 13: // DeleteNtmsDrive
		op := &xxx_DeleteNTMSDriveOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &DeleteNTMSDriveRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.DeleteNTMSDrive(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 14: // GetNtmsRequestOrder
		op := &xxx_GetNTMSRequestOrderOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &GetNTMSRequestOrderRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.GetNTMSRequestOrder(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 15: // SetNtmsRequestOrder
		op := &xxx_SetNTMSRequestOrderOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &SetNTMSRequestOrderRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.SetNTMSRequestOrder(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 16: // DeleteNtmsRequests
		op := &xxx_DeleteNTMSRequestsOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &DeleteNTMSRequestsRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.DeleteNTMSRequests(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 17: // BeginNtmsDeviceChangeDetection
		op := &xxx_BeginNTMSDeviceChangeDetectionOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &BeginNTMSDeviceChangeDetectionRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.BeginNTMSDeviceChangeDetection(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 18: // SetNtmsDeviceChangeDetection
		op := &xxx_SetNTMSDeviceChangeDetectionOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &SetNTMSDeviceChangeDetectionRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.SetNTMSDeviceChangeDetection(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	case 19: // EndNtmsDeviceChangeDetection
		op := &xxx_EndNTMSDeviceChangeDetectionOperation{}
		if err := op.UnmarshalNDRRequest(ctx, r); err != nil {
			return nil, err
		}
		req := &EndNTMSDeviceChangeDetectionRequest{}
		req.xxx_FromOp(ctx, op)
		resp, err := o.EndNTMSDeviceChangeDetection(ctx, req)
		return resp.xxx_ToOp(ctx, op), err
	}
	return nil, nil
}

// Unimplemented INtmsLibraryControl1
type UnimplementedLibraryControl1Server struct {
	iunknown.UnimplementedUnknownServer
}

func (UnimplementedLibraryControl1Server) EjectNTMSMedia(context.Context, *EjectNTMSMediaRequest) (*EjectNTMSMediaResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) InjectNTMSMedia(context.Context, *InjectNTMSMediaRequest) (*InjectNTMSMediaResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) AccessNTMSLibraryDoor(context.Context, *AccessNTMSLibraryDoorRequest) (*AccessNTMSLibraryDoorResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) CleanNTMSDrive(context.Context, *CleanNTMSDriveRequest) (*CleanNTMSDriveResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) DismountNTMSDrive(context.Context, *DismountNTMSDriveRequest) (*DismountNTMSDriveResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) InventoryNTMSLibrary(context.Context, *InventoryNTMSLibraryRequest) (*InventoryNTMSLibraryResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) LibraryControl1LocalOnlyOpnum09(context.Context, *LibraryControl1LocalOnlyOpnum09Request) (*LibraryControl1LocalOnlyOpnum09Response, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) CancelNTMSLibraryRequest(context.Context, *CancelNTMSLibraryRequestRequest) (*CancelNTMSLibraryRequestResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) ReserveNTMSCleanerSlot(context.Context, *ReserveNTMSCleanerSlotRequest) (*ReserveNTMSCleanerSlotResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) ReleaseNTMSCleanerSlot(context.Context, *ReleaseNTMSCleanerSlotRequest) (*ReleaseNTMSCleanerSlotResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) InjectNTMSCleaner(context.Context, *InjectNTMSCleanerRequest) (*InjectNTMSCleanerResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) EjectNTMSCleaner(context.Context, *EjectNTMSCleanerRequest) (*EjectNTMSCleanerResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) DeleteNTMSLibrary(context.Context, *DeleteNTMSLibraryRequest) (*DeleteNTMSLibraryResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) DeleteNTMSDrive(context.Context, *DeleteNTMSDriveRequest) (*DeleteNTMSDriveResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) GetNTMSRequestOrder(context.Context, *GetNTMSRequestOrderRequest) (*GetNTMSRequestOrderResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) SetNTMSRequestOrder(context.Context, *SetNTMSRequestOrderRequest) (*SetNTMSRequestOrderResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) DeleteNTMSRequests(context.Context, *DeleteNTMSRequestsRequest) (*DeleteNTMSRequestsResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) BeginNTMSDeviceChangeDetection(context.Context, *BeginNTMSDeviceChangeDetectionRequest) (*BeginNTMSDeviceChangeDetectionResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) SetNTMSDeviceChangeDetection(context.Context, *SetNTMSDeviceChangeDetectionRequest) (*SetNTMSDeviceChangeDetectionResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}
func (UnimplementedLibraryControl1Server) EndNTMSDeviceChangeDetection(context.Context, *EndNTMSDeviceChangeDetectionRequest) (*EndNTMSDeviceChangeDetectionResponse, error) {
	return nil, dcerpc.ErrNotImplemented
}

var _ LibraryControl1Server = (*UnimplementedLibraryControl1Server)(nil)
