package andraus.bluetoothhidemu;

import andraus.bluetoothhidemu.sock.SocketManager;
import andraus.bluetoothhidemu.sock.payload.HidPointerPayload;
import andraus.bluetoothhidemu.util.DoLog;
import andraus.bluetoothhidemu.view.ViewUtils;
import android.content.Context;
import android.graphics.LightingColorFilter;
import android.os.Vibrator;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.widget.ImageView;

/**
 * 
 */
public class ButtonClickListener implements OnClickListener, OnLongClickListener {
    
    private static final String TAG = BluetoothHidEmuActivity.TAG;
    
    private SocketManager mSocketManager = null;
    
    private HidPointerPayload mHidPayload = null;
    
    private Vibrator mVibrator;
    
    private int mButton = HidPointerPayload.MOUSE_BUTTON_NONE;
    private boolean mIsLockable = true;
    
    private boolean mIsButtonLocked = false;

    /**
     * 
     * @param context
     * @param socketManager
     * @param button
     * @param isLockable
     */
    public ButtonClickListener(Context context, SocketManager socketManager, int button, boolean isLockable, HidPointerPayload hidPayload) {
        super();

        mSocketManager = socketManager;
        mHidPayload = hidPayload;
        mButton = button;
        mIsLockable = isLockable;
        
        mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
        
    }
    

    /**
     * 
     */
    @Override
    public void onClick(View view) {
        drawButton(view,  false);
        
        view.startAnimation(ViewUtils.getClickAnimation());
        if (mVibrator != null) {
            mVibrator.vibrate(Constants.CLICK_VIBRATE_MS);
        }
        
        if (!mIsButtonLocked) {
            mHidPayload.movePointer(0, 0);
            mHidPayload.clickButton(mButton);
            mSocketManager.sendPayload(mHidPayload);
        } else {
            mIsButtonLocked = false;
        }
        mHidPayload.movePointer(0, 0);
        mHidPayload.releaseButton(mButton);
        mSocketManager.sendPayload(mHidPayload);

    }

    /**
     * 
     */
    @Override
    public boolean onLongClick(View view) {
        
        if (mIsLockable) {
            if (mIsButtonLocked) {
                onClick(view);
            } else {
                drawButton(view, true);
                mIsButtonLocked = true;
                DoLog.d(TAG, "set button locked to " + mIsButtonLocked);
                mHidPayload.movePointer(0, 0);
                mHidPayload.clickButton(mButton);
                mSocketManager.sendPayload(mHidPayload);
            }
        } else {
            onClick(view);
        }
        
        return true;
    }

    /**
     * Set properties for the button to be drawn as normal or "on hold".
     * @param view
     * @param isHold
     */
    private void drawButton(View view, boolean isHold) {
        ImageView imgView = (ImageView) view;
        if (isHold) {
            imgView.setColorFilter(new LightingColorFilter(0xff4a6c9b, 0xff000055));
        } else {
            imgView.clearColorFilter();
        }
    }

}