package hh.dejsem;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.AnimationDrawable;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.support.v7.app.AppCompatActivity;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import hh.dejsem.fm.NetTaskRef;
import hh.lib.D;

/**
 * TitleBar zobrazuje kromě záhlavových údajů také okamžité procentuální hodnoty</br>
 * stavů datových přenosů probíhajících na pozadí;</br>
 * animovaná ikona indikuje probíhající přenos na pozadí</br>
 * ... obsah 1.řádky (záhlaví) okna GUI aktivit a jejich fragmentů</br>
 * ● záhlaví má 4 pole
 * <ol>
 *     <im>app id</im>
 *     <im>proměnné stavové pole probíhajících přenosů</im>
 *     <im>momentálně nastavený server a číslo šifrovaného kanálu</im>
 *     <im>label aktuální komponenty GUI</im>
 * </ol></br>
 * ● každá komponenta GUI si nastavuje label voláním setText()
 *
 */
public class TitleBar extends RelativeLayout implements Runnable,  Handler.Callback {
	static boolean pending = false;
	public static void setPending() { pending = true; }
	public static void unSetPending() {
		pending = false;
	}

	public static void assign(AppCompatActivity a, int titleId, String titleText) {
		if(K.title == null)
			K.title = ((TitleBar)(a.getLayoutInflater().inflate(R.layout.title_bar, null))).activate();
		K.title.setText(titleText).reassign(a, titleId);
	}

	D d;
	Context c;
	Resources r;
	public ViewGroup container = null;
	View titleView;
	ImageView pendingIcon;
	TextView pendingView;
	TextView channelView;
	TextView titleTextView;
	String titleText = "";
	Handler handler = new Handler(this);
	public Messenger msgr = new Messenger(handler);

	public TitleBar(Context context, AttributeSet attrs) {
		super(context, attrs);
		d = new D(context, getClass().getSimpleName());
		c = context;
		r = c.getResources();
	}

	@Override
	public boolean handleMessage(Message msg) {
		switch(msg.what) {
			case K.MSG_WATCH_PROGRESS:
				update();
				return true;
		}
		return false;
	}

	@Override
	public void run() {
		update();
	}

	public TitleBar activate() {
		if(Prefs.host == null) new Prefs().refreshPrefs(c);

		((TextView)findViewById(R.id.title_left_text)).setText(String.format("%s.%s", r.getString(R.string.app_name), r.getString(R.string.app_version_name)));
		channelView = ((TextView)findViewById(R.id.channel));
		setChannelNum();
		titleTextView = findViewById(R.id.title_right_text);
		pendingIcon = findViewById(R.id.pending_icon);
	    ((AnimationDrawable)pendingIcon.getBackground()).start();
		pendingView = findViewById(R.id.pending_progress);
		return this;
	}

	public TitleBar setChannelNum() {
		channelView.setText(String.format("%s ch %s",
				Prefs.host.subSequence(0, Prefs.host.indexOf('.')), r.getString(R.string.channel)));
		invalidate();
		return this;
	}

	public TitleBar setText(String titleText) {
		this.titleText = titleText;
		titleTextView.setText(titleText);
		invalidate();
		return this;
	}

	public TitleBar reassign(AppCompatActivity a) { return reassign(a, R.id.title_bar); }

	public TitleBar reassign(AppCompatActivity a, int containerId) { return reassign((FrameLayout)(a.findViewById(containerId))); }

	public TitleBar reassign(ViewGroup container) {
		if(this.container != null) this.container.removeView(this);
		container.addView(this);
		this.container = container;
		return this;
	}

	public void update() {
		if(pending) {
			/*((NotificationManager)d.getContext().getSystemService(Context.NOTIFICATION_SERVICE)).getActiveNotifications().length
					// od API 23 se dá využít ke kontrole přítomnosti progres-notifikace na notification bar*/
			String progressText = "";
			synchronized(K.transfProgress.statSet) {
				for(NetTaskRef tr : K.transfProgress.statSet) {
					progressText += String.format("%2d%% ", tr.getProgress().es.getPct());
				}
			}
			pendingView.setText(progressText);
			handler.postDelayed(this, K.transfProgress.refreshInterval);
		}
		pendingView.setVisibility(pending ? View.VISIBLE : View.INVISIBLE);
		pendingIcon.setVisibility(pending ? View.VISIBLE : View.INVISIBLE);
		titleTextView.setText(titleText);
		invalidate();
	}
}

