package dacer.google.task;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import android.accounts.AccountManager;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.dacer.simplepomodoro.FinishScreenActivity;
import com.dacer.simplepomodoro.R;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.tasks.TasksScopes;

import dacer.interfaces.DialogDismissListener;
import dacer.service.CDService;
import dacer.settinghelper.SettingUtility;
import dacer.utils.GlobalContext;
import dacer.utils.MyUtils;
import eu.erikw.PullToRefreshListView;
import eu.erikw.PullToRefreshListView.OnRefreshListener;
/**
 * Author:dacer
 * Date  :Sep 10, 2013
 */
public class TaskListFragment extends Fragment implements DialogDismissListener{
	private static final String KEY_CONTENT = "MainFragment:Content";
	private String mContent = "???";
	View rootView;
	//Google Task
	private static final Level LOGGING_LEVEL = Level.OFF;
	static final String TAG = "TaskListFragment";
	static final int REQUEST_GOOGLE_PLAY_SERVICES = 0;
	static final int REQUEST_AUTHORIZATION = 1;
	static final int REQUEST_ACCOUNT_PICKER = 2;
	final HttpTransport transport = AndroidHttp.newCompatibleTransport();
	final JsonFactory jsonFactory = new GsonFactory();
	GoogleAccountCredential credential;
	List<String> tasksList;
	com.google.api.services.tasks.Tasks service;
	int numAsyncTasks;
	PullToRefreshListView listView;
	ArrayList<String> mTitles;
    ArrayList<Integer> mIds;
    private Cursor cr;
	  
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if ((savedInstanceState != null) && savedInstanceState.containsKey(KEY_CONTENT)) {
            mContent = savedInstanceState.getString(KEY_CONTENT);
        }
    }
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		rootView = inflater.inflate(R.layout.fragment_task, container,
				false);
