package com.developerphil.adbidea.compatibility;

import com.android.ddmlib.IDevice;
import com.android.tools.idea.model.ManifestInfo;
import org.jetbrains.android.dom.AndroidAttributeValue;
import org.jetbrains.android.dom.manifest.UsesFeature;
import org.jetbrains.android.facet.AndroidFacet;
import org.joor.Reflect;

import java.util.EnumSet;
import java.util.List;

public class GetRequiredHardwareFeaturesCompat extends BackwardCompatibleGetter<EnumSet<IDevice.HardwareFeature>> {

    private AndroidFacet facet;

    public GetRequiredHardwareFeaturesCompat(AndroidFacet facet) {
        this.facet = facet;
    }

    @Override
    // Android studio 1.5 - 2.0-Preview5
    protected EnumSet<IDevice.HardwareFeature> getCurrentImplementation() throws Throwable {
        if (new IsWatchFeatureRequiredCompat(facet).get()) {
            return EnumSet.of(IDevice.HardwareFeature.WATCH);
        } else {
            return EnumSet.noneOf(IDevice.HardwareFeature.class);
        }
    }

    @Override
    // Android studio 1.4 and below
    protected EnumSet<IDevice.HardwareFeature> getPreviousImplementation() {
        ManifestInfo manifestInfo = ManifestInfo.get(facet.getModule(), true);
        List<UsesFeature> requiredFeatures = Reflect.on(manifestInfo).call("getRequiredFeatures").get();

        for (UsesFeature feature : requiredFeatures) {
            AndroidAttributeValue<String> name = feature.getName();
            if (name != null && UsesFeature.HARDWARE_TYPE_WATCH.equals(name.getStringValue())) {
                return EnumSet.of(IDevice.HardwareFeature.WATCH);
            }
        }

        return EnumSet.noneOf(IDevice.HardwareFeature.class);
    }

}