package com.ruoyi.mill.udp;

import com.ruoyi.mill.protocol.TelegramCodec;
import com.ruoyi.mill.protocol.TelegramSchema;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 接收到的 L3→L2 电文分发处理器
 * 根据电文号前6字节路由到对应业务处理方法
 */
@Component
public class TelegramDispatcher {

    private static final Logger log = LoggerFactory.getLogger(TelegramDispatcher.class);

    public void dispatch(String telegramId, byte[] payload) {
        log.info("[UDP-RECV] telegramId={} payloadLen={}", telegramId, payload.length);
        switch (telegramId) {
            case TelegramSchema.ID_2FK101:
                handle2FK101(TelegramCodec.decode(TelegramSchema.SCHEMA_2FK101, payload));
                break;
            case TelegramSchema.ID_2FK102:
                handle2FK102(TelegramCodec.decode(TelegramSchema.SCHEMA_2FK102, payload));
                break;
            case TelegramSchema.ID_2FK103:
                handle2FK103(TelegramCodec.decode(TelegramSchema.SCHEMA_2FK103, payload));
                break;
            case TelegramSchema.ID_2FK104:
                handle2FK104(TelegramCodec.decode(TelegramSchema.SCHEMA_2FK104, payload));
                break;
            default:
                log.warn("[UDP-RECV] 未知电文号: {}", telegramId);
        }
    }

    /** 2FK101 作业命令信息 — L3 下发生产计划 */
    private void handle2FK101(Map<String, Object> data) {
        log.info("[2FK101] 作业命令: planNo={} inMatNo={} unitCode={}",
                data.get("PLAN_NO"), data.get("IN_MAT_NO"), data.get("UNIT_CODE"));
        // TODO: 写入计划表，触发 K12F01 应答
    }

    /** 2FK102 作业命令撤销 — L3 撤销某条计划 */
    private void handle2FK102(Map<String, Object> data) {
        log.info("[2FK102] 作业撤销: planNo={} inMatNo={}", data.get("PLAN_NO"), data.get("IN_MAT_NO"));
        // TODO: 从计划表软删除，记录撤销原因
    }

    /** 2FK103 作业命令应答 — L3 对 L2 发出计划的回执 */
    private void handle2FK103(Map<String, Object> data) {
        log.info("[2FK103] 命令应答: tcNo={} flag={} result={}",
                data.get("TC_NO"), data.get("FLAG"), data.get("DEAL_RESULT"));
        // TODO: 更新计划状态
    }

    /** 2FK104 产出信息应答 — L3 对 L2 上报产出的回执 */
    private void handle2FK104(Map<String, Object> data) {
        log.info("[2FK104] 产出应答: tcNo={} flag={} result={}",
                data.get("TC_NO"), data.get("FLAG"), data.get("DEAL_RESULT"));
        // TODO: 更新产出确认状态
    }
}
