/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * 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 android.telephony;

import android.annotation.IntDef;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.hardware.radio.V1_1.GeranBands;
import android.hardware.radio.V1_5.AccessNetwork;
import android.hardware.radio.V1_5.EutranBands;
import android.hardware.radio.V1_5.RadioAccessNetworks;
import android.hardware.radio.V1_5.UtranBands;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * Contains access network related constants.
 */
public final class AccessNetworkConstants {

    /**
     * Wireless transportation type
     *
     * @hide */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(prefix = {"TRANSPORT_TYPE_"},
            value = {
                    TRANSPORT_TYPE_INVALID,
                    TRANSPORT_TYPE_WWAN,
                    TRANSPORT_TYPE_WLAN})
    public @interface TransportType {}

    /**
     * Invalid transport type
     * @hide
     */
    @SystemApi
    @TestApi
    public static final int TRANSPORT_TYPE_INVALID = -1;

    /**
     * Transport type for Wireless Wide Area Networks (i.e. Cellular)
     */
    public static final int TRANSPORT_TYPE_WWAN = 1;

    /**
     * Transport type for Wireless Local Area Networks (i.e. Wifi)
     */
    public static final int TRANSPORT_TYPE_WLAN = 2;

    /** @hide */
    public static String transportTypeToString(@TransportType int transportType) {
        switch (transportType) {
            case TRANSPORT_TYPE_WWAN: return "WWAN";
            case TRANSPORT_TYPE_WLAN: return "WLAN";
            default: return Integer.toString(transportType);
        }
    }

    /**
     * Access network type
     * @hide
     */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(prefix = {"RADIO_ACCESS_NETWORK_TYPE_"},
            value = {
                    AccessNetworkType.UNKNOWN,
                    AccessNetworkType.GERAN,
                    AccessNetworkType.UTRAN,
                    AccessNetworkType.EUTRAN,
                    AccessNetworkType.CDMA2000,
                    AccessNetworkType.IWLAN,
                    AccessNetworkType.NGRAN})
    public @interface RadioAccessNetworkType {}

    public static final class AccessNetworkType {
        public static final int UNKNOWN = AccessNetwork.UNKNOWN;
        public static final int GERAN = AccessNetwork.GERAN;
        public static final int UTRAN = AccessNetwork.UTRAN;
        public static final int EUTRAN = AccessNetwork.EUTRAN;
        public static final int CDMA2000 = AccessNetwork.CDMA2000;
        public static final int IWLAN = AccessNetwork.IWLAN;
        public static final int NGRAN = AccessNetwork.NGRAN;

        /** @hide */
        private AccessNetworkType() {}

        /** @hide */
        public static String toString(int type) {
            switch (type) {
                case UNKNOWN: return "UNKNOWN";
                case GERAN: return "GERAN";
                case UTRAN: return "UTRAN";
                case EUTRAN: return "EUTRAN";
                case CDMA2000: return "CDMA2000";
                case IWLAN: return "IWLAN";
                case NGRAN: return "NGRAN";
                default: return Integer.toString(type);
            }
        }

        /**
         * Converts from RadioAccessNetworks in HAL to AccessNetworkType in frameworks.
         * @hide
         */
        public static int convertRanToAnt(int ran) {
            switch (ran) {
                case RadioAccessNetworks.GERAN:
                    return AccessNetworkType.GERAN;
                case RadioAccessNetworks.UTRAN:
                    return AccessNetworkType.UTRAN;
                case RadioAccessNetworks.EUTRAN:
                    return AccessNetworkType.EUTRAN;
                case RadioAccessNetworks.NGRAN:
                    return AccessNetworkType.NGRAN;
                case RadioAccessNetworks.CDMA2000:
                    return AccessNetworkType.CDMA2000;
                case RadioAccessNetworks.UNKNOWN:
                default:
                    return AccessNetworkType.UNKNOWN;
           }
        }
    }

    /**
     * Frequency bands for GERAN.
     * http://www.etsi.org/deliver/etsi_ts/145000_145099/145005/14.00.00_60/ts_145005v140000p.pdf
     */
    public static final class GeranBand {
        public static final int BAND_T380 = GeranBands.BAND_T380;
        public static final int BAND_T410 = GeranBands.BAND_T410;
        public static final int BAND_450 = GeranBands.BAND_450;
        public static final int BAND_480 = GeranBands.BAND_480;
        public static final int BAND_710 = GeranBands.BAND_710;
        public static final int BAND_750 = GeranBands.BAND_750;
        public static final int BAND_T810 = GeranBands.BAND_T810;
        public static final int BAND_850 = GeranBands.BAND_850;
        public static final int BAND_P900 = GeranBands.BAND_P900;
        public static final int BAND_E900 = GeranBands.BAND_E900;
        public static final int BAND_R900 = GeranBands.BAND_R900;
        public static final int BAND_DCS1800 = GeranBands.BAND_DCS1800;
        public static final int BAND_PCS1900 = GeranBands.BAND_PCS1900;
        public static final int BAND_ER900 = GeranBands.BAND_ER900;

