//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//

// Code generated by MockGen. DO NOT EDIT.
// Source: ./cloudstack/AnnotationService.go
//
// Generated by this command:
//
//	mockgen -destination=./cloudstack/AnnotationService_mock.go -package=cloudstack -copyright_file=header.txt -source=./cloudstack/AnnotationService.go
//

// Package cloudstack is a generated GoMock package.
package cloudstack

import (
	reflect "reflect"

	gomock "go.uber.org/mock/gomock"
)

// MockAnnotationServiceIface is a mock of AnnotationServiceIface interface.
type MockAnnotationServiceIface struct {
	ctrl     *gomock.Controller
	recorder *MockAnnotationServiceIfaceMockRecorder
	isgomock struct{}
}

// MockAnnotationServiceIfaceMockRecorder is the mock recorder for MockAnnotationServiceIface.
type MockAnnotationServiceIfaceMockRecorder struct {
	mock *MockAnnotationServiceIface
}

// NewMockAnnotationServiceIface creates a new mock instance.
func NewMockAnnotationServiceIface(ctrl *gomock.Controller) *MockAnnotationServiceIface {
	mock := &MockAnnotationServiceIface{ctrl: ctrl}
	mock.recorder = &MockAnnotationServiceIfaceMockRecorder{mock}
	return mock
}

// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockAnnotationServiceIface) EXPECT() *MockAnnotationServiceIfaceMockRecorder {
	return m.recorder
}

// AddAnnotation mocks base method.
func (m *MockAnnotationServiceIface) AddAnnotation(p *AddAnnotationParams) (*AddAnnotationResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "AddAnnotation", p)
	ret0, _ := ret[0].(*AddAnnotationResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// AddAnnotation indicates an expected call of AddAnnotation.
func (mr *MockAnnotationServiceIfaceMockRecorder) AddAnnotation(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddAnnotation", reflect.TypeOf((*MockAnnotationServiceIface)(nil).AddAnnotation), p)
}

// GetAnnotationByID mocks base method.
func (m *MockAnnotationServiceIface) GetAnnotationByID(id string, opts ...OptionFunc) (*Annotation, int, error) {
	m.ctrl.T.Helper()
	varargs := []any{id}
	for _, a := range opts {
		varargs = append(varargs, a)
	}
	ret := m.ctrl.Call(m, "GetAnnotationByID", varargs...)
	ret0, _ := ret[0].(*Annotation)
	ret1, _ := ret[1].(int)
	ret2, _ := ret[2].(error)
	return ret0, ret1, ret2
}

// GetAnnotationByID indicates an expected call of GetAnnotationByID.
func (mr *MockAnnotationServiceIfaceMockRecorder) GetAnnotationByID(id any, opts ...any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]any{id}, opts...)
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAnnotationByID", reflect.TypeOf((*MockAnnotationServiceIface)(nil).GetAnnotationByID), varargs...)
}

// ListAnnotations mocks base method.
func (m *MockAnnotationServiceIface) ListAnnotations(p *ListAnnotationsParams) (*ListAnnotationsResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListAnnotations", p)
	ret0, _ := ret[0].(*ListAnnotationsResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// ListAnnotations indicates an expected call of ListAnnotations.
func (mr *MockAnnotationServiceIfaceMockRecorder) ListAnnotations(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAnnotations", reflect.TypeOf((*MockAnnotationServiceIface)(nil).ListAnnotations), p)
}

// NewAddAnnotationParams mocks base method.
func (m *MockAnnotationServiceIface) NewAddAnnotationParams() *AddAnnotationParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewAddAnnotationParams")
	ret0, _ := ret[0].(*AddAnnotationParams)
	return ret0
}

// NewAddAnnotationParams indicates an expected call of NewAddAnnotationParams.
func (mr *MockAnnotationServiceIfaceMockRecorder) NewAddAnnotationParams() *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewAddAnnotationParams", reflect.TypeOf((*MockAnnotationServiceIface)(nil).NewAddAnnotationParams))
}

// NewListAnnotationsParams mocks base method.
func (m *MockAnnotationServiceIface) NewListAnnotationsParams() *ListAnnotationsParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewListAnnotationsParams")
	ret0, _ := ret[0].(*ListAnnotationsParams)
	return ret0
}

// NewListAnnotationsParams indicates an expected call of NewListAnnotationsParams.
func (mr *MockAnnotationServiceIfaceMockRecorder) NewListAnnotationsParams() *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewListAnnotationsParams", reflect.TypeOf((*MockAnnotationServiceIface)(nil).NewListAnnotationsParams))
}

// NewRemoveAnnotationParams mocks base method.
func (m *MockAnnotationServiceIface) NewRemoveAnnotationParams(id string) *RemoveAnnotationParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewRemoveAnnotationParams", id)
	ret0, _ := ret[0].(*RemoveAnnotationParams)
	return ret0
}

// NewRemoveAnnotationParams indicates an expected call of NewRemoveAnnotationParams.
func (mr *MockAnnotationServiceIfaceMockRecorder) NewRemoveAnnotationParams(id any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewRemoveAnnotationParams", reflect.TypeOf((*MockAnnotationServiceIface)(nil).NewRemoveAnnotationParams), id)
}

// NewUpdateAnnotationVisibilityParams mocks base method.
func (m *MockAnnotationServiceIface) NewUpdateAnnotationVisibilityParams(adminsonly bool, id string) *UpdateAnnotationVisibilityParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewUpdateAnnotationVisibilityParams", adminsonly, id)
	ret0, _ := ret[0].(*UpdateAnnotationVisibilityParams)
	return ret0
}

// NewUpdateAnnotationVisibilityParams indicates an expected call of NewUpdateAnnotationVisibilityParams.
func (mr *MockAnnotationServiceIfaceMockRecorder) NewUpdateAnnotationVisibilityParams(adminsonly, id any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewUpdateAnnotationVisibilityParams", reflect.TypeOf((*MockAnnotationServiceIface)(nil).NewUpdateAnnotationVisibilityParams), adminsonly, id)
}

// RemoveAnnotation mocks base method.
func (m *MockAnnotationServiceIface) RemoveAnnotation(p *RemoveAnnotationParams) (*RemoveAnnotationResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "RemoveAnnotation", p)
	ret0, _ := ret[0].(*RemoveAnnotationResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// RemoveAnnotation indicates an expected call of RemoveAnnotation.
func (mr *MockAnnotationServiceIfaceMockRecorder) RemoveAnnotation(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveAnnotation", reflect.TypeOf((*MockAnnotationServiceIface)(nil).RemoveAnnotation), p)
}

// UpdateAnnotationVisibility mocks base method.
func (m *MockAnnotationServiceIface) UpdateAnnotationVisibility(p *UpdateAnnotationVisibilityParams) (*UpdateAnnotationVisibilityResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UpdateAnnotationVisibility", p)
	ret0, _ := ret[0].(*UpdateAnnotationVisibilityResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// UpdateAnnotationVisibility indicates an expected call of UpdateAnnotationVisibility.
func (mr *MockAnnotationServiceIfaceMockRecorder) UpdateAnnotationVisibility(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAnnotationVisibility", reflect.TypeOf((*MockAnnotationServiceIface)(nil).UpdateAnnotationVisibility), p)
}