//		SettingUtility.removeAD(true);
		if(SettingUtility.isFirstStart()){
			TaskUtils.initLocalList(getActivity());
			if(MyUtils.isMiPhone()){
				showXiaoMiAlertDialog();
			}
		}
		initView();
		refreshView();
		if(SettingUtility.enableGTask()){
			initGoogleTask();	
		}return rootView;
	}

	
	private void initView(){
		TextView tv_title = (TextView)rootView.findViewById(R.id.tv_title_task);
		ImageButton addTaskBTN = (ImageButton)rootView.findViewById(R.id.btn_add_task);
		listView = (PullToRefreshListView) rootView.findViewById(R.id.list_task);
		listView.setOnRefreshListener(new OnRefreshListener() {

		    @Override
		    public void onRefresh() {
		    	if(SettingUtility.enableGTask()){
			        syncTask();
		    	}else{
		    		Toast.makeText(getActivity(), 
		    				getActivity().getString(
		    						R.string.Sync_with_google_task_is_not_enabled),
		    				Toast.LENGTH_LONG).show();
		    		listView.onRefreshComplete();
		    	}
		    }
		});
		
		Typeface roboto = Typeface.createFromAsset(getActivity()
				.getAssets(), "fonts/Roboto-Thin.ttf");
//		tv_record.setText(Html.fromHtml("<u>"+"To be continued"+"</u>"));
		tv_title.setTypeface(roboto);
		tv_title.setText("Task");
        Boolean isLightTheme = SettingUtility.isLightTheme();
        if(isLightTheme){
    		tv_title.setTextColor(Color.BLACK);
    		rootView.setBackgroundColor(Color.WHITE);
    		
    		addTaskBTN.setBackgroundColor(Color.argb(1, 0, 0, 0));
    		addTaskBTN.setImageResource(R.drawable.new_btn_gray);
        }
        addTaskBTN.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				TaskDialogFragment dialog = new TaskDialogFragment();
				dialog.initDialog(TaskListFragment.this);
				dialog.show(getFragmentManager(), "");
			}
		});
        	addTaskBTN.setOnLongClickListener(new OnLongClickListener() {
    			
    			@Override
    			public boolean onLongClick(View arg0) {
    				// TODO Auto-generated method stub

    		        if(SettingUtility.enableGTask()){
    		        	chooseAccount();}
    		        else{
    		        	Toast.makeText(getActivity(), 
    		    				getActivity().getString(
    		    						R.string.Sync_with_google_task_is_not_enabled),
    		    				Toast.LENGTH_LONG).show();
    				}
    				return true;
    			}
    		});
        
        
        
        SwipeDismissListViewTouchListener touchListener =
                new SwipeDismissListViewTouchListener(
                        listView,
                        new SwipeDismissListViewTouchListener.OnDismissCallback() {
                            @Override
                            public void onDismiss(ListView listView, int[] reverseSortedPositions) {
                                for (int position : reverseSortedPositions) {
//                                    mAdapter.remove(mAdapter.getItem(position));
                                	new TaskLocalUtils(GlobalContext.getInstance()).
                                	setCompletedByID(mIds.get(position-1),true);//position begin with 1,ArrayList begin with 0!
                                	
                                }
//                                mAdapter.notifyDataSetChanged();
                                refreshView();//Temporary solution for mAdapter do not have remove void 
                                			//delete the tasks in cursor && adapter to replace it.
                            }
                        });
        listView.setOnTouchListener(touchListener);
        listView.setOnScrollListener(touchListener.makeScrollListener());
        listView.setOnItemLongClickListener (new OnItemLongClickListener() {
        	  public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
        		TaskDialogFragment dialog = new TaskDialogFragment();
  				dialog.initDialog(TaskListFragment.this);
  				dialog.setIsEditing(mIds.get(position), mTitles.get(position));
  				dialog.show(getFragmentManager(), "");
				return false;
        	  }
        });
	}

	private void initGoogleTask(){
		Logger.getLogger("com.google.api.client").setLevel(LOGGING_LEVEL);
		credential =
		        GoogleAccountCredential.usingOAuth2(getActivity(), Collections.singleton(TasksScopes.TASKS));
		credential.setSelectedAccountName(SettingUtility.getAccountName());
		// Tasks client
		service =
		        new com.google.api.services.tasks.Tasks.Builder(transport, jsonFactory, credential)
		            .setApplicationName("SimplePomodoro").build();
		checkGooglePlayServicesAvailable();
//		}
	}
	
	  void refreshView() {
		TaskLocalUtils tLocalUtils = new TaskLocalUtils(GlobalContext.getInstance());
	    cr = tLocalUtils.getAllCursorInMainList();
	    mTitles = getAllTitlesOfCurosr(cr);
	    mIds = getAllIdFromCursor(cr);
//	    final TaskListCursorAdapter mAdapter = new TaskListCursorAdapter(getActivity(), R.layout.my_task_list, 
//					cr,
//					new String[] { TaskRecorder.KEY_TITLE },
//					new int[] { R.id.tvLarger }, 2, getFragmentManager(), this);
	    final SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(getActivity(), 
	    		R.layout.my_task_list, cr, new String[] { TaskRecorder.KEY_TITLE },
	    		new int[] { R.id.tvLarger });
		listView.setAdapter(mAdapter);
		
		
	  }

	  @Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
	    super.onActivityResult(requestCode, resultCode, data);
	    switch (requestCode) {
	      case REQUEST_GOOGLE_PLAY_SERVICES:
	        if (resultCode == Activity.RESULT_OK) {
	          syncTask();
	        } else {
	          checkGooglePlayServicesAvailable();
	        }
	        break;
	      case REQUEST_AUTHORIZATION:
	        if (resultCode == Activity.RESULT_OK) {
	          FragmentAsyncTask.run(this);
	        } else {
	          chooseAccount();
	        }
	        break;
	      case REQUEST_ACCOUNT_PICKER:
	        if (resultCode == Activity.RESULT_OK && data != null && data.getExtras() != null) {
	          String accountName = data.getExtras().getString(AccountManager.KEY_ACCOUNT_NAME);
	          if (accountName != null) {
	            credential.setSelectedAccountName(accountName);
	            SettingUtility.setAccountName(accountName);
	            FragmentAsyncTask.run(this);
	          }
	        }
	        break;
	    }
	  }
	  
	  
		
		void showGooglePlayServicesAvailabilityErrorDialog(final int connectionStatusCode) {
		    getActivity().runOnUiThread(new Runnable() {
		      public void run() {
		        Dialog dialog =
		            GooglePlayServicesUtil.getErrorDialog(connectionStatusCode, getActivity(),
		                REQUEST_GOOGLE_PLAY_SERVICES);
		        dialog.show();
		      }
		    });
		  }
		
	  /** Check that Google Play services APK is installed and up to date. */
	  private boolean checkGooglePlayServicesAvailable() {
//	    final int connectionStatusCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity());
//	    if (GooglePlayServicesUtil.isUserRecoverableError(connectionStatusCode)) {
//	      showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode);
//	      return false;
//	    }
	 // Check status of Google Play Services
	    int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity());

	    // Check Google Play Service Available
	    try {
	        if (status != ConnectionResult.SUCCESS) {
	            GooglePlayServicesUtil.getErrorDialog(status, getActivity(), status).show();
	        }
	    } catch (Exception e) {
	        Log.e("Error: GooglePlayServiceUtil: ", "" + e);
	    }
	    return true;
	  }

	  private void syncTask() {
	    // check if there is already an account selected
	    if (credential.getSelectedAccountName() == null) {
	      chooseAccount();
	    } else {
	    	FragmentAsyncTask.run(this);
	    }
	  }

	  private void chooseAccount() {
	    startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
	  }
	  
	  
	@Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString(KEY_CONTENT, mContent);
    }
	@Override
	public void OnDialogDismiss() {
		// TODO Auto-generated method stub
		refreshView();
		
	}

	private ArrayList<Integer> getAllIdFromCursor(Cursor cursor){
		int idIndex = cursor.getColumnIndex(TaskRecorder.KEY_ID);
		ArrayList<Integer> mPosition_id = new ArrayList<Integer>();
		for (cursor.moveToFirst(); !(cursor.isAfterLast()); cursor.moveToNext()) {
			int tempInt = cursor.getInt(idIndex);
			Integer integer = tempInt;
			mPosition_id.add(integer);
		}
		return mPosition_id;
	}
	
	 private ArrayList<String> getAllTitlesOfCurosr(Cursor cursor) {
		int idIndex = cursor.getColumnIndex(TaskRecorder.KEY_TITLE);
		ArrayList<String> mPosition_id = new ArrayList<String>();
		for (cursor.moveToFirst(); !(cursor.isAfterLast()); cursor.moveToNext()) {
			String temp = cursor.getString(idIndex);
			mPosition_id.add(temp);
		}
		return mPosition_id;
	}
	
	 private void showXiaoMiAlertDialog(){
		 	SettingUtility.setXiaoMiMode(true);
			AlertDialog d = new AlertDialog.Builder(getActivity())
	        .setTitle(getActivity().getString(R.string.detect_is_miphone))
	        .setMessage(getActivity().getString(R.string.miphone_message))
	        .setPositiveButton(R.string.ok, new android.content.DialogInterface.OnClickListener() {
				
				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
					
					
				}
			})
	      	.create();
			d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
			d.show();
		}
	 @Override
		public void onDestroy(){
			super.onDestroy();
			cr.close();
		}
		
}