import os

from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkcore.exceptions import exceptions
from huaweicloudsdkgsl.v3.gsl_client import GslClient
from huaweicloudsdkgsl.v3.model.cut_net_req import CutNetReq
from huaweicloudsdkgsl.v3.model.delete_real_name_request import DeleteRealNameRequest
from huaweicloudsdkgsl.v3.model.down_up_time_for_sim_card_req import DownUpTimeForSimCardReq
from huaweicloudsdkgsl.v3.model.enable_sim_card_request import EnableSimCardRequest
from huaweicloudsdkgsl.v3.model.exceed_cut_net_req import ExceedCutNetReq
from huaweicloudsdkgsl.v3.model.list_sim_cards_request import ListSimCardsRequest
from huaweicloudsdkgsl.v3.model.register_imei_req import RegisterImeiReq
from huaweicloudsdkgsl.v3.model.register_imei_request import RegisterImeiRequest
from huaweicloudsdkgsl.v3.model.reset_sim_card_request import ResetSimCardRequest
from huaweicloudsdkgsl.v3.model.set_exceed_cut_net_request import SetExceedCutNetRequest
from huaweicloudsdkgsl.v3.model.set_speed_value_req import SetSpeedValueReq
from huaweicloudsdkgsl.v3.model.set_speed_value_request import SetSpeedValueRequest
from huaweicloudsdkgsl.v3.model.show_real_named_request import ShowRealNamedRequest
from huaweicloudsdkgsl.v3.model.show_sim_card_request import ShowSimCardRequest
from huaweicloudsdkgsl.v3.model.start_stop_net_request import StartStopNetRequest
from huaweicloudsdkgsl.v3.model.stop_sim_card_request import StopSimCardRequest
from huaweicloudsdkgsl.v3.region.gsl_region import GslRegion