        /** @hide */
        private GeranBand() {}
    }

    /**
     * Frequency bands for UTRAN.
     * http://www.etsi.org/deliver/etsi_ts/125100_125199/125104/13.03.00_60/ts_125104v130p.pdf
     */
    public static final class UtranBand {
        public static final int BAND_1 = UtranBands.BAND_1;
        public static final int BAND_2 = UtranBands.BAND_2;
        public static final int BAND_3 = UtranBands.BAND_3;
        public static final int BAND_4 = UtranBands.BAND_4;
        public static final int BAND_5 = UtranBands.BAND_5;
        public static final int BAND_6 = UtranBands.BAND_6;
        public static final int BAND_7 = UtranBands.BAND_7;
        public static final int BAND_8 = UtranBands.BAND_8;
        public static final int BAND_9 = UtranBands.BAND_9;
        public static final int BAND_10 = UtranBands.BAND_10;
        public static final int BAND_11 = UtranBands.BAND_11;
        public static final int BAND_12 = UtranBands.BAND_12;
        public static final int BAND_13 = UtranBands.BAND_13;
        public static final int BAND_14 = UtranBands.BAND_14;
        // band 15, 16, 17, 18 are reserved
        public static final int BAND_19 = UtranBands.BAND_19;
        public static final int BAND_20 = UtranBands.BAND_20;
        public static final int BAND_21 = UtranBands.BAND_21;
        public static final int BAND_22 = UtranBands.BAND_22;
        // band 23, 24 are reserved
        public static final int BAND_25 = UtranBands.BAND_25;
        public static final int BAND_26 = UtranBands.BAND_26;

        // Frequency bands for TD-SCDMA. Defined in 3GPP TS 25.102, Table 5.2.

        /**
         * Band A
         * 1900 - 1920 MHz: Uplink and downlink transmission
         * 2010 - 2025 MHz: Uplink and downlink transmission
         */
        public static final int BAND_A = UtranBands.BAND_A;

        /**
         * Band B
         * 1850 - 1910 MHz: Uplink and downlink transmission
         * 1930 - 1990 MHz: Uplink and downlink transmission
         */
        public static final int BAND_B = UtranBands.BAND_B;

        /**
         * Band C
         * 1910 - 1930 MHz: Uplink and downlink transmission
         */
        public static final int BAND_C = UtranBands.BAND_C;

        /**
         * Band D
         * 2570 - 2620 MHz: Uplink and downlink transmission
         */
        public static final int BAND_D = UtranBands.BAND_D;

        /**
         * Band E
         * 2300—2400 MHz: Uplink and downlink transmission
         */
        public static final int BAND_E = UtranBands.BAND_E;

        /**
         * Band F
         * 1880 - 1920 MHz: Uplink and downlink transmission
         */
        public static final int BAND_F = UtranBands.BAND_F;

        /** @hide */
        private UtranBand() {}
    }

