package com.unibuy.smartdevice.devices;

import java.util.ArrayList;
import java.util.List;

/*
    filepath:/dev/ttymxc1
    baudRate:9600
    filepath:/dev/ttymxc2
    baudRate:9600
    filepath:/dev/ttymxc3
    baudRate:9600
*/

public enum ComPort {
    //57600, N, 8, 1
    COM_PORT_1("/dev/ttymxc1",  57600, DeviceType.XINYUAN),
    COM_PORT_S1("/dev/ttyS7",  57600,  DeviceType.XINYUAN),
    COM_PORT_2("/dev/ttymxc2",  9600,  DeviceType.NFC_SCANNER),
    COM_PORT_S2("/dev/ttyS6",  9600,  DeviceType.NFC_SCANNER),
    COM_PORT_3("/dev/ttymxc3",  38400,  DeviceType.ELECTRIC),
    COM_PORT_4("/dev/ttymxc4",  38400,  DeviceType.UNKNOWN),
    COM_PORT_5("/dev/ttymxc5",  38400,  DeviceType.UNKNOWN),
    COM_PORT_6("/dev/ttymxc6",  38400,  DeviceType.DIGITAL_DISPLAY),
    COM_PORT_7("/dev/ttymxc7",  38400,  DeviceType.UNKNOWN);

    private final String filepath;
    private final int baudRate;
    private final DeviceType deviceType;

    // 靜態篩選方法
    public static List<ComPort> getPortsByDeviceType(DeviceType type) {
        List<ComPort> result = new ArrayList<>();
        for (ComPort port : ComPort.values()) {
            if (port.getDeviceType() == type) {
                result.add(port);
            }
        }
        return result;
    }

    ComPort(String filepath, int baudRate, DeviceType deviceType) {
        this.filepath = filepath;
        this.baudRate = baudRate;
        this.deviceType = deviceType;
    }

    public String getFilepath() {
        // 下位機(XinYuan)/刷卡機(NFCPay)串口依「串口方案」(本機設定，見 PortProfile)決定，
        // 以因應不同 IPC 主板的串口位置不一致：
        //   - 舊版本 (LEGACY )：下位機 ttyS1、刷卡機 ttyS2
        //   - 星科技 (STARTECH)：下位機 ttyS7、刷卡機 ttyS6
        // 於後台「系統設定」切換；切換後需重啟 app 套用。預設 LEGACY(ttyS1/ttyS2)。
        boolean starTech = PortProfile.isStarTech();
        if (this == COM_PORT_S1) {
            return starTech ? "/dev/ttyS7" : "/dev/ttyS1";
        }
        if (this == COM_PORT_S2) {
            return starTech ? "/dev/ttyS6" : "/dev/ttyS2";
        }
        return filepath;
    }

    public int getBaudRate() {
        return baudRate;
    }

    public DeviceType getDeviceType() {
        return deviceType;
    }

    @Override
    public String toString() {
        return "ComPort{" +
                "filepath='" + filepath +
                ", baudRate=" + baudRate +
                ", deviceType=" + deviceType.getDescription() +
                '}';
    }
}
