/*
* Copyright 2022-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.
*/
// This implementation of database assumes that it is working for
// Open ONU adapter. Thus, it assumes some base path for all the
// database operations. For all database operations, the key passed is
// added to the database base path.

package database

import "fmt"

const (
	// PresentVersion represnts the Present version
	// Modify this as we give Major version releases
	PresentVersion = "v1"
	// PreviousVersion represnts the Previous version
	PreviousVersion = "v1"
)

//These are present path where different database elements are store in database
//In case any of these paths change, update the present and previous version
const (
	BasePath               string = "service/vgc/%s/"
	ServicePath            string = "services/"
	DevicePath             string = "devices/%s/"
	DevicePortPath         string = DevicePath + "ports/"
	DeviceFlowPath         string = DevicePath + "flows/"
	DeviceGroupPath        string = DevicePath + "groups/"
	DeviceMeterPath        string = DevicePath + "meters/"
	VnetPath               string = "vnets/"
	VpvPath                string = "vpvs/"
	MvlanPath              string = "mvlans/"
	MeterPath              string = "meters/"
	IgmpConfPath           string = "igmp/conf/"
	IgmpGroupPath          string = "igmp/groups/"
	IgmpDevicePath         string = "igmp/devices/"
	IgmpChannelPath        string = "igmp/channels/"
	IgmpPortPath           string = "igmp/ports/"
	IgmpProfPath           string = "igmp/prof/"
	McastConfigPath        string = "igmp/mcastconfig/"
	MigrationInfoPath      string = "data/migration/"
	LogLevelPath           string = "log-level/"
	HealthPath             string = "health/"
	PonCounterPath         string = "pon-counter/"
	OltIgmpCounterPath     string = "olt-igmp-counter/"
	ChannelCounterPath     string = "channel-counter/"
	ServiceCounterPath     string = "service-counter/"
	NbDevicePath           string = "nb-device/"
	DeviceFlowHashPath     string = DevicePath + "flowhash"
	PortAlarmProfilePath   string = "port-alarm-profile/"
	PortAlarmDataPath      string = DevicePortPath + "portalarmdata/"
	SubAlarmDataPath       string = DevicePath + "sub-alarm-data/"
	ServicesMigrateReqPath string = DevicePath + "migrateServicesReq/"
	OltFlowServicePath     string = "olt-flow-service/"
)

//PresentVersionMap - map of present version for all database tables
var PresentVersionMap = map[string]string{
	ServicePath:            "v3",
	DevicePath:             "v1",
	DevicePortPath:         "v1",
	DeviceFlowPath:         "v1",
	DeviceGroupPath:        "v1",
	DeviceMeterPath:        "v1",
	VnetPath:               "v3",
	VpvPath:                "v3",
	MvlanPath:              "v3",
	MeterPath:              "v1",
	IgmpConfPath:           "v2",
	IgmpGroupPath:          "v1",
	IgmpDevicePath:         "v1",
	IgmpChannelPath:        "v1",
	IgmpPortPath:           "v1",
	IgmpProfPath:           "v1",
	McastConfigPath:        "v1",
	MigrationInfoPath:      "v1",
	LogLevelPath:           "v1",
	HealthPath:             "v1",
	PonCounterPath:         "v1",
	OltIgmpCounterPath:     "v1",
	ChannelCounterPath:     "v1",
	ServiceCounterPath:     "v1",
	NbDevicePath:           "v1",
	DeviceFlowHashPath:     "v1",
	PortAlarmProfilePath:   "v1",
	PortAlarmDataPath:      "v1",
	SubAlarmDataPath:       "v1",
	ServicesMigrateReqPath: "v1",
	OltFlowServicePath:     "v1",
}

//PreviousVersionMap - map of previous version for all database tables
var PreviousVersionMap = map[string]string{
	ServicePath:            "v2",
	DevicePath:             "v1",
	DevicePortPath:         "v1",
	DeviceFlowPath:         "v1",
	DeviceGroupPath:        "v1",
	DeviceMeterPath:        "v1",
	VnetPath:               "v2",
	VpvPath:                "v2",
	MvlanPath:              "v2",
	MeterPath:              "v1",
	IgmpConfPath:           "v1",
	IgmpGroupPath:          "v1",
	IgmpDevicePath:         "v1",
	IgmpChannelPath:        "v1",
	IgmpPortPath:           "v1",
	IgmpProfPath:           "v1",
	McastConfigPath:        "v1",
	MigrationInfoPath:      "v1",
	LogLevelPath:           "v1",
	HealthPath:             "v1",
	PonCounterPath:         "v1",
	OltIgmpCounterPath:     "v1",
	ChannelCounterPath:     "v1",
	ServiceCounterPath:     "v1",
	NbDevicePath:           "v1",
	DeviceFlowHashPath:     "v1",
	PortAlarmProfilePath:   "v1",
	PortAlarmDataPath:      "v1",
	SubAlarmDataPath:       "v1",
	ServicesMigrateReqPath: "v1",
	OltFlowServicePath:     "v1",
}

//DBVersionMap - Version of tables present in DB
var DBVersionMap = PreviousVersionMap

// GetModuleKeypath returns the DB keypath for particular module along with version
func GetModuleKeypath(key, ver string) string {
	return fmt.Sprintf(BasePath, ver) + key
}

// GetKeyPath returns the base path for the given key along with version
func GetKeyPath(key string) string {
	return fmt.Sprintf(BasePath, PresentVersionMap[key]) + key
}
