/*
 * 文 件 名:  LoginReqFrame
 * 版    权:  华设设计集团股份有限公司
 * 描    述:  充电桩登录认证请求帧
 * 修 改 人:  lvwenbin
 * 修改时间:  2025/12/22
 */
package com.ruoyi.ems.charging.model.req;

import com.ruoyi.ems.charging.model.BaseFrame;
import com.ruoyi.ems.charging.protocol.ProtocolConstants;
import com.ruoyi.ems.charging.utils.ByteUtils;
import io.netty.buffer.ByteBuf;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 充电桩登录认证请求帧 (0x01)
 * 充电桩每次复位或通信离线，都需重新登录，登录成功后才能进行后续交互
 *
 * @author lvwenbin
 * @version [版本号, 2025/12/22]
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class LoginReqFrame extends BaseFrame {
    
    /**
     * 桩编码 (BCD码 7字节)
     * 由平台生成提供给桩使用，示例:32010600019236
     */
    private String pileCode;
    
    /**
     * 桩类型 (BIN码 1字节)
     * 0表示直流桩，1表示交流桩
     */
    private byte pileType;
    
    /**
     * 充电枪数量 (BIN码 1字节)
     */
    private int gunCount;
    
    /**
     * 通信协议版本 (BIN码 1字节)
     * 版本号乘10，v1.0表示0x0A，v2.0表示0x14
     */
    private int protocolVersion;
    
    /**
     * 程序版本 (ASCII码 8字节)
     * 不足8位补零
     */
    private String softwareVersion;
    
    /**
     * 网络链接类型 (BIN码 1字节)
     * 0x00 SIM卡, 0x01 LAN, 0x02 WAN, 0x03 其他
     */
    private byte networkType;
    
    /**
     * SIM卡号 (BCD码 10字节)
     * 不足10位补零，取不到置零
     */
    private String simCard;
    
    /**
     * 运营商 (BIN码 1字节)
     * 0x00 移动, 0x02 电信, 0x03 联通, 0x04 其他
     */
    private byte carrier;
    
    @Override
    public byte getFrameType() {
        return ProtocolConstants.FRAME_TYPE_LOGIN_REQ;
    }
    
    @Override
    protected void encodeBody(ByteBuf buf) {
        ByteUtils.writeBcd(buf, pileCode, 7);
        buf.writeByte(pileType);
        buf.writeByte(gunCount);
        buf.writeByte(protocolVersion);
        ByteUtils.writeAscii(buf, softwareVersion, 8);
        buf.writeByte(networkType);
        ByteUtils.writeBcd(buf, simCard, 10);
        buf.writeByte(carrier);
    }
    
    @Override
    protected void decodeBody(ByteBuf buf) {
        this.pileCode = ByteUtils.readBcd(buf, 7);
        this.pileType = buf.readByte();
        this.gunCount = buf.readByte() & 0xFF;
        this.protocolVersion = buf.readByte() & 0xFF;
        this.softwareVersion = ByteUtils.readAscii(buf, 8);
        this.networkType = buf.readByte();
        this.simCard = ByteUtils.readBcd(buf, 10);
        this.carrier = buf.readByte();
    }
    
    /**
     * 获取桩类型描述
     *
     * @return 桩类型描述
     */
    public String getPileTypeDesc() {
        return pileType == ProtocolConstants.PILE_TYPE_DC ? "直流桩" : "交流桩";
    }
    
    /**
     * 获取协议版本描述
     *
     * @return 协议版本描述
     */
    public String getProtocolVersionDesc() {
        return String.format("V%.1f", protocolVersion / 10.0);
    }
    
    /**
     * 获取网络类型描述
     *
     * @return 网络类型描述
     */
    public String getNetworkTypeDesc() {
        switch (networkType) {
            case ProtocolConstants.NETWORK_TYPE_SIM:
                return "SIM卡";
            case ProtocolConstants.NETWORK_TYPE_LAN:
                return "LAN";
            case ProtocolConstants.NETWORK_TYPE_WAN:
                return "WAN";
            default:
                return "其他";
        }
    }
    
    /**
     * 获取运营商描述
     *
     * @return 运营商描述
     */
    public String getCarrierDesc() {
        switch (carrier) {
            case 0x00:
                return "移动";
            case 0x02:
                return "电信";
            case 0x03:
                return "联通";
            default:
                return "其他";
        }
    }
    
    @Override
    public String toString() {
        return String.format("LoginReqFrame[pileCode=%s, type=%s, gunCount=%d, version=%s, sw=%s, network=%s]",
            pileCode, getPileTypeDesc(), gunCount, getProtocolVersionDesc(), softwareVersion, getNetworkTypeDesc());
    }
}
