#!/usr/bin/env python3
#
#   Copyright 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.
"""
Sanity tests for voice tests in telephony
"""
import time

from acts.controllers.anritsu_lib._anritsu_utils import AnritsuError
from acts.controllers.anritsu_lib.md8475a import MD8475A
from acts.controllers.anritsu_lib.md8475a import CBCHSetup
from acts.controllers.anritsu_lib.md8475a import CTCHSetup
from acts_contrib.test_utils.tel.anritsu_utils import ETWS_WARNING_EARTHQUAKETSUNAMI
from acts_contrib.test_utils.tel.anritsu_utils import ETWS_WARNING_OTHER_EMERGENCY
from acts_contrib.test_utils.tel.anritsu_utils import cb_serial_number
from acts_contrib.test_utils.tel.anritsu_utils import etws_receive_verify_message_lte_wcdma
from acts_contrib.test_utils.tel.anritsu_utils import set_system_model_gsm
from acts_contrib.test_utils.tel.anritsu_utils import set_system_model_lte
from acts_contrib.test_utils.tel.anritsu_utils import set_system_model_wcdma
from acts_contrib.test_utils.tel.anritsu_utils import set_usim_parameters
from acts_contrib.test_utils.tel.anritsu_utils import set_post_sim_params
from acts_contrib.test_utils.tel.tel_defines import NETWORK_MODE_CDMA
from acts_contrib.test_utils.tel.tel_defines import NETWORK_MODE_GSM_ONLY
from acts_contrib.test_utils.tel.tel_defines import NETWORK_MODE_GSM_UMTS
from acts_contrib.test_utils.tel.tel_defines import NETWORK_MODE_LTE_GSM_WCDMA
from acts_contrib.test_utils.tel.tel_defines import RAT_1XRTT
from acts_contrib.test_utils.tel.tel_defines import RAT_GSM
from acts_contrib.test_utils.tel.tel_defines import RAT_LTE
from acts_contrib.test_utils.tel.tel_defines import RAT_WCDMA
from acts_contrib.test_utils.tel.tel_defines import RAT_FAMILY_CDMA2000
from acts_contrib.test_utils.tel.tel_defines import RAT_FAMILY_GSM
from acts_contrib.test_utils.tel.tel_defines import RAT_FAMILY_LTE
from acts_contrib.test_utils.tel.tel_defines import RAT_FAMILY_UMTS
from acts_contrib.test_utils.tel.tel_logging_utils import start_qxdm_loggers
from acts_contrib.test_utils.tel.tel_phone_setup_utils import ensure_network_rat
from acts_contrib.test_utils.tel.tel_phone_setup_utils import ensure_phones_idle
from acts_contrib.test_utils.tel.tel_test_utils import toggle_airplane_mode
from acts_contrib.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
from acts.test_decorators import test_tracker_info

WAIT_TIME_BETWEEN_REG_AND_MSG = 15  # default 15 sec


