package com.android.server.wifi.anqp.eap;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * EAP Related constants for the ANQP NAIRealm element, IEEE802.11-2012 section 8.4.4.10
 */
public abstract class EAP {

    private static final Map<Integer, EAPMethodID> sEapIds = new HashMap<>();
    private static final Map<EAPMethodID, Integer> sRevEapIds = new HashMap<>();
    private static final Map<Integer, AuthInfoID> sAuthIds = new HashMap<>();

    public static final int EAP_MD5 = 4;
    public static final int EAP_OTP = 5;
    public static final int EAP_RSA = 9;
    public static final int EAP_KEA = 11;
    public static final int EAP_KEA_VALIDATE = 12;
    public static final int EAP_TLS = 13;
    public static final int EAP_LEAP = 17;
    public static final int EAP_SIM = 18;
    public static final int EAP_TTLS = 21;
    public static final int EAP_AKA = 23;
    public static final int EAP_3Com = 24;
    public static final int EAP_MSCHAPv2 = 26;
    public static final int EAP_PEAP = 29;
    public static final int EAP_POTP = 32;
    public static final int EAP_ActiontecWireless = 35;
    public static final int EAP_HTTPDigest = 38;
    public static final int EAP_SPEKE = 41;
    public static final int EAP_MOBAC = 42;
    public static final int EAP_FAST = 43;
    public static final int EAP_ZLXEAP = 44;
    public static final int EAP_Link = 45;
    public static final int EAP_PAX = 46;
    public static final int EAP_PSK = 47;
    public static final int EAP_SAKE = 48;
    public static final int EAP_IKEv2 = 49;
    public static final int EAP_AKAPrim = 50;
    public static final int EAP_GPSK = 51;
    public static final int EAP_PWD = 52;
    public static final int EAP_EKE = 53;
    public static final int EAP_TEAP = 55;

    public enum EAPMethodID {
        EAP_MD5,
        EAP_OTP,
        EAP_RSA,
        EAP_KEA,
        EAP_KEA_VALIDATE,
        EAP_TLS,
        EAP_LEAP,
        EAP_SIM,
        EAP_TTLS,
        EAP_AKA,
        EAP_3Com,
        EAP_MSCHAPv2,
        EAP_PEAP,
        EAP_POTP,
        EAP_ActiontecWireless,
        EAP_HTTPDigest,
        EAP_SPEKE,
        EAP_MOBAC,
        EAP_FAST,
        EAP_ZLXEAP,
        EAP_Link,
        EAP_PAX,
        EAP_PSK,
        EAP_SAKE,
        EAP_IKEv2,
        EAP_AKAPrim,
        EAP_GPSK,
        EAP_PWD,
        EAP_EKE,
        EAP_TEAP
    }

    public static final int ExpandedEAPMethod = 1;
    public static final int NonEAPInnerAuthType = 2;
    public static final int InnerAuthEAPMethodType = 3;
    public static final int ExpandedInnerEAPMethod = 4;
    public static final int CredentialType = 5;
    public static final int TunneledEAPMethodCredType = 6;
    public static final int VendorSpecific = 221;

    public enum AuthInfoID {
        Undefined,
        ExpandedEAPMethod,
        NonEAPInnerAuthType,
        InnerAuthEAPMethodType,
        ExpandedInnerEAPMethod,
        CredentialType,
        TunneledEAPMethodCredType,
        VendorSpecific
    }

    static {
        sEapIds.put(EAP_MD5, EAPMethodID.EAP_MD5);
        sEapIds.put(EAP_OTP, EAPMethodID.EAP_OTP);
        sEapIds.put(EAP_RSA, EAPMethodID.EAP_RSA);
        sEapIds.put(EAP_KEA, EAPMethodID.EAP_KEA);
        sEapIds.put(EAP_KEA_VALIDATE, EAPMethodID.EAP_KEA_VALIDATE);
        sEapIds.put(EAP_TLS, EAPMethodID.EAP_TLS);
        sEapIds.put(EAP_LEAP, EAPMethodID.EAP_LEAP);
        sEapIds.put(EAP_SIM, EAPMethodID.EAP_SIM);
        sEapIds.put(EAP_TTLS, EAPMethodID.EAP_TTLS);
        sEapIds.put(EAP_AKA, EAPMethodID.EAP_AKA);
        sEapIds.put(EAP_3Com, EAPMethodID.EAP_3Com);
        sEapIds.put(EAP_MSCHAPv2, EAPMethodID.EAP_MSCHAPv2);
        sEapIds.put(EAP_PEAP, EAPMethodID.EAP_PEAP);
        sEapIds.put(EAP_POTP, EAPMethodID.EAP_POTP);
        sEapIds.put(EAP_ActiontecWireless, EAPMethodID.EAP_ActiontecWireless);
        sEapIds.put(EAP_HTTPDigest, EAPMethodID.EAP_HTTPDigest);
        sEapIds.put(EAP_SPEKE, EAPMethodID.EAP_SPEKE);
        sEapIds.put(EAP_MOBAC, EAPMethodID.EAP_MOBAC);
        sEapIds.put(EAP_FAST, EAPMethodID.EAP_FAST);
        sEapIds.put(EAP_ZLXEAP, EAPMethodID.EAP_ZLXEAP);
        sEapIds.put(EAP_Link, EAPMethodID.EAP_Link);
        sEapIds.put(EAP_PAX, EAPMethodID.EAP_PAX);
        sEapIds.put(EAP_PSK, EAPMethodID.EAP_PSK);
        sEapIds.put(EAP_SAKE, EAPMethodID.EAP_SAKE);
        sEapIds.put(EAP_IKEv2, EAPMethodID.EAP_IKEv2);
        sEapIds.put(EAP_AKAPrim, EAPMethodID.EAP_AKAPrim);
        sEapIds.put(EAP_GPSK, EAPMethodID.EAP_GPSK);
        sEapIds.put(EAP_PWD, EAPMethodID.EAP_PWD);
        sEapIds.put(EAP_EKE, EAPMethodID.EAP_EKE);
        sEapIds.put(EAP_TEAP, EAPMethodID.EAP_TEAP);

        for (Map.Entry<Integer, EAPMethodID> entry : sEapIds.entrySet()) {
            sRevEapIds.put(entry.getValue(), entry.getKey());
        }

        sAuthIds.put(ExpandedEAPMethod, AuthInfoID.ExpandedEAPMethod);
        sAuthIds.put(NonEAPInnerAuthType, AuthInfoID.NonEAPInnerAuthType);
        sAuthIds.put(InnerAuthEAPMethodType, AuthInfoID.InnerAuthEAPMethodType);
        sAuthIds.put(ExpandedInnerEAPMethod, AuthInfoID.ExpandedInnerEAPMethod);
        sAuthIds.put(CredentialType, AuthInfoID.CredentialType);
        sAuthIds.put(TunneledEAPMethodCredType, AuthInfoID.TunneledEAPMethodCredType);
        sAuthIds.put(VendorSpecific, AuthInfoID.VendorSpecific);
    }

    public static EAPMethodID mapEAPMethod(int methodID) {
        return sEapIds.get(methodID);
    }

    public static Integer mapEAPMethod(EAPMethodID methodID) {
        return sRevEapIds.get(methodID);
    }

    public static AuthInfoID mapAuthMethod(int methodID) {
        return sAuthIds.get(methodID);
    }
}
