/*-
 * ============LICENSE_START=======================================================
 * OSAM Core
 * ================================================================================
 * Copyright (C) 2018 Netsia
 * ================================================================================
 * 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.
 * ============LICENSE_END=========================================================
 */



package org.onap.osam.api.service;

import org.onap.osam.model.dao.Chassis;
import org.onap.osam.model.dao.OLTPort;
import org.onap.osam.model.dao.OLTSlot;
import org.onap.osam.model.dao.ONTDevice;

import java.util.List;

/**
 * Created by Zafer Kaban on 18.09.2018.
 */
public interface DeviceService {

     enum OntProvisioningType {
        PREPROVISION,
        FULL,
        PROVISION
    }


/*
Chassis Related Functionality
---------------------------------------------------------------------------------------
*/

    /**
     *
     * @param chassis
     */
    Chassis addChassis(Chassis chassis);

    /**
     *
     * @param id
     */
    void deleteChassis(Long id);

    /**
     *
     * @param clli
     */
    public void deleteChassisByClli(String clli);

    /**
     *
     * @param id
     * @return Chassis
     */
    Chassis getChassisById(Long id);

    /**
     *
     * @param clli
     * @return Chassis
     */
    Chassis getChassisByClli(String clli);

    /**
     *
     * @return Long
     */
    Long getChassisCount();

    List<Chassis> getByPnfId(String pnfId);

    List<Chassis> getAllChassis();

/*
oltSlot Related Functionality
---------------------------------------------------------------------------------------
*/

    /**
     *
     *
     * @param oltSlot
     * @param chassis
     */
    OLTSlot addOLTSlot(OLTSlot oltSlot, Chassis chassis);

    /**
     *
     * @param id
     */
    void deleteOLTSlot(Long id);

    /**
     *
     * @param id
     * @return oltSlot
     */
    OLTSlot getOLTSlotById(Long id);

    /**
     *
     * @param serialNumber
     * @return oltSlot
     */
    OLTSlot getOLTSlotBySerialNumber(String serialNumber);


    /**
     *
     * @return all OLT slots
     */
    List<OLTSlot> getAllOLTSlots();

/*
OLTPort Related Functionality
---------------------------------------------------------------------------------------
*/

    /**
     *
     * @param id
     */
    void deleteOLTPort(Long id);

    /**
     *
     * @param id
     * @return OLTPort
     */
    OLTPort getOLTPortById(Long id);

/*
ONTDevice Related Functionality
---------------------------------------------------------------------------------------
*/

    /**
     *
     * @param ontDevice
     * @param provisioningType
     */
    ONTDevice provisionONTDevice(ONTDevice ontDevice, OntProvisioningType provisioningType);

    /**
     *
     * @param id
     */
    void deleteONTDevice(Long id);

    /**
     *
     * @param id
     * @return ONTDevice
     */
    ONTDevice getONTDeviceById(Long id);

    /**
     *
     * @param serialNumber
     * @return ONTDevice
     */
    ONTDevice getONTDeviceBySerialNumber(String serialNumber);

    /**
     *
     * @return all ONT devices
     */
    List<ONTDevice> getAllONTDevices();

}
