/*
 Copyright 2017 the original author or authors.

 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 impl

import (
	"errors"
	"fmt"
	"net"

	"gerrit.opencord.org/abstract-olt/models"
	"gerrit.opencord.org/abstract-olt/models/physical"
)

/*
CreateOLTChassis adds an OLT chassis/line card to the Physical chassis
*/
func CreateOLTChassis(clli string, oltType string, driver string, address net.TCPAddr, hostname string) (string, error) {
	myChan := getSyncChannel()
	<-myChan
	defer done(myChan, true)
	chassisMap := models.GetChassisMap()
	chassisHolder := (*chassisMap)[clli]
	if chassisHolder == nil {
		errString := fmt.Sprintf("There is no chassis with CLLI of %s", clli)
		return "", errors.New(errString)
	}
	physicalChassis := &chassisHolder.PhysicalChassis
	sOlt := physical.SimpleOLT{CLLI: clli, Hostname: hostname, Driver: driver, Address: address, Parent: physicalChassis}
	switch oltType {
	case "edgecore":
		sOlt.CreateEdgecore()
	case "adtran":
	case "tibit":
	}
	ports := sOlt.GetPorts()
	for i := 0; i < len(ports); i++ {
		absPort, err := chassisHolder.AbstractChassis.NextPort()
		if err != nil {
			fmt.Println(err)
			return "", err
		}
		absPort.PhysPort = &ports[i]
		//AssignTraits(&ports[i], absPort)
	}
	physicalChassis.AddOLTChassis(sOlt)
	isDirty = true
	return clli, nil

}
