/*
 *    Copyright 2019 James Fenn
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

package com.james.status.data.icon;

import android.Manifest;
import android.content.Context;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

import com.james.status.R;

import java.lang.ref.SoftReference;

//HAH IT'S A ICON DATA FOR THE DATA ICON GET IT BECAUSE THEIR NAMES ARE THE SAME BUT REVERSED YEAH IT'S SO FUNNY HAHHAHAHAHAHAHAH I KNOW RIGHT IT'S REALLY HILARIOUS I'M LITERALLY DYING OF LAUGHTER
public class DataIconData extends IconData {

    private TelephonyManager telephonyManager;
    private DataListener dataListener;

    private boolean isRegistered;

    public DataIconData(Context context) {
        super(context);

        telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        dataListener = new DataListener(this);
    }

    @Override
    public String[] getPermissions() {
        return new String[]{Manifest.permission.READ_PHONE_STATE};
    }

    @Override
    public boolean canHazIcon() {
        return false;
    }

    @Override
    public boolean hasIcon() {
        return false;
    }

    @Override
    public boolean canHazText() {
        return true;
    }

    @Override
    public boolean hasText() {
        return true;
    }

    @Override
    public void register() {
        if (dataListener != null)
            telephonyManager.listen(dataListener, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
        isRegistered = true;

        onDataChanged();
    }

    private void onDataChanged() {
        switch (telephonyManager.getDataState()) {
            case TelephonyManager.DATA_CONNECTED:
            case TelephonyManager.DATA_CONNECTING:
                if (telephonyManager.getDataState() != TelephonyManager.DATA_DISCONNECTED) {
                    switch (telephonyManager.getNetworkType()) {
                        case TelephonyManager.NETWORK_TYPE_GPRS:
                        case TelephonyManager.NETWORK_TYPE_EDGE:
                        case TelephonyManager.NETWORK_TYPE_IDEN:
                            onTextUpdate("2G");
                            return;
                        case TelephonyManager.NETWORK_TYPE_UMTS:
                        case TelephonyManager.NETWORK_TYPE_HSDPA:
                        case TelephonyManager.NETWORK_TYPE_HSUPA:
                        case TelephonyManager.NETWORK_TYPE_EVDO_0:
                        case TelephonyManager.NETWORK_TYPE_EVDO_A:
                        case TelephonyManager.NETWORK_TYPE_EVDO_B:
                        case TelephonyManager.NETWORK_TYPE_EHRPD:
                        case TelephonyManager.NETWORK_TYPE_CDMA:
                        case TelephonyManager.NETWORK_TYPE_1xRTT:
                            onTextUpdate("3G");
                            return;
                        case TelephonyManager.NETWORK_TYPE_HSPA:
                            onTextUpdate("H");
                            return;
                        case TelephonyManager.NETWORK_TYPE_HSPAP:
                            onTextUpdate("H+");
                            return;
                        case TelephonyManager.NETWORK_TYPE_LTE:
                            onTextUpdate("4G");
                            return;
                    }
                }
        }

        onTextUpdate(null);
    }

    @Override
    public void unregister() {
        isRegistered = false;
    }

    @Override
    public String getTitle() {
        return getContext().getString(R.string.icon_data);
    }

    private static class DataListener extends PhoneStateListener {

        private SoftReference<DataIconData> reference;

        private DataListener(DataIconData iconData) {
            reference = new SoftReference<>(iconData);
        }

        @Override
        public void onDataConnectionStateChanged(int state, int networkType) {
            super.onDataConnectionStateChanged(state, networkType);

            DataIconData icon = reference.get();
            if (icon != null && icon.isRegistered)
                icon.onDataChanged();
        }
    }
}