class SimCardsApplication:
    # 认证用的ak和sk直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
    # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
    __AK = os.environ["HUAWEICLOUD_SDK_AK"]
    __SK = os.environ["HUAWEICLOUD_SDK_SK"]

    # 华为云IAM服务访问终端地址
    __IAM_ENDPOINT = "https://<IamEndpoint>"

    def __init__(self):
        pass

    @staticmethod
    def main(args):
        # 创建认证
        auth = BasicCredentials(
            ak=SimCardsApplication.__AK,
            sk=SimCardsApplication.__SK,
        ).with_iam_endpoint(endpoint=SimCardsApplication.__IAM_ENDPOINT)

        gsl_client = GslClient.new_builder() \
            .with_credentials(credentials=auth) \
            .with_region(region=GslRegion.CN_NORTH_4) \
            .build()
        # 查询SIM卡实名认证信息
        SimCardsApplication.__show_real_named(gsl_client)
        # 清除SIM卡的实名认证信息
        SimCardsApplication.__delete_real_name(gsl_client)
        # 查询SIM卡列表
        SimCardsApplication.__list_sim_cards(gsl_client)
        # 查询SIM卡详情
        SimCardsApplication.__show_sim_card(gsl_client)
        # 实体卡限速
        SimCardsApplication.__set_speed_value(gsl_client)
        # SIM卡单卡复机
        SimCardsApplication.__reset_sim_card(gsl_client)
        # SIM卡单卡停机
        SimCardsApplication.__stop_sim_card(gsl_client)
        # SIM卡达量断网/恢复在用
        SimCardsApplication.__set_exceed_cut_net(gsl_client)
        # SIM卡申请断网/恢复在用
        SimCardsApplication.__start_stop_net(gsl_client)
        # SIM卡机卡重绑
        SimCardsApplication.__register_imei(gsl_client)
        # 激活实体卡
        SimCardsApplication.__enable_sim_card(gsl_client)

    @staticmethod
    def __delete_real_name(gsl_client):
        sim_card_id = 4084101881827328
        try:
            response = gsl_client.delete_real_name(
                DeleteRealNameRequest(
                    sim_card_id=sim_card_id
                )
            )
            print(response)
        except exceptions.ClientRequestException as e:
            SimCardsApplication.__handle_exception(e)

    @staticmethod
    def __enable_sim_card(gsl_client):
        sim_card_id = 3449878700524511
        try:
            response = gsl_client.enable_sim_card(
                EnableSimCardRequest(
                    sim_card_id=sim_card_id
                )
            )
            print(response)
        except exceptions.ClientRequestException as e:
            SimCardsApplication.__handle_exception(e)

    @staticmethod
    def __list_sim_cards(gsl_client):
        # 显示的数据数量
        limit = 10
        # 展示的当前页
        offset = 1
        # SIM卡状态-11-未激活
        sim_status = 11
        try:
            response = gsl_client.list_sim_cards(
                ListSimCardsRequest(
                    limit=limit,
                    offset=offset,
                    sim_status=sim_status
                )
            )
            print(response)
        except exceptions.ClientRequestException as e:
            SimCardsApplication.__handle_exception(e)

    @staticmethod
    def __register_imei(gsl_client):
        sim_card_id = 3449878744318976
        bind_type = 1
        imei = "866758045090897"
        try:
            response = gsl_client.register_imei(
                RegisterImeiRequest(
                    sim_card_id=sim_card_id,
                    body=RegisterImeiReq(
                        imei=imei,
                        bind_type=bind_type
                    )
                )
            )
            print(response)
        except exceptions.ClientRequestException as e:
            SimCardsApplication.__handle_exception(e)

    @staticmethod
    def __reset_sim_card(gsl_client):
        sim_card_id = 27
        down_up_switch = 1
        try:
            response = gsl_client.re_sim_card = ResetSimCardRequest(
                sim_card_id=sim_card_id,
                body=DownUpTimeForSimCardReq(
                    down_up_switch=down_up_switch
                )
            )
            print(response)
        except exceptions.ClientRequestException as e:
            SimCardsApplication.__handle_exception(e)

    @staticmethod
    def __set_exceed_cut_net(gsl_client):
        # 只支持中国电信
        sim_card_id = 15847632244711
        # 1:设置达量断网域值,2:取消达量断网域值
        action = 1
        # 只能是0,-1,正整数,-1表示无限制,0表示有上网流量产生就会立即断网
        quota = "0"
        try:
            response = gsl_client.exceed_cut_net = SetExceedCutNetRequest(
                sim_card_id=sim_card_id,
                body=ExceedCutNetReq(
                    action=action,
                    quota=quota
                )
            )
            print(response)
        except exceptions.ClientRequestException as e:
            SimCardsApplication.__handle_exception(e)

    @staticmethod
    def __set_speed_value(gsl_client):
        # 中国电信
        sim_card_id = 15847632244712
        # 不同运营商支持的限速速率不同
        speed_value = 256
        try:
            response = gsl_client.speed_value = SetSpeedValueRequest(
                sim_card_id=sim_card_id,
                body=SetSpeedValueReq(
                    speed_value=speed_value
                )
            )
            print(response)
        except exceptions.ClientRequestException as e:
            SimCardsApplication.__handle_exception(e)

    @staticmethod
    def __show_real_named(gsl_client):
        sim_card_id = 3851944051704838
        try:
            response = gsl_client.show_real_named(
                ShowRealNamedRequest(
                    sim_card_id=sim_card_id
                )
            )
            print(response)
        except exceptions.ClientRequestException as e:
            SimCardsApplication.__handle_exception(e)

    @staticmethod
    def __show_sim_card(gsl_client):
        sim_card_id = 3851944051704838
        try:
            response = gsl_client.show_sim_card(
                ShowSimCardRequest(
                    sim_card_id=sim_card_id
                )
            )
            print(response)
        except exceptions.ClientRequestException as e:
            SimCardsApplication.__handle_exception(e)

    @staticmethod
    def __start_stop_net(gsl_client):
        sim_card_id = 3851944051704842
        # (ADD:断网,DEL:取消断网)
        action = "ADD"
        try:
            response = gsl_client.start_stop_net(
                StartStopNetRequest(
                    sim_card_id=sim_card_id,
                    body=CutNetReq(
                        action=action
                    )
                )
            )
            print(response)
        except exceptions.ClientRequestException as e:
            SimCardsApplication.__handle_exception(e)

    @staticmethod
    def __stop_sim_card(gsl_client):
        sim_card_id = 14
        down_up_switch = 1
        try:
            response = gsl_client.stop_sim_card(
                StopSimCardRequest(
                    sim_card_id=sim_card_id,
                    body=DownUpTimeForSimCardReq(
                        down_up_switch=down_up_switch
                    )
                )
            )
            print(response)
        except exceptions.ClientRequestException as e:
            SimCardsApplication.__handle_exception(e)

    @staticmethod
    def __handle_exception(e):
        print(e.status_code)
        print(e.request_id)
        print(e.error_code)
        print(e.error_msg)


if __name__ == "__main__":
    SimCardsApplication().main(any)