package org.onosproject.xran.samplemessages;

import org.onosproject.xran.codecs.api.*;
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 SchedReportPerUE {

    public XrancPdu setPacketProperties(XrancPdu recv_pdu) {
        ECGI ecgi = recv_pdu.getBody().getL2MeasConfig().getEcgi();

        //Need to get this from UE.
        CRNTI crnti = new CRNTI(new byte[]{(byte) 0x44, (byte) 0x44}, 16);

        SchedMeasRepPerServCell schedMeasRepPerServCell = new SchedMeasRepPerServCell();
        PCIARFCN pciarfcn = new PCIARFCN();
        pciarfcn.setPci(new PhysCellId(500));
        pciarfcn.setEarfcnDl(new ARFCNValue(2100));

        SchedMeasRepPerServCell.QciVals qciVals = new SchedMeasRepPerServCell.QciVals();
        qciVals.setQCI(new QCI(1));
        qciVals.setQCI(new QCI(2));

        PRBUsage prbUsage = new PRBUsage();
        PRBUsage.PrbUsageDl prbUsageDl = new PRBUsage.PrbUsageDl();
        prbUsageDl.setBerInteger(new BerInteger(50));
        prbUsageDl.setBerInteger(new BerInteger(100));
        prbUsage.setPrbUsageDl(prbUsageDl);

        PRBUsage.PrbUsageUl prbUsageUl = new PRBUsage.PrbUsageUl();
        prbUsageUl.setBerInteger(new BerInteger(50));
        prbUsageUl.setBerInteger(new BerInteger(100));
        prbUsage.setPrbUsageUl(prbUsageUl);

        SchedMeasRepPerServCell.McsDl mcsDl = new SchedMeasRepPerServCell.McsDl();
        mcsDl.setBerInteger(new BerInteger(1));
        mcsDl.setBerInteger(new BerInteger(4));

        SchedMeasRepPerServCell.McsUl mcsUl = new SchedMeasRepPerServCell.McsUl();
        mcsUl.setBerInteger(new BerInteger(5));
        mcsUl.setBerInteger(new BerInteger(6));

        SchedMeasRepPerServCell.NumSchedTtisDl numSchedTtisDl = new SchedMeasRepPerServCell.NumSchedTtisDl();
        numSchedTtisDl.setBerInteger(new BerInteger(1000));
        numSchedTtisDl.setBerInteger(new BerInteger(1000));

        SchedMeasRepPerServCell.NumSchedTtisUl numSchedTtisUl = new SchedMeasRepPerServCell.NumSchedTtisUl();
        numSchedTtisUl.setBerInteger(new BerInteger(1000));
        numSchedTtisUl.setBerInteger(new BerInteger(1000));

        SchedMeasRepPerServCell.RankDl1 rankDl1 = new SchedMeasRepPerServCell.RankDl1();
        rankDl1.setBerInteger(new BerInteger(1));
        rankDl1.setBerInteger(new BerInteger(1));

        SchedMeasRepPerServCell.RankDl2 rankDl2 = new SchedMeasRepPerServCell.RankDl2();
        rankDl2.setBerInteger(new BerInteger(1));
        rankDl2.setBerInteger(new BerInteger(1));

        schedMeasRepPerServCell.setPciArfcn(pciarfcn);
        schedMeasRepPerServCell.setQciVals(qciVals);
        schedMeasRepPerServCell.setPrbUsage(prbUsage);
        schedMeasRepPerServCell.setMcsDl(mcsDl);
        schedMeasRepPerServCell.setMcsUl(mcsUl);
        schedMeasRepPerServCell.setNumSchedTtisDl(numSchedTtisDl);
        schedMeasRepPerServCell.setNumSchedTtisUl(numSchedTtisUl);
        schedMeasRepPerServCell.setRankDl1(rankDl1);
        schedMeasRepPerServCell.setRankDl2(rankDl2);

        SchedMeasReportPerUE.SchedReportServCells schedReportServCells = new SchedMeasReportPerUE.SchedReportServCells();
        schedReportServCells.setSchedMeasRepPerServCell(schedMeasRepPerServCell);

        SchedMeasReportPerUE schedMeasReportPerUE = new SchedMeasReportPerUE();
        schedMeasReportPerUE.setCrnti(crnti);
        schedMeasReportPerUE.setEcgi(ecgi);
        schedMeasReportPerUE.setSchedReportServCells(schedReportServCells);

        XrancPduBody body = new XrancPduBody();
        body.setSchedMeasReportPerUE(schedMeasReportPerUE);

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

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

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

        return pdu;


    }
}