    /**
     * Frequency bands for EUTRAN.
     * 3GPP TS 36.101, Version 16.4.0, Table 5.5: Operating bands
     * https://www.etsi.org/deliver/etsi_ts/136100_136199/136101/15.09.00_60/ts_136101v150900p.pdf
     */
    public static final class EutranBand {
        public static final int BAND_1 = EutranBands.BAND_1;
        public static final int BAND_2 = EutranBands.BAND_2;
        public static final int BAND_3 = EutranBands.BAND_3;
        public static final int BAND_4 = EutranBands.BAND_4;
        public static final int BAND_5 = EutranBands.BAND_5;
        public static final int BAND_6 = EutranBands.BAND_6;
        public static final int BAND_7 = EutranBands.BAND_7;
        public static final int BAND_8 = EutranBands.BAND_8;
        public static final int BAND_9 = EutranBands.BAND_9;
        public static final int BAND_10 = EutranBands.BAND_10;
        public static final int BAND_11 = EutranBands.BAND_11;
        public static final int BAND_12 = EutranBands.BAND_12;
        public static final int BAND_13 = EutranBands.BAND_13;
        public static final int BAND_14 = EutranBands.BAND_14;
        public static final int BAND_17 = EutranBands.BAND_17;
        public static final int BAND_18 = EutranBands.BAND_18;
        public static final int BAND_19 = EutranBands.BAND_19;
        public static final int BAND_20 = EutranBands.BAND_20;
        public static final int BAND_21 = EutranBands.BAND_21;
        public static final int BAND_22 = EutranBands.BAND_22;
        public static final int BAND_23 = EutranBands.BAND_23;
        public static final int BAND_24 = EutranBands.BAND_24;
        public static final int BAND_25 = EutranBands.BAND_25;
        public static final int BAND_26 = EutranBands.BAND_26;
        public static final int BAND_27 = EutranBands.BAND_27;
        public static final int BAND_28 = EutranBands.BAND_28;
        public static final int BAND_30 = EutranBands.BAND_30;
        public static final int BAND_31 = EutranBands.BAND_31;
        public static final int BAND_33 = EutranBands.BAND_33;
        public static final int BAND_34 = EutranBands.BAND_34;
        public static final int BAND_35 = EutranBands.BAND_35;
        public static final int BAND_36 = EutranBands.BAND_36;
        public static final int BAND_37 = EutranBands.BAND_37;
        public static final int BAND_38 = EutranBands.BAND_38;
        public static final int BAND_39 = EutranBands.BAND_39;
        public static final int BAND_40 = EutranBands.BAND_40;
        public static final int BAND_41 = EutranBands.BAND_41;
        public static final int BAND_42 = EutranBands.BAND_42;
        public static final int BAND_43 = EutranBands.BAND_43;
        public static final int BAND_44 = EutranBands.BAND_44;
        public static final int BAND_45 = EutranBands.BAND_45;
        public static final int BAND_46 = EutranBands.BAND_46;
        public static final int BAND_47 = EutranBands.BAND_47;
        public static final int BAND_48 = EutranBands.BAND_48;
        public static final int BAND_49 = EutranBands.BAND_49;
        public static final int BAND_50 = EutranBands.BAND_50;
        public static final int BAND_51 = EutranBands.BAND_51;
        public static final int BAND_52 = EutranBands.BAND_52;
        public static final int BAND_53 = EutranBands.BAND_53;
        public static final int BAND_65 = EutranBands.BAND_65;
        public static final int BAND_66 = EutranBands.BAND_66;
        public static final int BAND_68 = EutranBands.BAND_68;
        public static final int BAND_70 = EutranBands.BAND_70;
        public static final int BAND_71 = EutranBands.BAND_71;
        public static final int BAND_72 = EutranBands.BAND_72;
        public static final int BAND_73 = EutranBands.BAND_73;
        public static final int BAND_74 = EutranBands.BAND_74;
        public static final int BAND_85 = EutranBands.BAND_85;
        public static final int BAND_87 = EutranBands.BAND_87;
        public static final int BAND_88 = EutranBands.BAND_88;

        /** @hide */
        private EutranBand() {};
    }

    /**
     * Frequency bands for CDMA2000.
     * http://www.3gpp2.org/Public_html/Specs/C.S0057-E_v1.0_Bandclass_Specification.pdf
     * @hide
     *
     * TODO(yinxu): Check with the nexus team about the definition of CDMA bands.
     */
    public static final class CdmaBands {
        public static final int BAND_0 = 1;
        public static final int BAND_1 = 2;
        public static final int BAND_2 = 3;
        public static final int BAND_3 = 4;
        public static final int BAND_4 = 5;
        public static final int BAND_5 = 6;
        public static final int BAND_6 = 7;
        public static final int BAND_7 = 8;
        public static final int BAND_8 = 9;
        public static final int BAND_9 = 10;
        public static final int BAND_10 = 11;
        public static final int BAND_11 = 12;
        public static final int BAND_12 = 13;
        public static final int BAND_13 = 14;
        public static final int BAND_14 = 15;
        public static final int BAND_15 = 16;
        public static final int BAND_16 = 17;
        public static final int BAND_17 = 18;
        public static final int BAND_18 = 19;
        public static final int BAND_19 = 20;
        public static final int BAND_20 = 21;
        public static final int BAND_21 = 22;

        /** @hide */
        private CdmaBands() {}
    }

