# ProfileSpace 模块业务逻辑

## 模块职责

ProfileSpace 模块负责首页“空间设置”入口，对齐 Android `space_settings -> ProfileInfoRoute` 的个人空间配置能力。

该模块聚焦摄影师在当前景区下的公开展示和接单配置：
- 拉取个人空间资料。
- 修改头像、昵称和简介。
- 管理个人标签、拍摄说明标签和相机设备。
- 配置工作日与法定节假日营业时间。
- 配置接单状态。
- 展示未来 7 天日程，并支持添加、删除和拨打客户电话。

相册管理不属于本模块，仍由 Assets/相册模块承接。

## 核心对象

- `ProfileSpaceView`：空间配置页 UI，负责资料展示、表单输入、日程展示和保存入口。
- `ProfileSpaceViewModel`：维护编辑草稿、原始快照、脏状态、校验和提交逻辑。
- `ProfileSpaceInfoResponse`：空间配置详情响应。
- `UpdateProfileSpaceRequest`：空间配置更新请求。
- `ProfileAPI`：封装空间配置读取和更新接口，同时复用用户昵称、头像更新接口。
- `ScheduleAPI`：复用已有排班新增和删除接口。
- `OSSUploadService`：复用头像上传能力。

## 加载流程

1. 首页点击 `space_settings` 后进入 `ProfileSpaceView`。
2. 页面从 `AccountContext.currentScenic` 读取当前景区 ID。
3. `ProfileSpaceViewModel.load` 调用 `ProfileAPI.profileSpaceInfo`。
4. 接口成功后回填头像、姓名、昵称、简介、标签、设备、营业时间、接单状态和日程 map。
5. ViewModel 保存一份 `ProfileSpaceEditableSnapshot`，用于判断保存按钮是否可用。

缺少当前景区时，页面展示缺少景区空态，不发起空间配置接口。

## 保存流程

1. 用户修改表单后，ViewModel 根据当前草稿和原始快照判断 `hasChanges`。
2. 点击保存时先校验：
   - 昵称不能为空。
   - 标签和拍摄说明均最多 8 个，单个最多 20 字，禁止空值和重复。
   - 四个营业时间必须填写。
   - 工作日、节假日开始时间必须早于结束时间。
3. 如头像有变化，先调用 `OSSUploadService.uploadUserAvatar` 上传，再调用 `ProfileAPI.updateUserAvatarURL` 回写头像。
4. 如昵称有变化，调用 `ProfileAPI.updateUserInfo(nickname:)`。
5. 调用 `ProfileAPI.updateProfileSpaceInfo` 保存空间配置。
6. 保存成功后刷新原始快照，清除头像暂存，并同步 `AccountContext` 和账号快照中的昵称/头像展示信息。

保存失败时保留当前草稿和未保存状态，页面展示错误信息。

## 日程流程

空间配置页展示从空间详情接口返回的 `schedule` map，并在页面内显示从今天起连续 7 天的日程。

添加日程复用现有 `ScheduleAddView`，提交逻辑仍由 Schedule 模块负责。页面返回后会重新加载空间配置。

删除日程调用 `ScheduleAPI.deleteSchedule`，成功后重新加载空间配置，保持日程来源一致。
