<?php
declare(strict_types=1);

/**
 * 数据单明细管理（以明细项目为维度）
 * 页面: admin/washSheetItem/index
 * 数据接口（GridActions）: washSheetItem/grid / washSheetItem/save / washSheetItem/remove / washSheetItem/export
 * 粘贴导入: washSheetItem/import
 *
 * 请求带 sheetId 时（数据单详情页），所有读写都限定在这张数据单内
 */
class washSheetItemAction extends Action
{
    use GridActions;

    protected function gridModel(): Model
    {
        $model = new WashSheetItem();
        $model->scopeToSheet($this->sheetId());

        return $model;
    }

    public function index(): void
    {
        View::set([
            'pageTitle' => lg('数据单明细'),
            'sheets'    => (new WashSheet())->listAll(),
            'vendors'   => (new NumberVendor())->listAll(),
        ]);
        View::put();
    }

    /**
     * 粘贴导入号码，只新增当前数据单里还没有的号码
     * 请求体: { sheetId: 数据单单号, text: 粘贴的多行文本 }
     */
    public function import(): void
    {
        $sheetId = $this->sheetId();
        $text = (string) ($this->request['text'] ?? '');

        if ($sheetId <= 0 || (new WashSheet())->find($sheetId) === null) {
            $this->error(1, lg('数据单不存在'));
        }
        if (trim($text) === '') {
            $this->error(1, lg('请粘贴要导入的号码'));
        }

        $this->success((new WashSheetItem())->import($sheetId, $text));
    }

    /**
     * 清洗一条明细，前端按选中的行逐条调用（进度条就是这么来的）
     * 请求体: { key: 明细ID, mode: 'unclean'（仅处理未清洗部分）| 'all'（重新清洗）, sheetId?: 数据单单号 }
     *
     * 远端接口失败/网络异常都转成 code=1 返回，让前端按单条记失败继续跑，不要整批 500 中断
     */
    public function clean(): void
    {
        $key = (int) ($this->request['key'] ?? 0);
        if ($key <= 0) {
            $this->error(1, lg('明细不存在'));
        }

        $model = new WashSheetItem();
        $model->scopeToSheet($this->sheetId());

        try {
            $this->success($model->clean($key, ($this->request['mode'] ?? '') === 'all'));
        } catch (MvcException | \RuntimeException $e) {
            $this->error(1, $e->getMessage());
        }
    }

    private function sheetId(): int
    {
        return (int) ($this->request['sheetId'] ?? 0);
    }
}
