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

package controller

import (
	"context"
	"time"

	"voltha-go-controller/internal/pkg/intf"
	"voltha-go-controller/internal/pkg/vpagent"

	"voltha-go-controller/log"
)

// AddDeviceTask structure
type AddDeviceTask struct {
	ctx       context.Context
	config    *intf.VPClientCfg
	timestamp string
	taskID    uint8
}

// NewAddDeviceTask is the constructor for AddDeviceTask
func NewAddDeviceTask(config *intf.VPClientCfg) *AddDeviceTask {
	var adt AddDeviceTask
	adt.config = config
	tstamp := (time.Now()).Format(time.RFC3339Nano)
	adt.timestamp = tstamp
	return &adt
}

// Name returns name of the task
func (adt *AddDeviceTask) Name() string {
	return "Add Device Task"
}

// TaskID returns task Id of the task
func (adt *AddDeviceTask) TaskID() uint8 {
	return adt.taskID
}

// Timestamp returns time stamp for the task
func (adt *AddDeviceTask) Timestamp() string {
	return adt.timestamp
}

// Stop to stop the task
func (adt *AddDeviceTask) Stop() {
}

// Start to start the task
func (adt *AddDeviceTask) Start(ctx context.Context, taskID uint8) error {
	adt.taskID = taskID
	adt.ctx = ctx

	logger.Infow(ctx, "Add Device Task Triggered", log.Fields{"Device": adt.config.DeviceID, "SerialNum": adt.config.SerialNum})

	device := GetController().AddDevice(ctx, adt.config)
	vpagent.GetVPAgent().AddClientToClientMap(adt.config.DeviceID, device)
	logger.Infow(ctx, "Add Device Task Completed", log.Fields{"Device": adt.config.DeviceID, "SerialNum": adt.config.SerialNum})

	return nil
}
