package org.onosproject.xran.samplemessages;

import org.onosproject.xran.codecs.api.ECGI;
import org.onosproject.xran.codecs.api.EUTRANCellIdentifier;
import org.onosproject.xran.codecs.api.PLMNIdentity;
import org.onosproject.xran.codecs.pdu.*;
import org.openmuc.jasn1.ber.types.BerInteger;
import org.openmuc.jasn1.ber.types.string.BerUTF8String;

import java.io.UnsupportedEncodingException;

public class L2MeasConf {


    public static XrancPdu constructPacket(ECGI ecgi, int l2MeasInterval) {

        BerInteger reportIntervalMS = new BerInteger(l2MeasInterval);
        L2MeasConfig measConfig = new L2MeasConfig();
        measConfig.setEcgi(ecgi);
        measConfig.setReportIntervalMs(reportIntervalMS);

        BerUTF8String ver = null;
        try {
            ver = new BerUTF8String("2a");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        XrancApiID apiID = new XrancApiID(19);
        XrancPduBody body = new XrancPduBody();
        body.setL2MeasConfig(measConfig);

        XrancPduHdr hdr = new XrancPduHdr();
        hdr.setVer(ver);
        hdr.setApiId(apiID);

        XrancPdu pdu = new XrancPdu();
        pdu.setBody(body);
        pdu.setHdr(hdr);

        return pdu;

    }

    public XrancPdu setPacketProperties() {
        PLMNIdentity plmnIdentity = new PLMNIdentity(new byte[]{(byte) 0x22, (byte) 0x08, (byte) 0x41});
        EUTRANCellIdentifier eutranCellIdentifier = new EUTRANCellIdentifier(new byte[]{
                (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xF0
        }, 28);

        ECGI ecgi = new ECGI();
        ecgi.setPLMNIdentity(plmnIdentity);
        ecgi.setEUTRANcellIdentifier(eutranCellIdentifier);

        BerInteger reportIntervalMS = new BerInteger(10);
        L2MeasConfig measConfig = new L2MeasConfig();
        measConfig.setEcgi(ecgi);
        measConfig.setReportIntervalMs(reportIntervalMS);

        BerUTF8String ver = null;
        try {
            ver = new BerUTF8String("2a");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        XrancApiID apiID = new XrancApiID(19);
        XrancPduBody body = new XrancPduBody();
        body.setL2MeasConfig(measConfig);

        XrancPduHdr hdr = new XrancPduHdr();
        hdr.setVer(ver);
        hdr.setApiId(apiID);

        XrancPdu pdu = new XrancPdu();
        pdu.setBody(body);
        pdu.setHdr(hdr);

        return pdu;
    }
}
