/*
 * Copyright 2019-present Ciena Corporation
 *
 * 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.
 */
package commands

import (
	"fmt"
	"github.com/fullstorydev/grpcurl"
	"github.com/golang/protobuf/proto"
	descpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
)

type MethodNotFoundError struct {
	Name string
}

func (e *MethodNotFoundError) Error() string {
	return fmt.Sprintf("Method '%s' not found in function map", e.Name)
}

type MethodVersionNotFoundError struct {
	Name    string
	Version string
}

func (e *MethodVersionNotFoundError) Error() string {
	return fmt.Sprintf("Method '%s' does not have a verison for '%s' specfied in function map", e.Name, e.Version)
}

type DescriptorNotFoundError struct {
	Version string
}

func (e *DescriptorNotFoundError) Error() string {
	return fmt.Sprintf("Protocol buffer descriptor for API version '%s' not found", e.Version)
}

type UnableToParseDescriptorErrror struct {
	err     error
	Version string
}

func (e *UnableToParseDescriptorErrror) Error() string {
	return fmt.Sprintf("Unable to parse protocal buffer descriptor for version '%s': %s", e.Version, e.err)
}

var descriptorMap = map[string][]byte{
	"v1": V1Descriptor,
	"v2": V2Descriptor,
}

var functionMap = map[string]map[string]string{
	"version": {
		"v1": "voltha.VolthaGlobalService/GetVoltha",
		"v2": "voltha.VolthaService/GetVoltha",
	},
	"adapter-list": {
		"v1": "voltha.VolthaGlobalService/ListAdapters",
		"v2": "voltha.VolthaService/ListAdapters",
	},
	"device-list": {
		"v1": "voltha.VolthaGlobalService/ListDevices",
		"v2": "voltha.VolthaService/ListDevices",
	},
	"device-ports": {
		"v1": "voltha.VolthaGlobalService/ListDevicePorts",
		"v2": "voltha.VolthaService/ListDevicePorts",
	},
	"device-create": {
		"v1": "voltha.VolthaGlobalService/CreateDevice",
		"v2": "voltha.VolthaService/CreateDevice",
	},
	"device-delete": {
		"v1": "voltha.VolthaGlobalService/DeleteDevice",
		"v2": "voltha.VolthaService/DeleteDevice",
	},
	"device-enable": {
		"v1": "voltha.VolthaGlobalService/EnableDevice",
		"v2": "voltha.VolthaService/EnableDevice",
	},
	"device-disable": {
		"v1": "voltha.VolthaGlobalService/DisableDevice",
		"v2": "voltha.VolthaService/DisableDevice",
	},
	"device-reboot": {
		"v1": "voltha.VolthaGlobalService/RebootDevice",
		"v2": "voltha.VolthaService/RebootDevice",
	},
	"device-inspect": {
		"v1": "voltha.VolthaGlobalService/GetDevice",
		"v2": "voltha.VolthaService/GetDevice",
	},
	"device-flow-list": {
		"v1": "voltha.VolthaGlobalService/ListDeviceFlows",
		"v2": "voltha.VolthaService/ListDeviceFlows",
	},
	"logical-device-list": {
		"v1": "voltha.VolthaGlobalService/ListLogicalDevices",
		"v2": "voltha.VolthaService/ListLogicalDevices",
	},
	"logical-device-ports": {
		"v1": "voltha.VolthaGlobalService/ListLogicalDevicePorts",
		"v2": "voltha.VolthaService/ListLogicalDevicePorts",
	},
	"logical-device-flow-list": {
		"v1": "voltha.VolthaGlobalService/ListLogicalDeviceFlows",
		"v2": "voltha.VolthaService/ListLogicalDeviceFlows",
	},
	"logical-device-inspect": {
		"v1": "voltha.VolthaGlobalService/GetLogicalDevice",
		"v2": "voltha.VolthaService/GetLogicalDevice",
	},
	"devicegroup-list": {
		"v1": "voltha.VolthaGlobalService/ListDeviceGroups",
		"v2": "voltha.VolthaService/ListDeviceGroups",
	},
	"get-goroutine-count": {
		"v2": "afrouter.Configuration.GetGoroutineCount",
	},
	"apiserver-update-log-level": {
		"v2": "afrouter.Configuration.UpdateLogLevel",
	},
	"apiserver-get-log-levels": {
		"v2": "afrouter.Configuration.GetLogLevels",
	},
	"update-log-level": {
		"v2": "voltha.VolthaService/UpdateLogLevel",
	},
	"get-log-levels": {
		"v2": "voltha.VolthaService/GetLogLevels",
	},
}

func GetMethod(name string) (grpcurl.DescriptorSource, string, error) {
	version := GlobalConfig.ApiVersion
	f, ok := functionMap[name]
	if !ok {
		return nil, "", &MethodNotFoundError{name}
	}
	m, ok := f[version]
	if !ok {
		return nil, "", &MethodVersionNotFoundError{name, version}
	}
	filename, ok := descriptorMap[version]
	if !ok {
		return nil, "", &DescriptorNotFoundError{version}
	}

	var fds descpb.FileDescriptorSet
	err := proto.Unmarshal(filename, &fds)
	if err != nil {
		return nil, "", &UnableToParseDescriptorErrror{err, version}
	}
	desc, err := grpcurl.DescriptorSourceFromFileDescriptorSet(&fds)
	if err != nil {
		return nil, "", err
	}

	return desc, m, nil
}
