/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package android.car;

import android.annotation.SystemApi;

/**
 * Collection of utilities for handling zones
 * @hide
 */
@SystemApi
public class VehicleZoneUtil {

    /**
     * Change zone flag into index with available zones.
     * For example with zoned of 0x80000001, 0x1 will be index 0 and 0x80000000 will be index 2.
     * @param available zones, should not be zero
     * @param zone flag for the zone to get index, should not be zero and should be one of the flags
     *             defined in zones.
     * @return index of desired zone.
     * @throws IllegalArgumentException if zones or zone is invalid.
     */
    public static int zoneToIndex(int zones, int zone) throws IllegalArgumentException {
        if ((zone == 0) || // check that zone is non-zero
                (zones == 0) || // check that zones is non-zero
                ((zone & zones) != zone) || // check that zone is inside of zones
                ((zone & (zone - 1)) != 0)) { // check that zone only has one bit set
            throw new IllegalArgumentException("Invalid zones 0x" + Integer.toHexString(zones) +
                    " or zone 0x" + Integer.toHexString(zone));
        }
        int index = -1;
        while((zone & zones) != 0) {
            index++;
            zones &= zones - 1;
        }
        return index;
    }

    /**
     * Return number of zones (non-zero flag) from given zones.
     */
    public static int getNumberOfZones(int zones) {
        int numZones = 0;
        while (zones != 0) {
            zones &= zones - 1;
            numZones++;
        }
        return numZones;
    }

    /**
     * Return bit flag of first zone. If zones is 0, it will just return 0.
     * @param zones can be 0 if there is no zone
     * @return
     */
    public static int getFirstZone(int zones) {
        if (zones == 0) {
            return 0;
        }
        int flag = 0x1;
        for (int i = 0; i < 32; i++) {
            if ((flag & zones) != 0) {
                return flag;
            }
            flag <<= 1;
        }
        return 0;
    }

    /**
     * Return bit flag of zone available after startingZone. For zones of 0x7 with startingZone of
     * 0x2, it will return 0x4. If no zone exist after startingZone, it will return 0.
     * @param zones
     * @param startingZone A big flag representing a zone. This does not necessarily be one of flags
     *                     available in zones.
     * @return
     * @throws IllegalArgumentException If startingZone is invalid.
     */
    public static int getNextZone(int zones, int startingZone) throws IllegalArgumentException {
        if ((startingZone & (startingZone - 1)) != 0 || startingZone == 0) {
            throw new IllegalArgumentException(
                    "Starting zone should represent only one bit flag: 0x" +
                            Integer.toHexString(startingZone));
        }
        int flag = startingZone<<1;
        while (flag != 0x80000000) {
            if ((flag & zones) != 0) {
                return flag;
            }
            flag <<= 1;
        }
        if ((flag & zones) != 0) {
            return flag;
        }
        return 0;
    }

    /**
     * Return array of zone with each active zone in one index. This can be useful for iterating
     * all available zones.
     */
    public static int[] listAllZones(int zones) {
        int numberOfZones = getNumberOfZones(zones);
        int[] list = new int[numberOfZones];
        if (numberOfZones == 0) {
            return list;
        }
        int flag = 0x1;
        int arrayIndex = 0;
        for (int i = 0; i < 32; i++) {
            if ((flag & zones) != 0) {
                list[arrayIndex] = flag;
                arrayIndex++;
            }
            flag <<= 1;
        }
        return list;
    }
}
