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

import "net"

/*
Represents an arbitrary OLT linecard
*/
type OLT interface {
	GetCLLI() string
	GetHostname() string
	GetAddress() net.TCPAddr
	GetNumber() int
	GetPorts() []PONPort
	GetParent() *Chassis
	GetDataSwitchPort() int
	SetNumber(int)
	activate() error
	Output()
}

/*
A basic representation of an OLT which fulfills the above interface,
and can be used in other OLT implementations
*/
type SimpleOLT struct {
	CLLI           string
	Hostname       string
	Address        net.TCPAddr
	Driver         string
	Number         int
	Ports          []PONPort
	Active         bool
	Parent         *Chassis `json:"-" bson:"-"`
	DataSwitchPort int
}

func (s SimpleOLT) GetCLLI() string {
	return s.CLLI
}

func (s SimpleOLT) GetHostname() string {
	return s.Hostname
}

func (s SimpleOLT) GetAddress() net.TCPAddr {
	return s.Address
}

func (s SimpleOLT) GetNumber() int {
	return s.Number
}
func (s SimpleOLT) SetNumber(num int) {
	s.Number = num
}

func (s SimpleOLT) GetPorts() []PONPort {
	return s.Ports
}

func (s SimpleOLT) GetParent() *Chassis {
	return s.Parent
}

func (s SimpleOLT) GetDataSwitchPort() int {
	return s.DataSwitchPort
}
func (s SimpleOLT) activate() error {
	s.Active = true
	//TODO make call to XOS to activate phyiscal OLT
	return nil
}
func (s SimpleOLT) Output() error {
	//TODO make call to XOS to activate phyiscal OLT
	return nil
}
