#!/usr/bin/env python3.4
#
#   Copyright 2021 - Google
#
#   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.
"""
    Test Script for 5G IMS Settings scenarios
"""

import time

from acts import signals
from acts.test_decorators import test_tracker_info
from acts_contrib.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
from acts_contrib.test_utils.tel.tel_defines import CarrierConfigs
from acts_contrib.test_utils.tel.tel_defines import CAPABILITY_VOLTE
from acts_contrib.test_utils.tel.tel_defines import CAPABILITY_WFC
from acts_contrib.test_utils.tel.tel_defines import NETWORK_SERVICE_VOICE
from acts_contrib.test_utils.tel.tel_defines import RAT_NR
from acts_contrib.test_utils.tel.tel_defines import WFC_MODE_WIFI_PREFERRED
from acts_contrib.test_utils.tel.tel_defines import WFC_MODE_CELLULAR_PREFERRED
from acts_contrib.test_utils.tel.tel_subscription_utils import get_outgoing_voice_sub_id
from acts_contrib.test_utils.tel.tel_test_utils import dumpsys_carrier_config
from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_csfb
from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_volte
from acts_contrib.test_utils.tel.tel_5g_utils import is_current_network_5g_nsa
from acts_contrib.test_utils.tel.tel_5g_utils import provision_both_devices_for_5g
from acts_contrib.test_utils.tel.tel_5g_utils import provision_device_for_5g
from acts_contrib.test_utils.tel.tel_5g_utils import set_preferred_mode_for_5g
from acts_contrib.test_utils.tel.tel_ims_utils import change_ims_setting