    /**
     * Frequency bands for NGRAN
     * https://www.etsi.org/deliver/etsi_ts/138100_138199/13810101/15.08.02_60/ts_13810101v150802p.pdf
     * https://www.etsi.org/deliver/etsi_ts/138100_138199/13810102/15.08.00_60/ts_13810102v150800p.pdf
     */
    public static final class NgranBands {
        /** 3GPP TS 38.101-1, Version 16.2.0, Table 5.2-1: FR1 bands */
        public static final int BAND_1 = android.hardware.radio.V1_5.NgranBands.BAND_1;
        public static final int BAND_2 = android.hardware.radio.V1_5.NgranBands.BAND_2;
        public static final int BAND_3 = android.hardware.radio.V1_5.NgranBands.BAND_3;
        public static final int BAND_5 = android.hardware.radio.V1_5.NgranBands.BAND_5;
        public static final int BAND_7 = android.hardware.radio.V1_5.NgranBands.BAND_7;
        public static final int BAND_8 = android.hardware.radio.V1_5.NgranBands.BAND_8;
        public static final int BAND_12 = android.hardware.radio.V1_5.NgranBands.BAND_12;
        public static final int BAND_14 = android.hardware.radio.V1_5.NgranBands.BAND_14;
        public static final int BAND_18 = android.hardware.radio.V1_5.NgranBands.BAND_18;
        public static final int BAND_20 = android.hardware.radio.V1_5.NgranBands.BAND_20;
        public static final int BAND_25 = android.hardware.radio.V1_5.NgranBands.BAND_25;
        public static final int BAND_28 = android.hardware.radio.V1_5.NgranBands.BAND_28;
        public static final int BAND_29 = android.hardware.radio.V1_5.NgranBands.BAND_29;
        public static final int BAND_30 = android.hardware.radio.V1_5.NgranBands.BAND_30;
        public static final int BAND_34 = android.hardware.radio.V1_5.NgranBands.BAND_34;
        public static final int BAND_38 = android.hardware.radio.V1_5.NgranBands.BAND_38;
        public static final int BAND_39 = android.hardware.radio.V1_5.NgranBands.BAND_39;
        public static final int BAND_40 = android.hardware.radio.V1_5.NgranBands.BAND_40;
        public static final int BAND_41 = android.hardware.radio.V1_5.NgranBands.BAND_41;
        public static final int BAND_48 = android.hardware.radio.V1_5.NgranBands.BAND_48;
        public static final int BAND_50 = android.hardware.radio.V1_5.NgranBands.BAND_50;
        public static final int BAND_51 = android.hardware.radio.V1_5.NgranBands.BAND_51;
        public static final int BAND_65 = android.hardware.radio.V1_5.NgranBands.BAND_65;
        public static final int BAND_66 = android.hardware.radio.V1_5.NgranBands.BAND_66;
        public static final int BAND_70 = android.hardware.radio.V1_5.NgranBands.BAND_70;
        public static final int BAND_71 = android.hardware.radio.V1_5.NgranBands.BAND_71;
        public static final int BAND_74 = android.hardware.radio.V1_5.NgranBands.BAND_74;
        public static final int BAND_75 = android.hardware.radio.V1_5.NgranBands.BAND_75;
        public static final int BAND_76 = android.hardware.radio.V1_5.NgranBands.BAND_76;
        public static final int BAND_77 = android.hardware.radio.V1_5.NgranBands.BAND_77;
        public static final int BAND_78 = android.hardware.radio.V1_5.NgranBands.BAND_78;
        public static final int BAND_79 = android.hardware.radio.V1_5.NgranBands.BAND_79;
        public static final int BAND_80 = android.hardware.radio.V1_5.NgranBands.BAND_80;
        public static final int BAND_81 = android.hardware.radio.V1_5.NgranBands.BAND_81;
        public static final int BAND_82 = android.hardware.radio.V1_5.NgranBands.BAND_82;
        public static final int BAND_83 = android.hardware.radio.V1_5.NgranBands.BAND_83;
        public static final int BAND_84 = android.hardware.radio.V1_5.NgranBands.BAND_84;
        public static final int BAND_86 = android.hardware.radio.V1_5.NgranBands.BAND_86;
        public static final int BAND_89 = android.hardware.radio.V1_5.NgranBands.BAND_89;
        public static final int BAND_90 = android.hardware.radio.V1_5.NgranBands.BAND_90;
        public static final int BAND_91 = android.hardware.radio.V1_5.NgranBands.BAND_91;
        public static final int BAND_92 = android.hardware.radio.V1_5.NgranBands.BAND_92;
        public static final int BAND_93 = android.hardware.radio.V1_5.NgranBands.BAND_93;
        public static final int BAND_94 = android.hardware.radio.V1_5.NgranBands.BAND_94;
        public static final int BAND_95 = android.hardware.radio.V1_5.NgranBands.BAND_95;

