package dev.utils.app.wifi;

import android.net.wifi.ScanResult;
import android.os.Parcel;
import android.os.Parcelable;

import androidx.annotation.Keep;

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

import dev.utils.LogPrintUtils;

/**
 * detail: Wifi 信息实体类
 * @author Ttt
 */
public class WifiVo implements Parcelable {

    // 日志 TAG
    private static final String TAG = WifiVo.class.getSimpleName();

    @Keep // Wifi ssid
    public String wifiSSID  = null;
    @Keep // Wifi 密码
    public String wifiPwd   = null;
    @Keep // Wifi 加密类型
    public int    wifiType  = WifiUtils.NOPWD;
    @Keep // Wifi 信号等级
    public int    wifiLevel = 0;

    public WifiVo() {
    }

    /**
     * 获取 Wifi 信息
     * @param scanResult 扫描的 Wifi 信息
     * @return {@link WifiVo}
     */
    public static WifiVo createWifiVo(final ScanResult scanResult) {
        return createWifiVo(scanResult, false);
    }

    /**
     * 获取 Wifi 信息
     * @param scanResult 扫描的 Wifi 信息
     * @param isAppend   {@code true} 添加引号, {@code false} 删除引号
     * @return {@link WifiVo}
     */
    public static WifiVo createWifiVo(final ScanResult scanResult, final boolean isAppend) {
        if (scanResult != null) {
            try {
                // 防止 Wifi 名长度为 0
                if (scanResult.SSID.length() == 0) {
                    return null;
                }
                WifiVo wifiVo = new WifiVo();
                // Wifi ssid
                wifiVo.wifiSSID = WifiUtils.formatSSID(scanResult.SSID, isAppend);
                // Wifi 加密类型
                wifiVo.wifiType = WifiUtils.getWifiType(scanResult.capabilities);
                // Wifi 信号等级
                wifiVo.wifiLevel = scanResult.level;
                return wifiVo;
            } catch (Exception e) {
                LogPrintUtils.eTag(TAG, e, "createWifiVo");
            }
        }
        return null;
    }

    /**
     * 扫描 Wifi 信息
     * @param listScanResults 扫描返回的数据
     * @return {@link List<WifiVo>}
     */
    public static List<WifiVo> scanWifiVos(final List<ScanResult> listScanResults) {
        List<WifiVo> listWifiVos = new ArrayList<>();
        scanWifiVos(listWifiVos, listScanResults);
        return listWifiVos;
    }

    /**
     * 扫描 Wifi 信息
     * @param listWifiVos     数据源
     * @param listScanResults 扫描返回的数据
     * @return {@code true} success, {@code false} fail
     */
    public static boolean scanWifiVos(final List<WifiVo> listWifiVos, final List<ScanResult> listScanResults) {
        if (listWifiVos == null || listScanResults == null) return false;
        // 清空旧数据
        listWifiVos.clear();
        // 遍历 Wifi 列表数据
        for (int i = 0, len = listScanResults.size(); i < len; i++) {
            // 如果出现异常、或者失败, 则无视当前的索引 Wifi 信息
            try {
                // 获取当前索引的 Wifi 信息
                ScanResult scanResult = listScanResults.get(i);
                // 防止 Wifi 名长度为 0
                if (scanResult.SSID.length() == 0) {
                    continue;
                }
                // 保存 Wifi 信息
                listWifiVos.add(createWifiVo(scanResult));
            } catch (Exception e) {
                LogPrintUtils.eTag(TAG, e, "scanWifiVos");
            }
        }
        return true;
    }

    // ==============
    // = Parcelable =
    // ==============

    protected WifiVo(Parcel in) {
        wifiSSID = in.readString();
        wifiPwd = in.readString();
        wifiType = in.readInt();
        wifiLevel = in.readInt();
    }

    public static final Creator<WifiVo> CREATOR = new Creator<WifiVo>() {
        @Override
        public WifiVo createFromParcel(Parcel in) {
            return new WifiVo(in);
        }

        @Override
        public WifiVo[] newArray(int size) {
            return new WifiVo[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(final Parcel dest, final int flags) {
        dest.writeString(wifiSSID);
        dest.writeString(wifiPwd);
        dest.writeInt(wifiType);
        dest.writeInt(wifiLevel);
    }
}