package com.momrach.basichandlerthreadmessages;

import android.app.Activity;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;

import java.lang.ref.WeakReference;


public class WorkerThread extends HandlerThread {
    private Handler mHandler;
    private Handler mUIHandler;
    private WeakReference<Activity>  theActivity;
    int mDelay = 5000; //5 seconds
    private boolean handlerSetted;
    private boolean doingLongTask;

    protected void SetDoing(boolean newStatus){
        doingLongTask = newStatus;
    }


    public WorkerThread(Handler uiHandler, String name) {
        super(name);
        this.mUIHandler = uiHandler;
        this.handlerSetted  = false;
        this.doingLongTask = false;
    }

    public void SendMessage(int what){
        //NO podemos inicializar el handler hasta que el thread no esté creado, por eso no va esto en el construtor.
        if (!handlerSetted){
            mHandler = new MyHandler(getLooper()); //El thread ya esta creado con looper, que pasamos al constructor.
            handlerSetted = true;
        }
        //Antes de enviar una nueva tarea comprobamos si ya hay una corriendo
        if (!doingLongTask) {
            //Obtenemos el mensaje primero del Handler
            Message msg = mHandler.obtainMessage(what);
            mHandler.sendMessage(msg);
        }
        else{
            //Está running la long Task, informamos
            Message uiMessage = mUIHandler.obtainMessage(Globals.WT_RUNNING);
            mUIHandler.sendMessage(uiMessage);
        }
    }

    public void PostTask(Runnable runnable){
        //NO podemos inicializar el handler hasta que el thread no esté creado, por eso no va esto en el construtor.
        if (!handlerSetted){
            mHandler = new MyHandler(getLooper()); //El thread ya esta creado con looper, que pasamos al constructor.
            handlerSetted = true;
        }
        mHandler.post(runnable);
    }

    public void Quit(){
        getLooper().quit();
    }

    public Looper GetLooper(){
        return mHandler.getLooper();
    }

    private class MyHandler extends Handler
    {
        private int counter;

        public MyHandler(Looper looper) {
            super(looper);
            counter=0;
        }

        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0) {
                //Comprobamos si está running una anterior.
                SetDoing(true);
                    doLongRunningOperation();
                    counter++;
                    Message uiMessage = mUIHandler.obtainMessage(Globals.WT_DONE, counter, 0);
                    mUIHandler.sendMessage(uiMessage);
                SetDoing(false);
            }
        }
    }

    private void doLongRunningOperation(){
        //Sleeps total i x mDelay = x minute.
        for (int i=0; i<1; i++) {
            sleep();
        }
    }

    private void sleep() {
        try {
            Thread.sleep(mDelay);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
