import os  # 读取主程序传入的运行时购买参数，必须放在配置常量使用前。

PASSWORD = "cao2002."  # ECS 实例的登录密码,按你的要求固定设置。
# 说明：日志开关用于输出关键流程进度,排查卡顿问题。 
LOG_ENABLED = True  # 是否输出关键流程日志,True 为开启。 
OUTPUT_SUMMARY = True  # 是否输出结果汇总信息,True 为开启。 
# 说明：批量运行所有地区的控制参数。 
RUN_ALL_REGIONS = True  # 是否一次性购买所有地区,默认关闭。
ALL_REGION_KEYS = ["beijing", "shanghai", "guangzhou", "wulanchabu", "guiyang", "qingdao", "east2"]  # 全部地区逻辑名列表。 
CONTINUE_ON_ERROR = True  # 批量运行时遇到错误是否继续下一地区。 
# 说明：VPC 创建参数集中在这里,便于与后续子网/安全组保持一致。 
VPC_NAME = "wawacloud-vpc"  # VPC 名称,可按需要修改但需保持租户内唯一。 
VPC_DESCRIPTION = "auto create vpc for ecs"  # VPC 描述信息,用于识别用途。 
VPC_CIDR = "192.168.0.0/16"  # VPC 网段,确保覆盖 192.168.0.10/11。 
VPC_AUTO_REUSE = True  # 是否自动复用同名 VPC,避免重复创建。 
VPC_ENTERPRISE_PROJECT_ID = "0"  # 企业项目 ID,"0" 表示默认企业项目。 
VPC_TAGS = []  # VPC 标签列表,按 "key*value" 形式填写。 
VPC_BLOCK_SERVICE_ENDPOINT_STATES = None  # 是否禁用内网服务终结点访问,缺省不传避免权限错误。 
VPC_ENABLE_NETWORK_ADDRESS_USAGE_METRICS = None  # 是否启用子网地址使用率指标监控,缺省不传避免权限错误。 


def runtime_resource_set_index():  # 读取多套资源购买时当前资源组编号。
    raw = (os.getenv("HUAWEI_RESOURCE_SET_INDEX") or "").strip()
    try:
        value = int(raw)
    except ValueError:
        return 0
    return value if value > 0 else 0


def runtime_resource_name(base_name):  # 单套购买保持旧名称，多套购买按资源组编号隔离。
    index = runtime_resource_set_index()
    return f"{base_name}-set-{index}" if index else base_name