        /** 3GPP TS 38.101-2, Version 16.2.0, Table 5.2-1: FR2 bands */
        public static final int BAND_257 = android.hardware.radio.V1_5.NgranBands.BAND_257;
        public static final int BAND_258 = android.hardware.radio.V1_5.NgranBands.BAND_258;
        public static final int BAND_260 = android.hardware.radio.V1_5.NgranBands.BAND_260;
        public static final int BAND_261 = android.hardware.radio.V1_5.NgranBands.BAND_261;

        /**
         * NR Bands
         *
         * @hide */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef(prefix = {"BAND_"},
                value = {BAND_1,
                        BAND_2,
                        BAND_3,
                        BAND_5,
                        BAND_7,
                        BAND_8,
                        BAND_12,
                        BAND_14,
                        BAND_18,
                        BAND_20,
                        BAND_25,
                        BAND_28,
                        BAND_29,
                        BAND_30,
                        BAND_34,
                        BAND_38,
                        BAND_39,
                        BAND_40,
                        BAND_41,
                        BAND_48,
                        BAND_50,
                        BAND_51,
                        BAND_65,
                        BAND_66,
                        BAND_70,
                        BAND_71,
                        BAND_74,
                        BAND_75,
                        BAND_76,
                        BAND_77,
                        BAND_78,
                        BAND_79,
                        BAND_80,
                        BAND_81,
                        BAND_82,
                        BAND_83,
                        BAND_84,
                        BAND_86,
                        BAND_89,
                        BAND_90,
                        BAND_91,
                        BAND_92,
                        BAND_93,
                        BAND_94,
                        BAND_95,
                        BAND_257,
                        BAND_258,
                        BAND_260,
                        BAND_261})
        public @interface NgranBand {}

        /**
         * Unknown NR frequency.
         *
         * @hide
         */
        @SystemApi
        @TestApi
        public static final int FREQUENCY_RANGE_GROUP_UNKNOWN = 0;

        /**
         * NR frequency group 1 defined in 3GPP TS 38.101-1 table 5.2-1
         *
         * @hide
         */
        @SystemApi
        @TestApi
        public static final int FREQUENCY_RANGE_GROUP_1 = 1;

        /**
         * NR frequency group 2 defined in 3GPP TS 38.101-2 table 5.2-1
         *
         * @hide
         */
        @SystemApi
        @TestApi
        public static final int FREQUENCY_RANGE_GROUP_2 = 2;

        /**
         * Radio frequency range group
         *
         * @hide
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef(prefix = {"FREQUENCY_RANGE_GROUP_"},
                value = {
                        FREQUENCY_RANGE_GROUP_UNKNOWN,
                        FREQUENCY_RANGE_GROUP_1,
                        FREQUENCY_RANGE_GROUP_2})
        public @interface FrequencyRangeGroup {}

        /**
         * Get frequency range group
         *
         * @param band NR band
         * @return The frequency range group
         *
         * @hide
         */
        @SystemApi
        @TestApi
        public static @FrequencyRangeGroup int getFrequencyRangeGroup(@NgranBand int band) {
            switch (band) {
                case BAND_1:
                case BAND_2:
                case BAND_3:
                case BAND_5:
                case BAND_7:
                case BAND_8:
                case BAND_12:
                case BAND_14:
                case BAND_18:
                case BAND_20:
                case BAND_25:
                case BAND_28:
                case BAND_29:
                case BAND_30:
                case BAND_34:
                case BAND_38:
                case BAND_39:
                case BAND_40:
                case BAND_41:
                case BAND_48:
                case BAND_50:
                case BAND_51:
                case BAND_65:
                case BAND_66:
                case BAND_70:
                case BAND_71:
                case BAND_74:
                case BAND_75:
                case BAND_76:
                case BAND_77:
                case BAND_78:
                case BAND_79:
                case BAND_80:
                case BAND_81:
                case BAND_82:
                case BAND_83:
                case BAND_84:
                case BAND_86:
                case BAND_89:
                case BAND_90:
                case BAND_91:
                case BAND_92:
                case BAND_93:
                case BAND_94:
                case BAND_95:
                    return FREQUENCY_RANGE_GROUP_1;
                case BAND_257:
                case BAND_258:
                case BAND_260:
                case BAND_261:
                    return FREQUENCY_RANGE_GROUP_2;
                default:
                    return FREQUENCY_RANGE_GROUP_UNKNOWN;
            }
        };

        /** @hide */
        private NgranBands() {}
    }

    /** @hide */
    private AccessNetworkConstants() {};
}
