/*
 * 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.
 */

package core

import (
	"fmt"
	"sync"

	"github.com/opencord/openolt-scale-tester/config"
	"github.com/opencord/voltha-lib-go/v3/pkg/log"
	"github.com/opencord/voltha-lib-go/v3/pkg/techprofile"
	oop "github.com/opencord/voltha-protos/v3/go/openolt"
	"golang.org/x/net/context"
)

func init() {
	_, _ = log.AddPackage(log.JSON, log.DebugLevel, nil)
}

const (
	SUBSCRIBER_PROVISION_SUCCESS = iota
	TP_INSTANCE_CREATION_FAILED
	FLOW_ID_GENERATION_FAILED
	FLOW_ADD_FAILED
	SCHED_CREATION_FAILED
	QUEUE_CREATION_FAILED
)

const (
	UniPortName = "pon-{%d}/onu-{%d}/uni-{%d}"
)

var Reason = [...]string{
	"SUBSCRIBER_PROVISION_SUCCESS",
	"TP_INSTANCE_CREATION_FAILED",
	"FLOW_ID_GENERATION_FAILED",
	"FLOW_ADD_FAILED",
	"SCHED_CREATION_FAILED",
	"QUEUE_CREATION_FAILED",
}

func ReasonCodeToReasonString(reasonCode int) string {
	return Reason[reasonCode]
}

type Subscriber struct {
	SubscriberName string   `json:"subscriberName"`
	OnuID          uint32   `json:"onuID"`
	UniID          uint32   `json:"uniID"`
	PonIntf        uint32   `json:"ponIntf"`
	UniPortNo      uint32   `json:"uniPortNo"`
	Ctag           uint32   `json:"ctag"`
	Stag           uint32   `json:"stag"`
	GemPortIDs     []uint32 `json:"gemPortIds"`
	AllocIDs       []uint32 `json:"allocIds"`
	FlowIDs        []uint32 `json:"flowIds"`
	Reason         string   `json:"reason"`

	FailedFlowCnt  uint32 `json:"failedFlowCnt"`
	SuccessFlowCnt uint32 `json:"successFlowCnt"`

	FailedSchedCnt  uint32 `json:"failedSchedCnt"`
	SuccessSchedCnt uint32 `json:"successShedCnt"`

	FailedQueueCnt  uint32 `json:"failedQueueCnt"`
	SuccessQueueCnt uint32 `json:"successQueueCnt"`

	FailedFlows  []oop.Flow             `json:"failedFlows"`
	FailedScheds []oop.TrafficScheduler `json:"failedScheds"`
	FailedQueues []oop.TrafficQueue     `json:"failedQueues"`

	TpInstance    map[int]*techprofile.TechProfile
	OpenOltClient oop.OpenoltClient
	TestConfig    *config.OpenOltScaleTesterConfig
	RsrMgr        *OpenOltResourceMgr
	subWg         *sync.WaitGroup
}

func (subs *Subscriber) Start(isGroup bool) {

	var err error

	log.Infow("workflow-deploy-started-for-subscriber", log.Fields{"subsName": subs.SubscriberName})

	subs.TpInstance = make(map[int]*techprofile.TechProfile)

	for _, tpID := range subs.TestConfig.TpIDList {
		uniPortName := fmt.Sprintf(UniPortName, subs.PonIntf, subs.OnuID, subs.UniID)
		subs.RsrMgr.GemIDAllocIDLock[subs.PonIntf].Lock()
		subs.TpInstance[tpID], err = subs.RsrMgr.ResourceMgrs[subs.PonIntf].TechProfileMgr.CreateTechProfInstance(context.Background(),
			uint32(tpID), uniPortName, subs.PonIntf)
		subs.RsrMgr.GemIDAllocIDLock[subs.PonIntf].Unlock()
		if err != nil {
			log.Errorw("error-creating-tp-instance-for-subs",
				log.Fields{"subsName": subs.SubscriberName, "onuID": subs.OnuID, "tpID": tpID})

			subs.Reason = ReasonCodeToReasonString(TP_INSTANCE_CREATION_FAILED)
			return
		}
	}

	go DeployWorkflow(subs, isGroup)

	log.Infow("workflow-deploy-started-for-subscriber", log.Fields{"subsName": subs.SubscriberName})
}