VPC_ENDPOINT_TEMPLATE = "https://vpc.{region_id}.myhuaweicloud.com"  # VPC 服务端点模板。 
IAM_ENDPOINT = "https://iam.myhuaweicloud.com"  # IAM 全局服务端点,用于自动获取项目 ID。 
# 说明：购买前先访问所选地区 ECS 控制台页面，等待页面响应完成后再进入云 API 购买流程。
# 说明：控制台页面不能用 AK/SK 完成浏览器登录或初始化项目 ID，默认关闭以免拖慢自动购买。
CONSOLE_PRELOAD_ENABLED = False  # 是否启用购买前控制台地区页面预热。
CONSOLE_PRELOAD_TIMEOUT_SECONDS = 20  # 单个控制台页面访问超时时间（秒）。
CONSOLE_PRELOAD_RETRY_ATTEMPTS = 2  # 控制台页面访问失败时的重试次数。
CONSOLE_PRELOAD_RETRY_DELAY_SECONDS = 2  # 控制台页面访问失败后的等待时间（秒）。
CONSOLE_ECS_URLS_BY_REGION_ID = {  # regionId 到华为云 ECS 控制台页面的映射。
    "cn-southwest-2": "https://console.huaweicloud.com/ecm/?region=cn-southwest-2&locale=zh-cn#/ecs/manager/vmList",  # 西南-贵阳一。
    "cn-south-1": "https://console.huaweicloud.com/ecm/?region=cn-south-1&locale=zh-cn#/ecs/manager/vmList",  # 华南-广州。
    "cn-north-9": "https://console.huaweicloud.com/ecm/?region=cn-north-9&locale=zh-cn#/ecs/manager/vmList",  # 华北-乌兰察布一。
    "cn-east-4": "https://console.huaweicloud.com/ecm/?region=cn-east-4&locale=zh-cn#/ecs/manager/vmList",  # 华东二。
    "cn-east-3": "https://console.huaweicloud.com/ecm/?region=cn-east-3&locale=zh-cn#/ecs/manager/vmList",  # 华东-上海一。
    "cn-north-4": "https://console.huaweicloud.com/ecm/?region=cn-north-4&locale=zh-cn#/ecs/manager/vmList",  # 华北-北京四。
    "cn-east-5": "https://console.huaweicloud.com/ecm/?region=cn-east-5&locale=zh-cn#/ecs/manager/vmList",  # 华东-青岛。
}  # 控制台地区页面映射定义结束。
# 说明：子网创建参数集中在这里,便于后续 ECS 固定 IP 使用。 
SUBNET_NAME = "wawacloud-subnet"  # 子网名称,可按需要修改但需保持租户内唯一。 
SUBNET_DESCRIPTION = "auto create subnet for ecs"  # 子网描述信息,用于识别用途。 
SUBNET_CIDR = "192.168.0.0/24"  # 子网网段,需在 VPC 网段内且掩码<=28。 
SUBNET_GATEWAY_IP = "192.168.0.1"  # 子网网关 IP,必须属于子网网段。 
SUBNET_AUTO_REUSE = True  # 是否自动复用同名子网,避免重复创建。 
SUBNET_IPV6_ENABLE = False  # 是否开启 IPv6,默认关闭。 
SUBNET_DHCP_ENABLE = True  # 是否开启 DHCP,默认开启以便 ECS 获取 IP。 
SUBNET_PRIMARY_DNS = "223.6.6.6"  # 主 DNS 地址,可选填 IPv4 地址。 
SUBNET_SECONDARY_DNS = "119.29.29.29"  # 备 DNS 地址,可选填 IPv4 地址。 
SUBNET_DNS_LIST = []  # DNS 列表字段,需多于两个 DNS 时使用。 
SUBNET_AVAILABILITY_ZONE = None  # 子网可用区标识,可选不填。 
SUBNET_ENABLE_NETWORK_ADDRESS_USAGE_METRICS = None  # 子网地址使用率监控,缺省不传避免权限错误。 
SUBNET_EXTRA_DHCP_OPTS = []  # 子网 DHCP 扩展参数列表,按文档 opt_name/opt_value 组合填写。 
SUBNET_TAGS = []  # 子网标签列表,按 "key*value" 形式填写。 
# 说明：辅助弹性网卡创建参数集中在这里。 
AUX_NIC_DRY_RUN = False  # 是否仅预检辅助网卡创建请求。 
AUX_NIC_DESCRIPTION = ""  # 辅助网卡描述信息,可选。 
AUX_NIC_IPV6_ENABLE = False  # 辅助网卡是否开启 IPv6。 
AUX_NIC_ALLOWED_ADDRESS_PAIRS = []  # 辅助网卡允许地址对列表,默认空。 
AUX_NIC_WAIT_TIMEOUT = 300  # 获取主网卡端口 ID 的超时时间（秒）。 
AUX_NIC_POLL_INTERVAL = 3  # 获取主网卡端口 ID 的轮询间隔（秒）。 
# 说明：安全组创建参数集中在这里,默认会放开 22/3389 端口存在风险。 
SECURITY_GROUP_NAME = "wawacloud-sg"  # 安全组名称,按你的要求设置为 wawacloud-sg。 
SECURITY_GROUP_VPC_ID = ""  # 安全组提示性 vpc_id,可不填。 
SECURITY_GROUP_ENTERPRISE_PROJECT_ID = "0"  # 安全组企业项目 ID,"0" 表示默认项目。 
SECURITY_GROUP_AUTO_REUSE = True  # 是否自动复用同名安全组,避免重复创建。 
SECURITY_GROUP_RULE_STRICT = True  # 是否只保留白名单规则,开启后会删除多余规则。 
SECURITY_GROUP_RULES = [  # 安全组规则白名单列表，默认仅补齐入方向规则。 
    {"protocol": "tcp", "port_range_min": 1, "port_range_max": 52, "directions": ("ingress",)},
    {"protocol": "tcp", "port_range_min": 54, "port_range_max": 65535, "directions": ("ingress",)},
    {"protocol": "udp", "port_range_min": 1, "port_range_max": 52, "directions": ("ingress",)},
    {"protocol": "udp", "port_range_min": 54, "port_range_max": 65535, "directions": ("ingress",)},
    {"protocol": "47", "port_range_min": None, "port_range_max": None, "directions": ("ingress",)},
    {"protocol": "icmp", "port_range_min": None, "port_range_max": None, "directions": ("ingress",)},
]  # 安全组规则白名单定义结束。 
SECURITY_GROUP_RULE_REMOTE_IP_PREFIX = "0.0.0.0/0"  # 安全组规则远端地址,放开全网访问。 
SECURITY_GROUP_RULE_ETHERTYPE = "IPv4"  # 安全组规则 IP 类型,默认 IPv4。 
# 说明：ECS 创建参数集中在这里,避免在代码中硬编码。 
ECS_NAME = "wawacloud-ecs"  # 云服务器名称前缀,批量时会自动追加序号。
ECS_COUNT = 1  # 创建云服务器数量,默认 1。 
ECS_DRY_RUN = False  # 是否仅预检请求,True 时不真正创建实例。 
ECS_CHARGING_MODE = "prePaid"  # 计费模式设置为包周期（包月/包年）。 
ECS_PERIOD_TYPE = "month"  # 包周期类型,设置为 month 表示包月。 
ECS_PERIOD_NUM = 1  # 包周期时长,1 表示 1 个月。 
ECS_AUTO_RENEW = "true"  # 是否自动续费,true 表示开启。 
ECS_AUTO_PAY = "true"  # 是否自动支付,true 表示自动扣费。 
ECS_DESCRIPTION = "auto create ecs"  # 云服务器描述信息,可选。 
ECS_KEY_NAME = ""  # SSH 密钥对名称,设置后优先使用密钥登录。 
ECS_ADMIN_PASS = PASSWORD  # 管理员密码,注意需满足复杂度要求。 
ECS_USER_DATA = ""  # 用户数据脚本的 base64 字符串,填写后将覆盖密码注入。 
ECS_IMAGE_ID = ""  # 镜像 ID,若为空将尝试按名称自动查找。 
ECS_IMAGE_NAME = "Debian 12.0.0 64bit"  # 镜像名称,用于自动查找镜像 ID。 
ECS_IMAGE_VISIBILITY = "public"  # 镜像可见性,常用值 public 或 private。 
ECS_CLIENT_TOKEN = ""  # 幂等性 Token,留空则自动生成。 
ECS_WAIT_JOB = True  # 是否等待异步 Job 完成并返回 server_id。 
ECS_JOB_POLL_INTERVAL = 5  # 轮询 Job 状态的时间间隔（秒）。 
ECS_JOB_TIMEOUT = 900  # 轮询 Job 状态的超时时间（秒）。 
ECS_AVAILABILITY_ZONE = None  # 云服务器可用区,可选不填。 
ECS_BATCH_CREATE_IN_MULTI_AZ = False  # 是否支持随机多 AZ 部署。 
# 说明：默认首轮不指定 ECS 可用区，保持由华为云自动选择；只有首轮创建失败后才按云端可用区候选补试。
REGION_AVAILABILITY_ZONE_PREFERENCES = {}  # 特殊地区可用区兜底优先级，默认留空避免误伤正常购买。
ECS_SERVER_TAGS = []  # 云服务器标签列表（对象数组）,格式为 {"key": "...", "value": "..."}。 
ECS_METADATA = {}  # 云服务器元数据字典,可选。 
ECS_ENDPOINT_TEMPLATE = "https://ecs.{region_id}.myhuaweicloud.com"  # ECS 服务端点模板。 
IMS_ENDPOINT_TEMPLATE = "https://ims.{region_id}.myhuaweicloud.com"  # IMS 服务端点模板,用于查找镜像 ID。 
ECS_DISABLE_SOURCE_CHECK = True  # 是否对主网卡关闭源目的地址检查。 
ECS_ALLOWED_ADDRESS_PAIR_IP = "1.1.1.1/0"  # 关闭源目的检查时使用的 allowed_address_pairs IP。 
ECS_AUTO_REUSE = True  # 是否自动复用已存在的同 IP 云服务器,避免重复创建失败。 
# 说明：EIP 创建与绑定参数集中在这里。 
EIP_ENDPOINT_TEMPLATES = [  # EIP 服务端点模板列表,按优先级尝试。
    # 本次日志里 EIP 独立域名多次 SSL/连接超时；VPC 端点同样承载 EIP API，优先走它以减少无效等待。
    "https://vpc.{region_id}.myhuaweicloud.com",  # VPC 域名优先,用于 EIP 查询/创建/绑定。
    "https://eip.{region_id}.myhuaweicloud.com",  # VPC 端点异常时再降级到 EIP 独立域名。
]  # EIP 服务端点模板列表定义结束。
EIP_TYPE = "5_bgp"  # EIP 类型，默认全动态 BGP。
STATIC_BGP_EIP_TYPE = "5_sbgp"  # 静态 BGP 线路类型，仅由主程序指定地区启用。
STATIC_BGP_REGION_IDS = {
    item.strip()
    for item in os.getenv("HUAWEI_STATIC_BGP_REGION_IDS", "").split(",")
    if item.strip()
}  # 勾选静态 BGP 时，只有北京/上海/广州/贵阳对应 regionId 会进入这里。
EIP_IP_VERSION = 4  # EIP IP 版本,IPv4 为 4。 
EIP_BANDWIDTH_SIZE = 300  # EIP 带宽大小（Mbit/s）,按你的要求调整为 300M。 
EIP_BANDWIDTH_SHARE_TYPE = "PER"  # 带宽共享类型,PER 为独享。 
EIP_BANDWIDTH_CHARGE_MODE = "traffic"  # 带宽计费方式,常用 traffic 或 bandwidth。 
EIP_BANDWIDTH_NAME = "wawacloud-bw"  # EIP 带宽名称,可用于独享带宽标识。 
EIP_ENTERPRISE_PROJECT_ID = "0"  # EIP 企业项目 ID,"0" 表示默认项目。 
EIP_AUTO_REUSE = True  # 是否自动复用未绑定的 EIP,避免重复创建。 
# 说明：以下地区名称为逻辑标识,后续需要映射到华为云 regionId。 
REGION_ID_MAP = {  # 地区逻辑名与华为云 regionId 的映射表。 
    "beijing": "cn-north-4",  # 北京地区对应华北-北京四。 
    "shanghai": "cn-east-3",  # 上海地区对应华东-上海一。 
    "guangzhou": "cn-south-1",  # 广州地区对应华南-广州。 
    "wulanchabu": "cn-north-9",  # 乌兰察布地区对应华北-乌兰察布一。 
    "guiyang": "cn-southwest-2",  # 贵阳地区对应西南-贵阳一。 
    "qingdao": "cn-east-5",  # 青岛地区对应华东-青岛。 
    "east2": "cn-east-4",  # 华东二作为备用逻辑名映射。 
}  # 地区映射表定义结束。 
REGION_DISPLAY_NAMES = {  # 地区逻辑名到中文名称的映射表。 
    "beijing": "北京",  # 北京地区中文名称。 
    "shanghai": "上海",  # 上海地区中文名称。 
    "guangzhou": "广州",  # 广州地区中文名称。 
    "wulanchabu": "乌兰察布",  # 乌兰察布地区中文名称。 
    "guiyang": "贵阳",  # 贵阳地区中文名称。 
    "qingdao": "青岛",  # 青岛地区中文名称。 
    "east2": "华东",  # 华东地区中文名称。 
}  # 地区中文名称映射表定义结束。 
REGIONS_5IP = [  # 5IP 地区列表,统一走 5IP 的规格与公网策略。 
    "beijing",  # 北京地区逻辑名,后续映射到具体 regionId。 
    "shanghai",  # 上海地区逻辑名,后续映射到具体 regionId。 
    "guangzhou",  # 广州地区逻辑名,后续映射到具体 regionId。 
    "wulanchabu",  # 乌兰察布地区逻辑名,后续映射到具体 regionId。 
    "guiyang",  # 贵阳地区逻辑名,后续映射到具体 regionId。 
]  # 5IP 地区列表定义结束。 
# 说明：10IP 地区单独用一个变量便于分支判断。 
REGION_10IP = ["qingdao", "east2"]  # 10IP 地区逻辑名列表,包含青岛与华东二。 
# 说明：5IP 地区的规格统一为 s7.small.1 且仅主网卡。 
SPEC_5IP = {  # 5IP 地区的服务器规格配置字典。 
    "flavor": "s7.small.1",  # ECS 规格名称,对应华为云规格 ID。 
    "disk_type": "SAS",  # 系统盘类型为 SAS。 
    "disk_size_gb": 10,  # 系统盘大小 10GB。 
    "main_nic_ip": "192.168.0.10",  # 主网卡固定私网 IP。 
    "extra_nic_count": 0,  # 额外网卡数量为 0,仅使用主网卡。 
    "aux_nic_count": 4,  # 辅助网卡数量,5IP 地区默认 4 张配合主网卡使用。 
    "aux_nic_ip_start": 11,  # 辅助网卡起始 IP 尾段,5IP 地区从 .11 开始。 
    "aux_nic_ip_end": 14,  # 辅助网卡结束 IP 尾段,5IP 地区到 .14 结束。 
}  # 5IP 规格定义结束。 
SPEC_5IP_GUIYANG = {  # 贵阳地区 5IP 规格配置字典。 
    "flavor": "s7.small.1",  # ECS 规格名称,对应华为云规格 ID。 
    "disk_type": "GPSSD",  # 系统盘类型为 SSD。 
    "disk_size_gb": 10,  # 系统盘大小 10GB。 
    "main_nic_ip": "192.168.0.10",  # 主网卡固定私网 IP。 
    "extra_nic_count": 0,  # 额外网卡数量为 0,仅使用主网卡。 
    "aux_nic_count": 4,  # 辅助网卡数量,贵阳地区默认 4 张配合主网卡使用。 
    "aux_nic_ip_start": 11,  # 辅助网卡起始 IP 尾段,从 .11 开始。 
    "aux_nic_ip_end": 14,  # 辅助网卡结束 IP 尾段,到 .14 结束。 
}  # 贵阳 5IP 规格定义结束。 
# 说明：10IP 地区的 GPSSD 规格定义（如果后续需要区分青岛盘型）。 
SPEC_10IP_GPSSD = {  # 10IP 地区 GPSSD 盘型的规格配置字典。 
    "flavor": "x1.1u.1g",  # ECS 规格名称,对应华为云规格 ID。 
    "disk_type": "GPSSD",  # 系统盘类型为 GPSSD。 
    "disk_size_gb": 10,  # 系统盘大小 10GB。 
    "main_nic_ip": "192.168.0.10",  # 主网卡固定私网 IP。 
    "secondary_nic_ip": "192.168.0.11",  # 第二张标准弹性网卡固定 IP，10IP 地区禁止把 .11 做成辅助网卡。 
    "extra_nic_count": 1,  # 额外标准弹性网卡数量为 1,对应 192.168.0.11。 
    "aux_nic_count": 8,  # 辅助网卡数量,10IP 地区为 2 张弹性网卡 + 8 张辅助网卡。 
    "aux_nic_ip_start": 12,  # 辅助网卡起始 IP 尾段,10IP 地区从 .12 开始。 
    "aux_nic_ip_end": 19,  # 辅助网卡结束 IP 尾段,10IP 地区到 .19 结束。 
}  # 10IP GPSSD 规格定义结束。 
# 说明：10IP 地区的 SAS 规格定义（当前青岛使用该盘型）。 
SPEC_10IP_SAS = {  # 10IP 地区 SAS 盘型的规格配置字典。 
    "flavor": "x1.1u.1g",  # ECS 规格名称,对应华为云规格 ID。 
    "disk_type": "SAS",  # 系统盘类型为 SAS。 
    "disk_size_gb": 40,  # 系统盘大小 40GB,按青岛地区要求调整。 
    "main_nic_ip": "192.168.0.10",  # 主网卡固定私网 IP。 
    "secondary_nic_ip": "192.168.0.11",  # 第二张标准弹性网卡固定 IP，10IP 地区禁止把 .11 做成辅助网卡。 
    "extra_nic_count": 1,  # 额外标准弹性网卡数量为 1,对应 192.168.0.11。 
    "aux_nic_count": 8,  # 辅助网卡数量,10IP 地区为 2 张弹性网卡 + 8 张辅助网卡。 
    "aux_nic_ip_start": 12,  # 辅助网卡起始 IP 尾段,10IP 地区从 .12 开始。 
    "aux_nic_ip_end": 19,  # 辅助网卡结束 IP 尾段,10IP 地区到 .19 结束。 
}  # 10IP SAS 规格定义结束。 
# 说明：地区到规格的映射表,后续可根据文档或策略调整。 
REGION_SPECS = {  # 按地区逻辑名选择对应规格。 
    "beijing": SPEC_5IP,  # 北京地区使用 5IP 规格。 
    "shanghai": SPEC_5IP,  # 上海地区使用 5IP 规格。 
    "guangzhou": SPEC_5IP,  # 广州地区使用 5IP 规格。 
    "wulanchabu": SPEC_5IP,  # 乌兰察布地区使用 5IP 规格。 
    "guiyang": SPEC_5IP_GUIYANG,  # 贵阳地区使用 SSD 盘 5IP 规格。 
    "qingdao": SPEC_10IP_SAS,  # 青岛地区使用 10IP SAS 规格。 
    "east2": SPEC_10IP_GPSSD,  # 华东二地区使用 10IP GPSSD 规格。 
}  # 地区规格映射表定义结束。 
DELTA_MODE_SPEC_OVERRIDES = {  # 三角洲模式只覆盖服务器规格和系统盘参数，其它 IP/网卡规则保持原地区配置。
    "flavor": "x1.2u.2g",  # 三角洲模式 ECS 规格：2vCPU / 2GiB。
    "disk_type": "SAS",  # 华为云高 IO 系统盘 API 值为 SAS。
    "disk_size_gb": 10,  # 三角洲模式系统盘大小 10GB。
}  # 三角洲模式覆盖参数定义结束。
TWENTY_MODE_SPEC_OVERRIDES = {  # 20 模式不限地区，固定使用 2 弹性网卡 + 2 虚拟IP + 16 辅助弹性网卡。
    "flavor": "s7.small.1",  # 20 模式 ECS 固定规格：1vCPUs | 1GiB | s7.small.1。
    "flavor_candidates": ["s7.small.1"],  # 20 模式只允许这一个 ECS 规格，不自动切到 2c2g。
    "disk_type": "SAS",  # 仍保持按旧流程高 IO 起步，售罄时沿用云硬盘升档逻辑。
    "disk_size_gb": 10,  # 20 规格系统盘大小保持 10GB。
    "main_nic_ip": "192.168.0.10",  # 主网卡固定 IP。
    "secondary_nic_ip": "192.168.0.11",  # 第二张标准弹性网卡固定 IP。
    "extra_nic_count": 1,  # 购买 ECS 时一并创建第二张标准弹性网卡。
    "virtual_ip_count": 2,  # 新建 2 个虚拟 IP。
    "virtual_ip_start": 12,  # 虚拟 IP 从 192.168.0.12 开始。
    "virtual_ip_end": 13,  # 虚拟 IP 到 192.168.0.13 结束。
    "aux_nic_count": 16,  # 辅助弹性网卡数量。
    "aux_nic_ip_start": 14,  # 辅助弹性网卡从 192.168.0.14 开始。
    "aux_nic_ip_end": 29,  # 辅助弹性网卡到 192.168.0.29 结束。
    "aux_parent_main_only": True,  # 20 规格所有辅助弹性网卡都绑定主网卡 192.168.0.10。
}  # 20 规格覆盖参数定义结束。
HUAWEI_DISK_UPGRADE_ORDER = ["SAS", "GPSSD", "SSD"]  # 云硬盘售罄时的升档顺序：高IO -> 通用型SSD -> 超高IO。
HUAWEI_DISK_TYPE_LABELS = {  # 云硬盘类型中文名称映射。 
    "SAS": "高IO",  # SAS 对应高 IO 云硬盘。 
    "GPSSD": "通用型SSD",  # GPSSD 对应通用型 SSD。 
    "SSD": "超高IO",  # SSD 对应超高 IO。 
}  # 云硬盘中文名称映射结束。
