package shop.alien.store.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

/**
 * User-Agent解析工具类
 * 用于从User-Agent字符串中解析设备类型
 *
 * @author system
 * @since 2026-01-14
 */
@Slf4j
public class UserAgentParserUtil {

    /**
     * 设备类型常量
     */
    public static final String DEVICE_TYPE_IOS = "iOS";
    public static final String DEVICE_TYPE_ANDROID = "Android";
    public static final String DEVICE_TYPE_HARMONY = "Harmony";
    public static final String DEVICE_TYPE_PC = "PC";
    public static final String DEVICE_TYPE_UNKNOWN = "Unknown";

    /**
     * 从User-Agent字符串中解析设备类型
     * 优先返回移动端操作系统类型：iOS、Android、Harmony等
     *
     * @param userAgent User-Agent字符串
     * @return 设备类型：iOS、Android、Harmony、PC、Unknown
     */
    public static String parseDeviceType(String userAgent) {
        if (StringUtils.isBlank(userAgent)) {
            return DEVICE_TYPE_UNKNOWN;
        }

        String ua = userAgent.toLowerCase();

        // 判断是否为iOS设备（iPhone、iPad）
        if (isIOS(ua)) {
            return DEVICE_TYPE_IOS;
        }

        // 判断是否为HarmonyOS设备（鸿蒙）
        if (isHarmonyOS(ua)) {
            return DEVICE_TYPE_HARMONY;
        }

        // 判断是否为Android设备
        if (isAndroid(ua)) {
            return DEVICE_TYPE_ANDROID;
        }

        // 默认为PC
        return DEVICE_TYPE_PC;
    }

    /**
     * 判断是否为iOS设备（iPhone、iPad）
     */
    private static boolean isIOS(String ua) {
        // iPhone
        if (ua.contains("iphone")) {
            return true;
        }

        // iPad
        if (ua.contains("ipad")) {
            return true;
        }

        // iOS标识
        if (ua.contains("iphone os") || ua.contains("ios")) {
            return true;
        }

        // iPod touch
        if (ua.contains("ipod")) {
            return true;
        }

        return false;
    }

    /**
     * 判断是否为HarmonyOS设备（鸿蒙）
     */
    private static boolean isHarmonyOS(String ua) {
        // HarmonyOS标识
        if (ua.contains("harmonyos") || ua.contains("harmony os")) {
            return true;
        }

        // 鸿蒙系统可能还包含其他标识
        if (ua.contains("hmos")) {
            return true;
        }

        return false;
    }

    /**
     * 判断是否为Android设备
     */
    private static boolean isAndroid(String ua) {
        // Android标识（包括手机和平板）
        if (ua.contains("android")) {
            return true;
        }

        return false;
    }

    /**
     * 从User-Agent中提取浏览器信息（可选功能）
     *
     * @param userAgent User-Agent字符串
     * @return 浏览器名称
     */
    public static String parseBrowser(String userAgent) {
        if (StringUtils.isBlank(userAgent)) {
            return "Unknown";
        }

        String ua = userAgent.toLowerCase();

        if (ua.contains("chrome") && !ua.contains("edg")) {
            return "Chrome";
        } else if (ua.contains("safari") && !ua.contains("chrome")) {
            return "Safari";
        } else if (ua.contains("firefox")) {
            return "Firefox";
        } else if (ua.contains("edg")) {
            return "Edge";
        } else if (ua.contains("opera") || ua.contains("opr")) {
            return "Opera";
        } else if (ua.contains("msie") || ua.contains("trident")) {
            return "IE";
        } else if (ua.contains("micromessenger")) {
            return "WeChat";
        } else if (ua.contains("qqbrowser")) {
            return "QQBrowser";
        } else if (ua.contains("ucbrowser")) {
            return "UCBrowser";
        }

        return "Unknown";
    }

    /**
     * 从User-Agent中提取操作系统信息（可选功能）
     *
     * @param userAgent User-Agent字符串
     * @return 操作系统名称
     */
    public static String parseOS(String userAgent) {
        if (StringUtils.isBlank(userAgent)) {
            return "Unknown";
        }

        String ua = userAgent.toLowerCase();

        if (ua.contains("windows")) {
            if (ua.contains("windows nt 10")) {
                return "Windows 10";
            } else if (ua.contains("windows nt 6.3")) {
                return "Windows 8.1";
            } else if (ua.contains("windows nt 6.2")) {
                return "Windows 8";
            } else if (ua.contains("windows nt 6.1")) {
                return "Windows 7";
            } else {
                return "Windows";
            }
        } else if (ua.contains("mac os x") || ua.contains("macintosh")) {
            return "macOS";
        } else if (ua.contains("android")) {
            return "Android";
        } else if (ua.contains("iphone os") || ua.contains("ios")) {
            return "iOS";
        } else if (ua.contains("linux")) {
            return "Linux";
        } else if (ua.contains("unix")) {
            return "Unix";
        }

        return "Unknown";
    }
}
