/*
 * Copyright 2016 Open Networking Laboratory
 *
 * 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 org.onosproject.teyang.utils.topology;

import org.onosproject.tetopology.management.api.node.TeStatus;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeAdminStatus;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeOperStatus;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.teadminstatus.TeAdminStatusEnum;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.teoperstatus.TeOperStatusEnum;

/**
 * The Enum conversion functions.
 */
public final class EnumConverter {

    // no instantiation
    private EnumConverter() {
    }

    /**
     * Converts YANG Operation Status Enum to TE Topology TeStatus Enum.
     *
     * @param opStatus YANG Operation Status
     * @return the equivalent Enum from TE Topology TeStatus or null if not
     *         found
     */
    public static TeStatus yang2TeSubsystemOpStatus(TeOperStatus opStatus) {
        switch (opStatus.enumeration()) {
        case DOWN:
            return TeStatus.DOWN;
        case UP:
            return TeStatus.UP;
        case MAINTENANCE:
            return TeStatus.MAINTENANCE;
        case PREPARING_MAINTENANCE:
            return TeStatus.PREPARING_MAINTENANCE;
        case TESTING:
            return TeStatus.TESTING;
        case UNKNOWN:
            return TeStatus.UNKNOWN;
        default:
            return null;
        }
    }

    /**
     * Converts YANG TeAdminStatus Enum to TE Topology TeStatus Enum.
     *
     * @param adminStatus YANG Admin Status
     * @return the equivalent Enum from TE Topology TeStatus or null if not
     *         found
     */
    public static TeStatus yang2TeSubsystemAdminStatus(TeAdminStatus adminStatus) {
        switch (adminStatus.enumeration()) {
        case DOWN:
            return TeStatus.DOWN;
        case UP:
            return TeStatus.UP;
        case TESTING:
            return TeStatus.TESTING;
        case MAINTENANCE:
            return TeStatus.MAINTENANCE;
        case PREPARING_MAINTENANCE:
            return TeStatus.PREPARING_MAINTENANCE;
        default:
            return TeStatus.UNKNOWN;
        }
    }

    /**
     * Converts TE Topology TeStatus Enum to YANG TeAdminStatus Enum.
     *
     * @param adminStatus TE Topology admin status
     * @return the equivalent Enum from YANG TeAdminStatus or null if not found
     */
    public static TeAdminStatus teSubsystem2YangAdminStatus(TeStatus adminStatus) {
        switch (adminStatus) {
        case DOWN:
            return TeAdminStatus.of(TeAdminStatusEnum.DOWN);
        case UP:
            return TeAdminStatus.of(TeAdminStatusEnum.UP);
        case TESTING:
            return TeAdminStatus.of(TeAdminStatusEnum.TESTING);
        case MAINTENANCE:
            return TeAdminStatus.of(TeAdminStatusEnum.MAINTENANCE);
        case PREPARING_MAINTENANCE:
            return TeAdminStatus.of(TeAdminStatusEnum.PREPARING_MAINTENANCE);
        case UNKNOWN:
            return null;
        default:
            return null;
        }
    }

    /**
     * Converts TE Topology TeStatus Enum to YANG TeOperStatus Enum.
     *
     * @param opStatus TE Topology operation status
     * @return the equivalent Enum from YANG TeOperStatus or null if not found
     */
    public static TeOperStatus teSubsystem2YangOperStatus(TeStatus opStatus) {
        switch (opStatus) {
        case DOWN:
            return TeOperStatus.of(TeOperStatusEnum.DOWN);
        case UP:
            return TeOperStatus.of(TeOperStatusEnum.UP);
        case TESTING:
            return TeOperStatus.of(TeOperStatusEnum.TESTING);
        case MAINTENANCE:
            return TeOperStatus.of(TeOperStatusEnum.MAINTENANCE);
        case PREPARING_MAINTENANCE:
            return TeOperStatus.of(TeOperStatusEnum.PREPARING_MAINTENANCE);
        case UNKNOWN:
            return TeOperStatus.of(TeOperStatusEnum.UNKNOWN);
        default:
            return null;
        }
    }

}
