"""5f 课后练习：组合数据类型与真题数据结构。

要求：
1. 只修改 TODO 标记的位置。
2. 先画出结构，再写索引或键访问路径。
3. 最终文件应从上到下一次运行，不出现异常。
"""

import pandas as pd


print("=" * 72)
print("第一部分：列表创建、访问与收集")

columns = ["年度", "季度", "网店名称", "销量", "退单量", "售价"]
# TODO 1：分别取出第一个字段、最后一个字段和中间的三个业务字段。
first_column = "请修改"
last_column = "请修改"
business_columns = []
print(first_column, last_column, business_columns)

page_one = [{"商品": "双肩包", "销量": 12}]
page_two = [{"商品": "旅行箱", "销量": 8}]
all_records = []
# TODO 2：用 extend() 把两页记录逐条加入 all_records。
print("记录数量：", len(all_records), all_records)

dataframe_list = []
df_page_one = pd.DataFrame(page_one)
df_page_two = pd.DataFrame(page_two)
# TODO 3：用 append() 把两个 DataFrame 分别作为整体加入列表，再 concat。
combined_pages = pd.DataFrame()
print(combined_pages)


print("\n第二部分：元组与集合")

group_key = (2024, "华东")
# TODO 4：通过解包把年份和区域分别赋给 year、region。
year = 0
region = "请修改"
print(year, region)

raw_channels = ["直播", "搜索", "直播", "短视频", "搜索"]
# TODO 5：使用集合去重；再判断“直播”是否出现。
unique_channels = set()
has_live = False
print(unique_channels, has_live)


print("\n第三部分：字典访问与修改")

product = {"商品名称": "旅行箱", "销量": 125, "售价": 299.0}
# TODO 6：直接读取必须存在的销量；使用 get() 读取可能缺失的退单量，默认 0。
sales = 0
returns = 0
print("实际销量：", sales - returns)

goods_req = {
    "pageNum": 5,
    "pageSize": 1000,
    "tableName": "ms",
    "clname": "网店名称",
    "clvalue": "旧店铺",
}
# TODO 7：切换到“名仕旗舰店”，并把页码重置为 1。
print(goods_req)


print("\n第四部分：嵌套 JSON")

response_data = {
    "code": 200,
    "data": {
        "list": [
            {"商品名称": "双肩包", "销量": "125", "退单量": "8", "售价": "199.0"},
            {"商品名称": "旅行箱", "销量": "80", "退单量": "5", "售价": "399.0"},
        ],
        "hasNextPage": False,
    },
}
# TODO 8：逐层取出商品记录列表和 hasNextPage。
records = []
has_next_page = True
print("商品数：", len(records), "是否还有下一页：", has_next_page)


print("\n第五部分：字典规则与 DataFrame 构造")

aggregation_rules = {
    "实际销量": "sum",
    "实际销售额": "sum",
    "售价": "mean",
}
# TODO 9：遍历 items()，输出“列名 -> 统计函数”。

target_rows = {
    "项目": ["期初现金的现金流量", "变动金额求和"],
    "金额": [8.0, 4.0],
}
# TODO 10：使用 target_rows 构造 DataFrame。
result_table = pd.DataFrame()
print(result_table)


print("\n第六部分：名仕真题微案例")

shop_data = [
    {"网店名称": "名仕旗舰店"},
    {"网店名称": "名仕专营店"},
]
mock_pages = {
    "名仕旗舰店": [
        [{"网店名称": "名仕旗舰店", "销量": 125, "退单量": 8, "售价": 199.0}],
        [{"网店名称": "名仕旗舰店", "销量": 60, "退单量": 3, "售价": 259.0}],
    ],
    "名仕专营店": [
        [{"网店名称": "名仕专营店", "销量": 80, "退单量": 5, "售价": 299.0}],
    ],
}


def collect_shop_pages(shops, pages_by_shop):
    """模拟按店铺收集分页 JSON，并合并为 DataFrame。"""
    dataframe_list = []
    goods_req = {"pageNum": 1, "clvalue": ""}
    # TODO 11：
    # 1. 遍历 shops，从店铺字典读取名称；
    # 2. 更新 clvalue 并重置 pageNum；
    # 3. 遍历该店铺的每页记录，转成 DataFrame 后 append；
    # 4. 每处理一页，pageNum 加 1；
    # 5. 循环结束后使用 pd.concat(..., ignore_index=True)。
    return pd.DataFrame()


collected = collect_shop_pages(shop_data, mock_pages)
print(collected)


print("\n第七部分：自检")

# TODO 12：解释 append() 与 extend() 的区别。
# 解释：

# TODO 13：解释为什么列名清单不能使用集合。
# 解释：

# TODO 14：写出 response_data 中第一件商品名称的完整访问路径。
# 访问路径：

# 自检：
# [ ] 知道列表索引从 0 开始。
# [ ] 能区分 append 与 extend。
# [ ] 知道 {} 是空字典，set() 才是空集合。
# [ ] 能区分字典直接访问和 get 默认值。
# [ ] 能逐层读取字典-字典-列表结构。
# [ ] 能把记录列表或列字典转换成 DataFrame。
