/*
 * Copyright 2018-present Open Networking Foundation
 *
 * 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
 *
 * 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.
 */
/*
Defines a DeviceManager Interface - Used for unit testing of the flow decomposer only at this
time.
*/

package coreif

import (
	"context"
	"github.com/opencord/voltha-protos/v3/go/voltha"
)

// DeviceManager represents a generic device manager
type DeviceManager interface {
	GetDevice(context.Context, string) (*voltha.Device, error)
	IsRootDevice(string) (bool, error)
	NotifyInvalidTransition(ctx context.Context, curr *voltha.Device, prev *voltha.Device) error
	CreateLogicalDevice(ctx context.Context, curr *voltha.Device, prev *voltha.Device) error
	SetupUNILogicalPorts(ctx context.Context, curr *voltha.Device, prev *voltha.Device) error
	DisableAllChildDevices(ctx context.Context, curr *voltha.Device, prev *voltha.Device) error
	DeleteLogicalDevice(ctx context.Context, curr *voltha.Device, prev *voltha.Device) error
	DeleteLogicalPorts(ctx context.Context, curr *voltha.Device, prev *voltha.Device) error
	DeleteAllChildDevices(ctx context.Context, curr *voltha.Device, prev *voltha.Device) error
	RunPostDeviceDelete(ctx context.Context, curr *voltha.Device, prev *voltha.Device) error
	ChildDeviceLost(ctx context.Context, curr *voltha.Device, prev *voltha.Device) error
	DeleteAllUNILogicalPorts(ctx context.Context, curr *voltha.Device, prev *voltha.Device) error
}
