/**
 *   ownCloud Android client application
 *
 *   Copyright (C) 2011 Bartek Przybylski
 *   Copyright (C) 2015 ownCloud Inc.
 *
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License version 2,
 *   as published by the Free Software Foundation.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
package com.owncloud.android.ui.activity;

import java.util.Arrays;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.owncloud.android.R;
import com.owncloud.android.utils.DisplayUtils;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.view.View.OnKeyListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class PinCodeActivity extends SherlockFragmentActivity {

  
    public final static String EXTRA_ACTIVITY = "com.owncloud.android.ui.activity.PinCodeActivity.ACTIVITY";
    public final static String EXTRA_NEW_STATE = "com.owncloud.android.ui.activity.PinCodeActivity.NEW_STATE";
    
    private Button mBCancel;
    private TextView mPinHdr;
    private TextView mPinHdrExplanation;
    private EditText mText1;
    private EditText mText2;
    private EditText mText3;
    private EditText mText4;
    
    private String [] mTempText ={"","","",""};
    
    private String mActivity;
    
    private boolean mConfirmingPinCode = false;
    private boolean mPinCodeChecked = false;
    private boolean mNewPasswordEntered = false;
    private boolean mBChange = true; // to control that only one blocks jump
    //private int mTCounter ; // Count the number of attempts an user could introduce the PIN code

    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pincodelock); 
        
        Intent intent = getIntent();
        mActivity = intent.getStringExtra(EXTRA_ACTIVITY);
     
        mBCancel = (Button) findViewById(R.id.cancel);
        mPinHdr = (TextView) findViewById(R.id.pinHdr);
        mPinHdrExplanation = (TextView) findViewById(R.id.pinHdrExpl);
        mText1 = (EditText) findViewById(R.id.txt1);
        mText1.requestFocus();
        getWindow().setSoftInputMode(android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
        mText2 = (EditText) findViewById(R.id.txt2);
        mText3 = (EditText) findViewById(R.id.txt3);
        mText4 = (EditText) findViewById(R.id.txt4);
        
        SharedPreferences appPrefs = PreferenceManager
                .getDefaultSharedPreferences(getApplicationContext());
        
 
        // Not PIN Code defined yet.
        // In a previous version settings is allow from start
        if ( (appPrefs.getString("PrefPinCode1", null) == null ) ){
            setChangePincodeView(true);
            mPinCodeChecked = true; 
            mNewPasswordEntered = true;
            
        }else{ 
            
            if (appPrefs.getBoolean("set_pincode", false)){
               // pincode activated
               if (mActivity.equals("preferences")){
                // PIN has been activated yet
                 mPinHdr.setText(R.string.pincode_configure_your_pin);
                 mPinHdrExplanation.setVisibility(View.VISIBLE);
                 mPinCodeChecked = true ; // No need to check it 
                 setChangePincodeView(true);
               }else{
                // PIN active
                 mBCancel.setVisibility(View.INVISIBLE);
                 mBCancel.setVisibility(View.GONE);
                 mPinHdr.setText(R.string.pincode_enter_pin_code);
                 mPinHdrExplanation.setVisibility(View.INVISIBLE);
                 setChangePincodeView(false);
              }
            
           }else {
            // pincode removal
              mPinHdr.setText(R.string.pincode_remove_your_pincode);
              mPinHdrExplanation.setVisibility(View.INVISIBLE);
              mPinCodeChecked = false;
              setChangePincodeView(true); 
           }
           
        }
        setTextListeners();
        
        ActionBar actionBar = getSupportActionBar();
        actionBar.setIcon(DisplayUtils.getSeasonalIconId());
    }
    

     
    protected void setInitVars(){
        mConfirmingPinCode = false;
        mPinCodeChecked = false;
        mNewPasswordEntered = false;

    }
    
    protected void setInitView(){
        mBCancel.setVisibility(View.INVISIBLE);
        mBCancel.setVisibility(View.GONE);
        mPinHdr.setText(R.string.pincode_enter_pin_code);
        mPinHdrExplanation.setVisibility(View.INVISIBLE);
    }
    
   
    protected void setChangePincodeView(boolean state){
       
        if(state){
        mBCancel.setVisibility(View.VISIBLE);
        mBCancel.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            
            SharedPreferences.Editor appPrefsE = PreferenceManager
                    .getDefaultSharedPreferences(getApplicationContext()).edit();
            
            SharedPreferences appPrefs = PreferenceManager
                    .getDefaultSharedPreferences(getApplicationContext());
            
            boolean state = appPrefs.getBoolean("set_pincode", false);
            appPrefsE.putBoolean("set_pincode",!state); 
            appPrefsE.commit();
            setInitVars();
            finish();
            }
        });
        }  
    
    }
    
    
    
    /*
     *  
     */
    protected void setTextListeners(){
    
        /*------------------------------------------------
         *  FIRST BOX
         -------------------------------------------------*/
        
        mText1.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (s.length() > 0) {
                    if (!mConfirmingPinCode){
                       mTempText[0] = mText1.getText().toString();
                       
                    }
                    mText2.requestFocus();
                 }
            }
        });
        
        

        /*------------------------------------------------
         *  SECOND BOX 
         -------------------------------------------------*/
        mText2.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (s.length() > 0) {
                    if (!mConfirmingPinCode){
                        mTempText[1] = mText2.getText().toString();
                    }
                    
                    mText3.requestFocus();
                }
            }
        });
 
        mText2.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {

                    mText1.setText("");
                    mText1.requestFocus();
                    if (!mConfirmingPinCode)
                       mTempText[0] = "";
                    mBChange= false;
                
                }else if(!mBChange){
                    mBChange=true;
                    
                }
                return false;
            }
        });        
 
        mText2.setOnFocusChangeListener(new OnFocusChangeListener() {
               
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                mText2.setCursorVisible(true);
                if (mText1.getText().toString().equals("")){
                    mText2.setSelected(false);
                    mText2.setCursorVisible(false);
                    mText1.requestFocus(); 
                    mText1.setSelected(true);
                    mText1.setSelection(0);
                }
                
            }
        });
        
        
        /*------------------------------------------------
         *  THIRD BOX
         -------------------------------------------------*/
        mText3.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (s.length() > 0) {
                    if (!mConfirmingPinCode){
                        mTempText[2] = mText3.getText().toString();
                    }
                    mText4.requestFocus();
                }
            }
        });
        
        mText3.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
                    mText2.requestFocus();
                    if (!mConfirmingPinCode)
                        mTempText[1] = "";
                    mText2.setText("");
                    mBChange= false;
                    
                }else if(!mBChange){
                    mBChange=true;                        
                    
                }
                return false;
            }
        });
        
        mText3.setOnFocusChangeListener(new OnFocusChangeListener() {
            
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                mText3.setCursorVisible(true);
                if (mText1.getText().toString().equals("")){
                    mText3.setSelected(false);
                    mText3.setCursorVisible(false);
                    mText1.requestFocus();
                    mText1.setSelected(true);
                    mText1.setSelection(0);
                }else if (mText2.getText().toString().equals("")){
                    mText3.setSelected(false);
                    mText3.setCursorVisible(false);
                    mText2.requestFocus();
                    mText2.setSelected(true);
                    mText2.setSelection(0);
                }
                
            }
        });
        
        /*------------------------------------------------
         *  FOURTH BOX
         -------------------------------------------------*/
        mText4.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (s.length() > 0) {
                    
                    if (!mConfirmingPinCode){
                       mTempText[3] = mText4.getText().toString();
                    }
                    mText1.requestFocus();

                    if (!mPinCodeChecked){
                        mPinCodeChecked = checkPincode();
                    }
                    
                    if (mPinCodeChecked && 
                            ( mActivity.equals("FileDisplayActivity") || mActivity.equals("PreviewImageActivity") ) ){
                        finish();
                    } else if (mPinCodeChecked){
                        
                        Intent intent = getIntent();
                        String newState = intent.getStringExtra(EXTRA_NEW_STATE);
                        
                        if (newState.equals("false")){
                            SharedPreferences.Editor appPrefs = PreferenceManager
                                    .getDefaultSharedPreferences(getApplicationContext()).edit();
                            appPrefs.putBoolean("set_pincode",false);
                            appPrefs.commit();
                            
                            setInitVars();
                            pinCodeEnd(false);
                            
                        }else{
                        
                            if (!mConfirmingPinCode){
                                pinCodeChangeRequest();
                             
                            } else {
                                confirmPincode();
                            }
                        }
                   
                        
                    }    
                }
            }
        });

        
        
        mText4.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
                    mText3.requestFocus();
                    if (!mConfirmingPinCode)
                        mTempText[2]="";
                    mText3.setText("");
                    mBChange= false;
                    
                }else if(!mBChange){
                    mBChange=true;    
                }
                return false;
            }
        });
        
       mText4.setOnFocusChangeListener(new OnFocusChangeListener() {
            
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                mText4.setCursorVisible(true);
                
                if (mText1.getText().toString().equals("")){
                    mText4.setSelected(false);
                    mText4.setCursorVisible(false);
                    mText1.requestFocus();
                    mText1.setSelected(true);
                    mText1.setSelection(0);
                }else if (mText2.getText().toString().equals("")){
                    mText4.setSelected(false);
                    mText4.setCursorVisible(false);
                    mText2.requestFocus();
                    mText2.setSelected(true);
                    mText2.setSelection(0);
                }else if (mText3.getText().toString().equals("")){
                    mText4.setSelected(false);
                    mText4.setCursorVisible(false);
                    mText3.requestFocus();
                    mText3.setSelected(true);
                    mText3.setSelection(0);
                }
                
            }
        });
        
        
        
    } // end setTextListener
    
    
    protected void pinCodeChangeRequest(){
    
        clearBoxes(); 
        mPinHdr.setText(R.string.pincode_reenter_your_pincode); 
        mPinHdrExplanation.setVisibility(View.INVISIBLE);        
        mConfirmingPinCode =true;
        
    }
    
    
    protected boolean checkPincode(){
        
        
        SharedPreferences appPrefs = PreferenceManager
                .getDefaultSharedPreferences(getApplicationContext());
        
       String pText1 = appPrefs.getString("PrefPinCode1", null);
        String pText2 = appPrefs.getString("PrefPinCode2", null);
        String pText3 = appPrefs.getString("PrefPinCode3", null);
        String pText4 = appPrefs.getString("PrefPinCode4", null);

        if ( mTempText[0].equals(pText1) && 
             mTempText[1].equals(pText2) &&
             mTempText[2].equals(pText3) &&
             mTempText[3].equals(pText4) ) {
            
            return true;
        
        
        }else {
            Arrays.fill(mTempText, null);
            AlertDialog aDialog = new AlertDialog.Builder(this).create();
            CharSequence errorSeq = getString(R.string.common_error);
            aDialog.setTitle(errorSeq);
            CharSequence cseq = getString(R.string.pincode_wrong);
            aDialog.setMessage(cseq);
            CharSequence okSeq = getString(R.string.common_ok);
            aDialog.setButton(okSeq, new DialogInterface.OnClickListener(){

                @Override
                public void onClick(DialogInterface dialog, int which) {
                   return; 
                }
                
            });
            aDialog.show();
            clearBoxes(); 
            mPinHdr.setText(R.string.pincode_enter_pin_code);
            mPinHdrExplanation.setVisibility(View.INVISIBLE);
            mNewPasswordEntered = true;
            mConfirmingPinCode = false;
            
        }
     
        
        return false;
    }
    
    protected void confirmPincode(){
        
        mConfirmingPinCode = false;
        
        String rText1 = mText1.getText().toString();
        String rText2 = mText2.getText().toString();
        String rText3 = mText3.getText().toString();
        String rText4 = mText4.getText().toString();
        
        if ( mTempText[0].equals(rText1) && 
             mTempText[1].equals(rText2) &&
             mTempText[2].equals(rText3) &&
             mTempText[3].equals(rText4) ) {
                        
            savePincodeAndExit();
            
        } else {
            
            Arrays.fill(mTempText, null);
            AlertDialog aDialog = new AlertDialog.Builder(this).create();
            CharSequence errorSeq = getString(R.string.common_error);
            aDialog.setTitle(errorSeq);
            CharSequence cseq = getString(R.string.pincode_mismatch);
            aDialog.setMessage(cseq);
            CharSequence okSeq = getString(R.string.common_ok);
            aDialog.setButton(okSeq, new DialogInterface.OnClickListener(){

                @Override
                public void onClick(DialogInterface dialog, int which) {
                   return; 
                }
                
            });
            aDialog.show();
            mPinHdr.setText(R.string.pincode_configure_your_pin);
            mPinHdrExplanation.setVisibility(View.VISIBLE);
            clearBoxes();
        }
    
    }
   
    
    protected void pinCodeEnd(boolean state){
        AlertDialog aDialog = new AlertDialog.Builder(this).create();
        
        if (state){
            CharSequence saveSeq = getString(R.string.common_save_exit);
            aDialog.setTitle(saveSeq);
            CharSequence cseq = getString(R.string.pincode_stored);
            aDialog.setMessage(cseq);
            
        }else{
            CharSequence saveSeq = getString(R.string.common_save_exit);
            aDialog.setTitle(saveSeq);
            CharSequence cseq = getString(R.string.pincode_removed);
            aDialog.setMessage(cseq);
            
        }
        CharSequence okSeq = getString(R.string.common_ok);
        aDialog.setButton(okSeq, new DialogInterface.OnClickListener(){

            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
                return; 
            }
            
        });
        aDialog.show(); 
    }
    
    protected void savePincodeAndExit(){
        SharedPreferences.Editor appPrefs = PreferenceManager
                .getDefaultSharedPreferences(getApplicationContext()).edit();
        
        appPrefs.putString("PrefPinCode1", mTempText[0]);
        appPrefs.putString("PrefPinCode2",mTempText[1]);
        appPrefs.putString("PrefPinCode3", mTempText[2]);
        appPrefs.putString("PrefPinCode4", mTempText[3]);
        appPrefs.putBoolean("set_pincode",true);
        appPrefs.commit();
        
        pinCodeEnd(true);
        
        
        
    }
    
    
    protected void clearBoxes(){
        
        mText1.setText("");
        mText2.setText("");
        mText3.setText("");
        mText4.setText("");
        mText1.requestFocus(); 
    }
    
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event){
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount()== 0){
            
            if (mActivity.equals("preferences")){
                SharedPreferences.Editor appPrefsE = PreferenceManager
            
                    .getDefaultSharedPreferences(getApplicationContext()).edit();
            
                SharedPreferences appPrefs = PreferenceManager
                    .getDefaultSharedPreferences(getApplicationContext());
            
                boolean state = appPrefs.getBoolean("set_pincode", false);
                appPrefsE.putBoolean("set_pincode",!state); 
                appPrefsE.commit();
                setInitVars();
                finish();
            }
            return true; 
            
        }
        
        return super.onKeyDown(keyCode, event);
    }
    
   

    
            
}