"""LEKO 下号（UIN）API 流程 RPA · step2 上传证书（API 流程专用）。

与 source 流程 `rpa_leko_step2_upload_oss.py` 对应：
- source 流程：传入桶/路径（vat 桶），返回**完整 URL**；
- API 流程：固定 SaaS 共享私有桶 `usaeu-1259285998`，对象键
  `{API_FLOW_OSS_PREFIX}{年}/{API_FLOW_OSS_MODULE_DIR}/leko/{业务流水号}/{文件名}`，
  返回 **OSS 相对路径**（不带域名、不做 URL 编码——域名由 SaaS 侧拼接，私有桶按需签名）。

常量必须与服务端 `OSS_API_PREFIX` / `OSS_API_MODULE_DIR` 保持一致
（测试 `common-test/generatefile/`、正式 `common-prod/generatefile/`）。

自包含约束：禁止 import 其它 rpa 脚本。
"""

import os
from datetime import datetime

from qcloud_cos import CosConfig, CosS3Client

# ===== 部署常量（按环境修改；需与服务端 .env 的 OSS_API_* 一致）=====
API_FLOW_BUCKET = 'usaeu-1259285998'
API_FLOW_OSS_PREFIX = 'common-test/generatefile/'  # 正式环境改 common-prod/generatefile/
API_FLOW_OSS_MODULE_DIR = 'fr_epr_reg'
API_FLOW_OSS_BUSINESS_LINE = 'leko'  # 业务线目录（与 citeo 区分）
COS_REGION_DEFAULT = 'ap-guangzhou'


def upload_uin_certificate(
    local_file_path: str,
    business_serial_number: str,
    cos_secret_id: str,
    cos_secret_key: str,
    cos_region: str = COS_REGION_DEFAULT,
    cos_bucket_name: str = API_FLOW_BUCKET,
) -> str:
    """上传 UIN 证书到 API 桶，返回 OSS 相对路径（供 step3 回执传 cert_key）。

    Args:
        local_file_path: 本地证书文件路径
        business_serial_number: 公司业务流水号（任务里的 BusinessSerialNumber）
        cos_secret_id / cos_secret_key / cos_region / cos_bucket_name: COS 凭证与桶

    Returns:
        str: OSS 相对路径（如
        `common-test/generatefile/2026/fr_epr_reg/leko/FREPR2026000001/UIN-Certificate.pdf`）

    Raises:
        RuntimeError: 本地文件不存在或上传失败。
    """
    if not os.path.exists(local_file_path):
        raise RuntimeError(f'本地文件不存在: {local_file_path}')

    segment = str(business_serial_number or '').strip().strip('/')
    if not segment:
        raise RuntimeError('business_serial_number 为空，无法构造 API 桶对象键')

    filename = os.path.basename(local_file_path)
    cos_object_key = '/'.join([
        API_FLOW_OSS_PREFIX.strip('/'),
        datetime.now().strftime('%Y'),
        API_FLOW_OSS_MODULE_DIR.strip('/'),
        API_FLOW_OSS_BUSINESS_LINE,
        segment,
        filename,
    ])

    config = CosConfig(
        Region=cos_region,
        SecretId=cos_secret_id,
        SecretKey=cos_secret_key,
        Scheme='https',
    )
    client = CosS3Client(config)

    print(f'🔄 开始上传: {local_file_path} → {cos_object_key}')
    response = client.upload_file(
        Bucket=cos_bucket_name,
        LocalFilePath=local_file_path,
        Key=cos_object_key,
        PartSize=1,
        MAXThread=5,
        EnableMD5=False,
    )

    if response is None:
        raise RuntimeError(f'上传失败：响应为空（{cos_object_key}）')

    print(f'✅ 上传成功（相对路径）: {cos_object_key}')
    return cos_object_key


if __name__ == '__main__':
    # 本地自测：需替换真实凭证与文件路径
    print(upload_uin_certificate(
        local_file_path='./UIN-Certificate.pdf',
        business_serial_number='FREPR2026000001',
        cos_secret_id='<secret-id>',
        cos_secret_key='<secret-key>',
    ))