class Nsa5gImsSettingsTest(TelephonyBaseTest):

    def setup_class(self):
        TelephonyBaseTest.setup_class(self)
        self.dut = self.android_devices[0]
        self.dut_client = self.android_devices[1]
        self.skip_reset_between_cases = False
        self.subid = get_outgoing_voice_sub_id(self.dut)
        self.dut_capabilities = self.dut.telephony["subscription"][
            self.subid].get("capabilities", [])
        self.dut.log.info("DUT capabilities: %s", self.dut_capabilities)
        if CAPABILITY_VOLTE not in self.dut_capabilities:
            raise signals.TestAbortClass("VoLTE is not supported")
        if CAPABILITY_WFC not in self.dut_capabilities:
            raise signals.TestAbortClass("WFC is not supported")
        self.carrier_configs = dumpsys_carrier_config(self.dut)[self.subid]
        self.default_wfc_mode = self.carrier_configs.get(
            CarrierConfigs.DEFAULT_WFC_IMS_MODE_INT, None)
        self.dut_wfc_modes = self.dut.telephony[
            "subscription"][self.subid].get("wfc_modes", [])


    """ Tests Begin """

    @test_tracker_info(uuid="9ed17e7b-c933-4b46-9349-a76fbcba3a24")
    @TelephonyBaseTest.tel_test_wrap
    def test_5g_nsa_volte_wifi_connected_toggle_wfc(self):
        """Test for WiFi Calling settings:
        nsa 5G + VoLTE Enabled + WiFi Connected, Toggling WFC

        Steps:
        1. Setup DUT Idle, 5G network type, VoLTE enabled.
        2. Make sure DUT WiFi connected, WFC disabled.
        3. Set DUT WFC enabled (WiFi Preferred), verify DUT WFC available,
            report iwlan rat.
        4. Set DUT WFC disabled, verify DUT WFC unavailable,
            not report iwlan rat.

        Expected Results:
        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
        4. DUT WiFi Calling feature bit return False, network rat is not iwlan.
        """

        if not phone_setup_volte(self.log, self.dut):
            self.log.error("Failed to setup VoLTE")
            return False

        if not provision_device_for_5g(self.log, self.dut):
            return False

        if not change_ims_setting(log=self.log,
                                ad=self.dut,
                                dut_client= self.dut_client,
                                wifi_network_ssid=self.wifi_network_ssid,
                                wifi_network_pass=self.wifi_network_pass,
                                subid=self.subid,
                                dut_capabilities=self.dut_capabilities,
                                airplane_mode=False,
                                wifi_enabled=True,
                                volte_enabled=True,
                                wfc_enabled=True,
                                nw_gen=RAT_NR,
                                wfc_mode=self.default_wfc_mode):
            return False
        if not change_ims_setting(log=self.log,
                                ad=self.dut,
                                dut_client= self.dut_client,
                                wifi_network_ssid=self.wifi_network_ssid,
                                wifi_network_pass=self.wifi_network_pass,
                                dut_capabilities=self.dut_capabilities,
                                subid=self.subid,
                                airplane_mode=False,
                                wifi_enabled=True,
                                volte_enabled=True,
                                wfc_enabled=False,
                                nw_gen=RAT_NR,
                                wfc_mode=None):
            return False
        return change_ims_setting(log=self.log,
                                ad=self.dut,
                                dut_client= self.dut_client,
                                wifi_network_ssid=self.wifi_network_ssid,
                                wifi_network_pass=self.wifi_network_pass,
                                dut_capabilities=self.dut_capabilities,
                                subid=self.subid,
                                airplane_mode=False,
                                wifi_enabled=True,
                                volte_enabled=True,
                                wfc_enabled=True,
                                nw_gen=RAT_NR,
                                wfc_mode=None)


    @test_tracker_info(uuid="425b16ec-869d-4a0b-a1bc-a3243503525f")
    @TelephonyBaseTest.tel_test_wrap
    def test_5g_nsa_wifi_connected_toggle_wfc(self):
        """Test for WiFi Calling settings:
        nsa 5G + VoLTE Disabled + WiFi Connected, Toggling WFC

        Steps:
        1. Setup DUT Idle, nsa 5G network type, VoLTE disabled.
        2. Make sure DUT WiFi connected, WFC disabled.
        3. Set DUT WFC enabled (WiFi Preferred), verify DUT WFC available,
            report iwlan rat.
        4. Set DUT WFC disabled, verify DUT WFC unavailable,
            not report iwlan rat.

        Expected Results:
        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
        4. DUT WiFi Calling feature bit return False, network rat is not iwlan.
        """

        if not phone_setup_csfb(self.log, self.dut):
            self.log.error("Phone Failed to setup Properly")
            return False

        if not provision_device_for_5g(self.log, self.dut):
            return False

        if not change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=False,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode=self.default_wfc_mode):
            return False
        if not change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=False,
                                       wfc_enabled=False,
                                       nw_gen=RAT_NR,
                                       wfc_mode=None):
            return False
        return change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=False,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode=None)


    @test_tracker_info(uuid="9405d8cf-5b73-4d47-a83d-da115caed177")
    @TelephonyBaseTest.tel_test_wrap
    def test_5g_nsa_volte_wfc_enabled_toggle_wifi(self):
        """Test for WiFi Calling settings:
        nsa 5G + VoLTE Enabled + WFC enabled, Toggling WiFi

        Steps:
        1. Setup DUT Idle, nsa 5G network type, VoLTE enabled.
        2. Make sure DUT WiFi disconnected, WFC enabled (WiFi Preferred).
        3. DUT connect WiFi, verify DUT WFC available, report iwlan rat.
        4. DUT disconnect WiFi,verify DUT WFC unavailable, not report iwlan rat.

        Expected Results:
        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
        4. DUT WiFi Calling feature bit return False, network rat is not iwlan.
        """
        if not phone_setup_volte(self.log, self.dut):
            self.log.error("Failed to setup VoLTE")
            return False

        ads = self.android_devices
        if not provision_both_devices_for_5g(self.log, ads):
            return False

        if not change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=True,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode=self.default_wfc_mode):
            return False
        if not change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=True,
                                       wfc_enabled=False,
                                       nw_gen=RAT_NR,
                                       wfc_mode=None):
            return False
        return change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=True,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode=None)


    @test_tracker_info(uuid="548f07a6-74e2-4071-ba41-2acf3cd51752")
    @TelephonyBaseTest.tel_test_wrap
    def test_5g_nsa_wfc_enabled_toggle_wifi(self):
        """Test for WiFi Calling settings:
        nsa 5G + VoLTE Disabled + WFC enabled, Toggling WiFi

        Steps:
        1. Setup DUT Idle, nsa 5G network type, VoLTE disabled.
        2. Make sure DUT WiFi disconnected, WFC enabled (WiFi Preferred).
        3. DUT connect WiFi, verify DUT WFC available, report iwlan rat.
        4. DUT disconnect WiFi,verify DUT WFC unavailable, not report iwlan rat.

        Expected Results:
        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
        4. DUT WiFi Calling feature bit return False, network rat is not iwlan.
        """
        if not phone_setup_csfb(self.log, self.dut):
            self.log.error("Failed to setup CSFB")
            return False

        if not provision_device_for_5g(self.log, self.dut):
            return False

        if not change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=False,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode=self.default_wfc_mode):
            return False
        if not change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=False,
                                       volte_enabled=False,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode=None):
            return False
        return change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=False,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode=None)


    @test_tracker_info(uuid="f53f8403-b993-4a3b-8d3f-ffc87cdc856e")
    @TelephonyBaseTest.tel_test_wrap
    def test_5g_nsa_wfc_enabled_wifi_connected_toggle_volte(self):
        """Test for WiFi Calling settings:
        nsa 5G + VoLTE Enabled + WiFi Connected + WFC enabled, toggle VoLTE setting

        Steps:
        1. Setup DUT Idle, 5G network type, VoLTE enabled.
        2. Make sure DUT WiFi connected, WFC enabled (WiFi Preferred).
            Verify DUT WFC available, report iwlan rat.
        3. Disable VoLTE on DUT, verify in 2 minutes period,
            DUT does not lost WiFi Calling, DUT still report WFC available,
            rat iwlan.
        4. Enable VoLTE on DUT, verify in 2 minutes period,
            DUT does not lost WiFi Calling, DUT still report WFC available,
            rat iwlan.

        Expected Results:
        2. DUT WiFi Calling feature bit return True, network rat is iwlan.
        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
        4. DUT WiFi Calling feature bit return True, network rat is iwlan.
        """
        if not phone_setup_volte(self.log, self.dut):
            self.dut.log.error("Phone Failed to setup properly")
            return False

        if not provision_device_for_5g(self.log, self.dut):
            return False

        if not change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=True,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode=self.default_wfc_mode):
            return False
        if not change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=False,
                                       wfc_enabled=True,
                                       wfc_mode=None):
            return False
        return change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=True,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode=None)


    @test_tracker_info(uuid="9d951951-bc04-4db1-85e3-f0980f564fd3")
    @TelephonyBaseTest.tel_test_wrap
    def test_5g_nsa_volte_wfc_wifi_preferred_to_cellular_preferred(self):
        """Test for WiFi Calling settings:
        nsa 5G + VoLTE Enabled + WiFi Connected + WiFi Preferred,
        change WFC to Cellular Preferred

        Steps:
        1. Setup DUT Idle, nsa 5G network type, VoLTE enabled.
        2. Make sure DUT WiFi connected, WFC is set to WiFi Preferred.
            Verify DUT WFC available, report iwlan rat.
        3. Change WFC setting to Cellular Preferred.
        4. Verify DUT report WFC not available.

        Expected Results:
        2. DUT WiFi Calling feature bit return True, network rat is iwlan.
        4. DUT WiFI Calling feature bit return False, network rat is not iwlan.
        """
        if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
            raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
        if WFC_MODE_CELLULAR_PREFERRED not in self.dut_wfc_modes:
            raise signals.TestSkip(
                "WFC_MODE_CELLULAR_PREFERRED is not supported")

        if not phone_setup_volte(self.log, self.dut):
            self.dut.log.error("Phone Failed to setup properly.")
            return False

        if not provision_device_for_5g(self.log, self.dut):
            return False

        if not change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=True,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode=self.default_wfc_mode):
            return False
        return change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=True,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode= WFC_MODE_CELLULAR_PREFERRED)


    @test_tracker_info(uuid="9d951951-bc04-4db1-85e3-f0980f564fd3")
    @TelephonyBaseTest.tel_test_wrap
    def test_5g_nsa_wfc_wifi_preferred_to_cellular_preferred(self):
        """Test for WiFi Calling settings:
        nsa 5G + WiFi Connected + WiFi Preferred, change WFC to Cellular Preferred

        Steps:
        1. Setup DUT Idle, nsa 5G network type, VoLTE disabled.
        2. Make sure DUT WiFi connected, WFC is set to WiFi Preferred.
            Verify DUT WFC available, report iwlan rat.
        3. Change WFC setting to Cellular Preferred.
        4. Verify DUT report WFC not available.

        Expected Results:
        2. DUT WiFi Calling feature bit return True, network rat is iwlan.
        4. DUT WiFI Calling feature bit return False, network rat is not iwlan.
        """
        if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
            raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
        if WFC_MODE_CELLULAR_PREFERRED not in self.dut_wfc_modes:
            raise signals.TestSkip(
                "WFC_MODE_CELLULAR_PREFERRED is not supported")

        if not phone_setup_csfb(self.log, self.dut):
            self.dut.log.error("Failed to setup properly")
            return False

        if not provision_device_for_5g(self.log, self.dut):
            return False

        if not change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=False,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode= WFC_MODE_WIFI_PREFERRED):
            return False
        return change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=False,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode= WFC_MODE_CELLULAR_PREFERRED)


    @test_tracker_info(uuid="bb3acfce-1ea9-40c2-9151-12fbc235e359")
    @TelephonyBaseTest.tel_test_wrap
    def test_5g_nsa_volte_wfc_cellular_preferred_to_wifi_preferred(self):
        """Test for WiFi Calling settings:
        nsa 5G + VoLTE Enabled + WiFi Connected + Cellular Preferred,
        change WFC to WiFi Preferred

        Steps:
        1. Setup DUT Idle, nsa 5G network type, VoLTE enabled.
        2. Make sure DUT WiFi connected, WFC is set to Cellular Preferred.
            Verify DUT WFC not available.
        3. Change WFC setting to WiFi Preferred.
        4. Verify DUT report WFC available.

        Expected Results:
        2. DUT WiFi Calling feature bit return False, network rat is not iwlan.
        4. DUT WiFI Calling feature bit return True, network rat is iwlan.
        """
        if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
            raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
        if WFC_MODE_CELLULAR_PREFERRED not in self.dut_wfc_modes:
            raise signals.TestSkip(
                "WFC_MODE_CELLULAR_PREFERRED is not supported")
        if not phone_setup_volte(self.log, self.dut):
            self.dut.log.error("Phone Failed to setup properly")
            return False

        if not provision_device_for_5g(self.log, self.dut):
            return False

        if not change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=True,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode= WFC_MODE_CELLULAR_PREFERRED):
            return False
        return change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=True,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode=WFC_MODE_WIFI_PREFERRED)


    @test_tracker_info(uuid="d4dea8e0-5795-4769-80e2-29c0f951a84a")
    @TelephonyBaseTest.tel_test_wrap
    def test_5g_nsa_wfc_cellular_preferred_to_wifi_preferred(self):
        """Test for WiFi Calling settings:
        nsa 5G + WiFi Connected + Cellular Preferred, change WFC to WiFi Preferred

        Steps:
        1. Setup DUT Idle, nsa 5G network type, VoLTE disabled.
        2. Make sure DUT WiFi connected, WFC is set to Cellular Preferred.
            Verify DUT WFC not available.
        3. Change WFC setting to WiFi Preferred.
        4. Verify DUT report WFC available.

        Expected Results:
        2. DUT WiFi Calling feature bit return False, network rat is not iwlan.
        4. DUT WiFI Calling feature bit return True, network rat is iwlan.
        """
        if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
            raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
        if WFC_MODE_CELLULAR_PREFERRED not in self.dut_wfc_modes:
            raise signals.TestSkip(
                "WFC_MODE_CELLULAR_PREFERRED is not supported")

        if not phone_setup_csfb(self.log, self.dut):
            self.dut.log.error("Phone Failed to setup properly")
            return False

        if not provision_device_for_5g(self.log, self.dut):
            return False

        if not change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=False,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode=WFC_MODE_CELLULAR_PREFERRED):
            return False
        return change_ims_setting(log=self.log,
                                       ad=self.dut,
                                       dut_client= self.dut_client,
                                       wifi_network_ssid=self.wifi_network_ssid,
                                       wifi_network_pass=self.wifi_network_pass,
                                       dut_capabilities=self.dut_capabilities,
                                       subid=self.subid,
                                       airplane_mode=False,
                                       wifi_enabled=True,
                                       volte_enabled=False,
                                       wfc_enabled=True,
                                       nw_gen=RAT_NR,
                                       wfc_mode=WFC_MODE_WIFI_PREFERRED)