class TelLabEtwsTest(TelephonyBaseTest):
    SERIAL_NO = cb_serial_number()

    def setup_class(self):
        super().setup_class()
        self.ad = self.android_devices[0]
        self.ad.sim_card = getattr(self.ad, "sim_card", None)
        self.md8475a_ip_address = self.user_params[
            "anritsu_md8475a_ip_address"]
        self.wlan_option = self.user_params.get("anritsu_wlan_option", False)
        self.md8475_version = self.user_params.get("md8475", "A")
        self.ad.adb.shell("settings put secure cmas_additional_broadcast_pkg "
                          "com.googlecode.android_scripting")
        self.wait_time_between_reg_and_msg = self.user_params.get(
            "wait_time_between_reg_and_msg", WAIT_TIME_BETWEEN_REG_AND_MSG)

        try:
            self.anritsu = MD8475A(self.md8475a_ip_address, self.wlan_option,
                                   self.md8475_version)
        except AnritsuError:
            self.log.error("Error in connecting to Anritsu Simulator")
            return False
        return True

    def setup_test(self):
        if getattr(self, "qxdm_log", True):
            start_qxdm_loggers(self.log, self.android_devices)
        ensure_phones_idle(self.log, self.android_devices)
        toggle_airplane_mode(self.log, self.ad, True)
        return True

    def teardown_test(self):
        self.log.info("Stopping Simulation")
        self.anritsu.stop_simulation()
        toggle_airplane_mode(self.log, self.ad, True)

    def teardown_class(self):
        self.anritsu.disconnect()
        return True

    def _send_receive_etws_message(self, set_simulation_func, rat, message_id,
                                   warning_message):
        try:
            [self.bts1] = set_simulation_func(self.anritsu, self.user_params,
                                              self.ad.sim_card)
            set_usim_parameters(self.anritsu, self.ad.sim_card)
            if rat == RAT_LTE:
                set_post_sim_params(self.anritsu, self.user_params,
                                    self.ad.sim_card)
            self.anritsu.start_simulation()

            if rat == RAT_LTE:
                preferred_network_setting = NETWORK_MODE_LTE_GSM_WCDMA
                rat_family = RAT_FAMILY_LTE
            elif rat == RAT_WCDMA:
                self.bts1.wcdma_ctch = CTCHSetup.CTCH_ENABLE
                self.ad.droid.telephonyToggleDataConnection(False)
                preferred_network_setting = NETWORK_MODE_GSM_UMTS
                rat_family = RAT_FAMILY_UMTS
            elif rat == RAT_GSM:
                self.bts1.gsm_cbch = CBCHSetup.CBCH_ENABLE
                self.ad.droid.telephonyToggleDataConnection(False)
                preferred_network_setting = NETWORK_MODE_GSM_ONLY
                rat_family = RAT_FAMILY_GSM
            elif rat == RAT_1XRTT:
                preferred_network_setting = NETWORK_MODE_CDMA
                rat_family = RAT_FAMILY_CDMA2000
            else:
                self.log.error("No valid RAT provided for ETWS test.")
                return False

            if not ensure_network_rat(
                    self.log,
                    self.ad,
                    preferred_network_setting,
                    rat_family,
                    toggle_apm_after_setting=True):
                self.log.error(
                    "Failed to set rat family {}, preferred network:{}".format(
                        rat_family, preferred_network_setting))
                return False

            self.anritsu.wait_for_registration_state()
            if not etws_receive_verify_message_lte_wcdma(
                    self.log, self.ad, self.anritsu,
                    next(TelLabEtwsTest.SERIAL_NO), message_id,
                    warning_message):
                self.log.error("Phone {} Failed to receive ETWS message"
                               .format(self.ad.serial))
                return False
        except AnritsuError as e:
            self.log.error("Error in connection with Anritsu Simulator: " +
                           str(e))
            return False
        except Exception as e:
            self.log.error("Exception during ETWS send/receive: " + str(e))
            return False
        return True

    def test_carrier_tmobile(self):
        """ Sets the Carrier to TMO.
        Returns: None
        """
        setattr(self.ad, "sim_card", "FiTMO")

    def test_carrier_sprint(self):
        """ Sets the Carrier to SPR.
        Returns: None
        """
        setattr(self.ad, "sim_card", "FiSPR")

    def test_carrier_uscc(self):
        """ Sets the Carrier to USCC.
        Returns: None
        """
        setattr(self.ad, "sim_card", "FiUSCC")

    """ Tests Begin """

    @test_tracker_info(uuid="af4a00d0-9a91-45d5-9f65-9541e64a57f2")
    @TelephonyBaseTest.tel_test_wrap
    def test_etws_earthquake_tsunami_lte(self):
        """ETWS Earthquake and Tsunami warning message reception on LTE

        Tests the capability of device to receive and inform the user
        about the ETWS Earthquake and Tsunami warning message when camped on
        LTE newtork

        Steps:
        1. Make Sure Phone is camped on LTE network
        2. Send ETWS Earthquake and Tsunami warning message from Anritsu

        Expected Result:
        Phone receives ETWS Earthquake and Tsunami warning message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_etws_message(set_system_model_lte, RAT_LTE,
                                               ETWS_WARNING_EARTHQUAKETSUNAMI,
                                               "LTE Earthquake and Tsunami")

    @test_tracker_info(uuid="03785878-0319-413c-9190-d4e08f0edc33")
    @TelephonyBaseTest.tel_test_wrap
    def test_etws_other_emergency_lte(self):
        """ETWS Other emergency warning message reception on LTE

        Tests the capability of device to receive and inform the user
        about the ETWS Other emergency warning message when camped on
        LTE newtork

        Steps:
        1. Make Sure Phone is camped on LTE network
        2. Send ETWS Earthquake and Tsunami warning message from Anritsu

        Expected Result:
        Phone receives ETWS Earthquake and Tsunami warning message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_etws_message(set_system_model_lte, RAT_LTE,
                                               ETWS_WARNING_OTHER_EMERGENCY,
                                               "LTE ETWS Other Emergency")

    @test_tracker_info(uuid="1ef4a5d7-9ceb-49eb-8ec7-5538625c8bd4")
    @TelephonyBaseTest.tel_test_wrap
    def test_etws_earthquake_tsunami_wcdma(self):
        """ETWS Earthquake and Tsunami warning message reception on WCDMA

        Tests the capability of device to receive and inform the user
        about the ETWS Earthquake and Tsunami warning message when camped on
        WCDMA newtork

        Steps:
        1. Make Sure Phone is camped on WCDMA network
        2. Send ETWS Earthquake and Tsunami warning message from Anritsu

        Expected Result:
        Phone receives ETWS Earthquake and Tsunami warning message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_etws_message(
            set_system_model_wcdma, RAT_WCDMA, ETWS_WARNING_EARTHQUAKETSUNAMI,
            "WCDMA Earthquake and Tsunami")

    @test_tracker_info(uuid="71dc9650-d00a-4533-99f5-5cc301c21334")
    @TelephonyBaseTest.tel_test_wrap
    def test_etws_other_emergency_wcdma(self):
        """ETWS Other emergency warning message reception on WCDMA

        Tests the capability of device to receive and inform the user
        about the ETWS Other emergency warning message when camped on
        WCDMA newtork

        Steps:
        1. Make Sure Phone is camped on WCDMA network
        2. Send ETWS Earthquake and Tsunami warning message from Anritsu

        Expected Result:
        Phone receives ETWS Earthquake and Tsunami warning message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_etws_message(
            set_system_model_wcdma, RAT_WCDMA, ETWS_WARNING_OTHER_EMERGENCY,
            "WCDMA ETWS Other Emergency")

    @test_tracker_info(uuid="a9fd9c0e-21bf-41d1-81d2-c34679052fe0")
    @TelephonyBaseTest.tel_test_wrap
    def test_etws_earthquake_tsunami_gsm(self):
        """ETWS Earthquake and Tsunami warning message reception on GSM

        Tests the capability of device to receive and inform the user
        about the ETWS Earthquake and Tsunami warning message when camped on
        GSM newtork

        Steps:
        1. Make Sure Phone is camped on GSM network
        2. Send ETWS Earthquake and Tsunami warning message from Anritsu

        Expected Result:
        Phone receives ETWS Earthquake and Tsunami warning message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_etws_message(set_system_model_gsm, RAT_GSM,
                                               ETWS_WARNING_EARTHQUAKETSUNAMI,
                                               "GSM Earthquake and Tsunami")

    @test_tracker_info(uuid="0ae42f8d-1720-449c-9200-e88f7f1d2cbe")
    @TelephonyBaseTest.tel_test_wrap
    def test_etws_other_emergency_gsm(self):
        """ETWS Other emergency warning message reception on GSM

        Tests the capability of device to receive and inform the user
        about the ETWS Other emergency warning message when camped on
        GSM newtork

        Steps:
        1. Make Sure Phone is camped on GSM network
        2. Send ETWS Earthquake and Tsunami warning message from Anritsu

        Expected Result:
        Phone receives ETWS Earthquake and Tsunami warning message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_etws_message(set_system_model_gsm, RAT_GSM,
                                               ETWS_WARNING_OTHER_EMERGENCY,
                                               "GSM ETWS Other Emergency")

    """ Tests End """
