package com.bgycc.smartcanteen.utils;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Build;

import androidx.annotation.NonNull;

import com.bgycc.smartcanteen.R;
import com.blankj.utilcode.util.LogUtils;

import static com.bgycc.smartcanteen.utils.SmartCanteenUtils.TAG;

public class NetworkHelper {
    private static ConnectivityManager connectivityManager;
    private static int transportType = NetworkCapabilities.TRANSPORT_WIFI;

    public static void initialize(Context context) {
        connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    }

    public static String getNetworkType(Context context) {
        switch (transportType) {
            case NetworkCapabilities.TRANSPORT_ETHERNET:
                return context.getString(R.string.network_type_ethernet);
            case NetworkCapabilities.TRANSPORT_WIFI:
                return context.getString(R.string.network_type_wifi);
            default:
                return context.getString(R.string.network_type_unknown);
        }
    }

    public static synchronized void switchNetwork() {
        if (transportType == NetworkCapabilities.TRANSPORT_ETHERNET) {
            requestWifi();
        } else {
            requestEthernet();
        }
    }

    private static void requestEthernet() {
        if (connectivityManager == null) {
            LogUtils.w(TAG, "ConnectivityManager should be initialize before use");
            return;
        }
        int targetTransportType = NetworkCapabilities.TRANSPORT_ETHERNET;
        if (!hasTransport(targetTransportType)) {
            LogUtils.d(TAG, "当前设备不支持通过以太网链接网络");
            return;
        }
        transportType = targetTransportType;
        LogUtils.d(TAG, "网络切换至以太网");
        NetworkRequest request = new NetworkRequest.Builder()
                .addTransportType(transportType)
                .build();
        connectivityManager.requestNetwork(request, createCallback());
    }

    private static void requestWifi() {
        if (connectivityManager == null) {
            LogUtils.w(TAG, "ConnectivityManager should be initialize before use");
            return;
        }
        int targetTransportType = NetworkCapabilities.TRANSPORT_WIFI;
        if (!hasTransport(targetTransportType)) {
            LogUtils.d(TAG, "当前设备不支持通过Wifi链接网络");
            return;
        }
        transportType = targetTransportType;
        LogUtils.d(TAG, "网络切换至Wifi");
        NetworkRequest request = new NetworkRequest.Builder()
                .addTransportType(transportType)
                .build();
        connectivityManager.requestNetwork(request, createCallback());
    }

    private static boolean hasTransport(int transportType) {
        Network[] networks = connectivityManager.getAllNetworks();
        NetworkCapabilities capabilities;
        for (Network n : networks) {
            capabilities = connectivityManager.getNetworkCapabilities(n);
            if (capabilities == null) continue;
            if (capabilities.hasTransport(transportType)) {
                return true;
            }
        }
        return false;
    }

    private static ConnectivityManager.NetworkCallback createCallback() {
        return new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(@NonNull Network network) {
                super.onAvailable(network);
                LogUtils.i(TAG, "网络切换成功: " + network);
                if (Build.VERSION.SDK_INT >= 23) {
                    connectivityManager.bindProcessToNetwork(network);
                } else {
                    ConnectivityManager.setProcessDefaultNetwork(network);
                }
                connectivityManager.unregisterNetworkCallback(this);
            }

            @Override
            public void onUnavailable() {
                super.onUnavailable();
                LogUtils.i(TAG, "网络切换失败: " + transportType);
            }
        };
    }
}