#!/usr/bin/env python3
#
# Copyright 2022 The Fuchsia Authors
#
# 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.
"""
Script for verifying that we can invoke methods of the WlanFacade.

"""
import array
import logging

from mobly import asserts, signals, test_runner

from antlion.test_utils.wifi import base_test


class WlanFacadeTest(base_test.WifiBaseTest):
    def setup_class(self):
        super().setup_class()
        self.log = logging.getLogger()
        if len(self.fuchsia_devices) < 1:
            raise signals.TestAbortClass(
                "Sorry, please try verifying FuchsiaDevice is in your "
                "config file and try again."
            )
        self.fuchsia_device = self.fuchsia_devices[0]

    def test_get_phy_id_list(self):
        result = self.fuchsia_device.sl4f.wlan_lib.wlanPhyIdList()
        error = result["error"]
        asserts.assert_true(error is None, error)

        self.log.info(f"Got Phy IDs {result['result']}")
        return True

    def test_get_country(self):
        wlan_lib = self.fuchsia_device.sl4f.wlan_lib

        result = wlan_lib.wlanPhyIdList()
        error = result["error"]
        asserts.assert_true(error is None, error)
        phy_id = result["result"][0]

        result = wlan_lib.wlanGetCountry(phy_id)
        error = result["error"]
        asserts.assert_true(error is None, error)

        country_bytes = result["result"]
        country_string = str(array.array("b", country_bytes), encoding="us-ascii")
        self.log.info(f"Got country {country_string} ({country_bytes})")
        return True

    def test_get_dev_path(self):
        wlan_lib = self.fuchsia_device.sl4f.wlan_lib

        result = wlan_lib.wlanPhyIdList()
        error = result["error"]
        asserts.assert_true(error is None, error)
        phy_id = result["result"][0]

        result = wlan_lib.wlanGetDevPath(phy_id)
        error = result["error"]
        asserts.assert_true(error is None, error)

        dev_path = result["result"]
        self.log.info("Got device path: %s", dev_path)
        return True


if __name__ == "__main__":
    test_runner.main()
