package org.wso2.carbon.device.mgt.ios.payload.util;

import org.apache.commons.lang.StringEscapeUtils;
import org.wso2.carbon.device.mgt.ios.payload.dto.CertificateAttributes;
import org.wso2.carbon.device.mgt.ios.payload.enrollment.DeviceAttributes;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.UUID;

public class EnrollmentUtils {

    public static List<String> getDeviceAttributes() {

        List<String> deviceAttributes = new ArrayList<String>();
        deviceAttributes.add(DeviceAttributes.UDID.getLabel());
        deviceAttributes.add(DeviceAttributes.VERSION.getLabel());
        deviceAttributes.add(DeviceAttributes.SERIAL.getLabel());
        deviceAttributes.add(DeviceAttributes.PRODUCT.getLabel());
        deviceAttributes.add(DeviceAttributes.MAC_ADDRESS_EN0.getLabel());
        deviceAttributes.add(DeviceAttributes.DEVICE_NAME.getLabel());
        deviceAttributes.add(DeviceAttributes.IMEI.getLabel());
        deviceAttributes.add(DeviceAttributes.ICCID.getLabel());

        return  deviceAttributes;
    }

    public Date getCertificateExpirationDate() {
        Date targetDate = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(targetDate);
        calendar.add(Calendar.YEAR, 100);

        return calendar.getTime();
    }

    public List<Object> getSubjectList(CertificateAttributes certAttributes, String purpose) {

        List<Object> subjectList = new ArrayList<Object>();

        ArrayList<Object> outerAttribute1 = new ArrayList<Object>();
        ArrayList<String> attribute1 = new ArrayList<String>();
        attribute1.add(CertificateAttributes.CertificateAttributeConstants.COUNTRY.getLabel());
        attribute1.add(StringEscapeUtils.escapeXml(certAttributes.getCountry()));
        outerAttribute1.add(attribute1);

        ArrayList<Object> outerAttribute2 = new ArrayList<Object>();
        ArrayList<String> attribute2 = new ArrayList<String>();
        attribute2.add(CertificateAttributes.CertificateAttributeConstants.LOCALITY.getLabel());
        attribute2.add(StringEscapeUtils.escapeXml(certAttributes.getLocality()));
        outerAttribute2.add(attribute2);

        ArrayList<Object> outerAttribute3 = new ArrayList<Object>();
        ArrayList<String> attribute3 = new ArrayList<String>();
        attribute3.add(CertificateAttributes.CertificateAttributeConstants.STATE.getLabel());
        attribute3.add(StringEscapeUtils.escapeXml(certAttributes.getState()));
        outerAttribute3.add(attribute3);

        ArrayList<Object> outerAttribute4 = new ArrayList<Object>();
        ArrayList<String> attribute4 = new ArrayList<String>();
        attribute4.add(CertificateAttributes.CertificateAttributeConstants.ORGANIZATION.getLabel());
        attribute4.add(StringEscapeUtils.escapeXml(certAttributes.getOrganization()));
        outerAttribute4.add(attribute4);

        ArrayList<Object> outerAttribute5 = new ArrayList<Object>();
        ArrayList<String> attribute5 = new ArrayList<String>();
        attribute5.add(CertificateAttributes.CertificateAttributeConstants.ORGANIZATION_UNIT.getLabel());
        attribute5.add(StringEscapeUtils.escapeXml(certAttributes.getOrganizationUnit()));
        outerAttribute5.add(attribute5);

        ArrayList<Object> outerAttribute6 = new ArrayList<Object>();
        ArrayList<String> attribute6 = new ArrayList<String>();
        attribute6.add(CertificateAttributes.CertificateAttributeConstants.COMMON_NAME.getLabel());
        attribute6.add(String.format("%s (%s)", purpose, UUID.randomUUID()
                .toString()));
        outerAttribute6.add(attribute6);

        subjectList.add(outerAttribute1);
        subjectList.add(outerAttribute2);
        subjectList.add(outerAttribute3);
        subjectList.add(outerAttribute4);
        subjectList.add(outerAttribute5);
        subjectList.add(outerAttribute6);

        return subjectList;
    }
}
