package com.example.imageloadpk.adapter.watcher;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.Log;
import android.view.View;

import com.facebook.common.internal.Preconditions;


/**
 * Created by Nevermore on 16/7/3.
 */
public class WatchImpl {
    private final Paint mPaint;
    private final Rect mRect;
    private final View mView;
    private WatchListener mWatchListener;
    private long mStartTime;
    private long mFinishTime;
    private String mTag;
    private ImageRequestState mState;

    public WatchImpl(View view) {
        mView = view;
        mPaint = new Paint();
        mRect = new Rect();
        mState = ImageRequestState.INIT;
    }

    public void init(final String tag, final WatchListener watchListener) {
        mTag = Preconditions.checkNotNull(tag);
        mWatchListener = Preconditions.checkNotNull(watchListener);
    }

    public void onStart() {
        Preconditions.checkNotNull(mTag);
        Preconditions.checkNotNull(mWatchListener);
        if (mState == ImageRequestState.STARTED) {
            onCancellation();
        }
        mState = ImageRequestState.STARTED;
        mStartTime = System.currentTimeMillis();
        mFinishTime = 0;
        mWatchListener.reportStart();

    }

    public void onSuccess() {
        Preconditions.checkState(mState == ImageRequestState.STARTED);
        mState = ImageRequestState.SUCCESS;
        mFinishTime = System.currentTimeMillis();
        final long requestTime = mFinishTime - mStartTime;
        mWatchListener.reportSuccess(requestTime);
    }

    public void onFailure() {
        Preconditions.checkState(mState == ImageRequestState.STARTED);
        mState = ImageRequestState.FAILURE;
        mFinishTime = System.currentTimeMillis();
        final long requestTime = mFinishTime - mStartTime;
        mWatchListener.reportFailure(requestTime);
    }

    public void onCancellation() {
        if (mState != ImageRequestState.STARTED) {
            return;
        }
        mState = ImageRequestState.CANCELLTION;
        mFinishTime = System.currentTimeMillis();
        final long requestTime = mFinishTime - mStartTime;
        mWatchListener.reportCancelltion(requestTime);

    }

    public void onDraw(final Canvas canvas) {
        mPaint.setColor(0xcc000000);
        mPaint.setTextSize(20f);
        mRect.set(0, 0, mView.getRight(), 40);
        canvas.drawRect(mRect, mPaint);
        mPaint.setColor(Color.WHITE);
        String msg = "init";
        switch (mState) {
            case STARTED:
                msg = "starting...";
                break;
            case SUCCESS:
                msg = "success:" + (mFinishTime - mStartTime) + "ms";
                break;
            case FAILURE:
                msg = "failure:" + (mFinishTime - mStartTime) + "ms";
                break;
            case CANCELLTION:
                msg = "cancelltion:" + (mFinishTime - mStartTime) + "ms";
                break;
        }
        canvas.drawText(msg + "\t\t" + mTag, 10, 25, mPaint);
    }

    private static enum ImageRequestState {
        INIT,
        STARTED,
        SUCCESS,
        CANCELLTION,
        FAILURE,
    }
}