package org.fox.ttrss;


import java.util.Date;
import java.util.HashMap;

import org.fox.ttrss.types.Article;
import org.fox.ttrss.types.ArticleList;
import org.fox.ttrss.types.Feed;
import org.fox.ttrss.types.FeedCategory;
import org.fox.ttrss.util.AppRater;

import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.util.TypedValue;
import android.view.MenuItem;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;

import com.google.gson.JsonElement;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.readystatesoftware.systembartint.SystemBarTintManager;

public class FeedsActivity extends OnlineActivity implements HeadlinesEventListener {
	private final String TAG = this.getClass().getSimpleName();
	
	private static final int HEADLINES_REQUEST = 1;
	
	protected SharedPreferences m_prefs;
	protected long m_lastRefresh = 0;
	
	private boolean m_actionbarUpEnabled = false;
	private int m_actionbarRevertDepth = 0;
	private SlidingMenu m_slidingMenu;
	private boolean m_feedIsSelected = false;
	private boolean m_feedWasSelected = false;
	
	@SuppressLint("NewApi")
	@Override
	public void onCreate(Bundle savedInstanceState) {
		m_prefs = PreferenceManager
				.getDefaultSharedPreferences(getApplicationContext());

		setAppTheme(m_prefs);
		
		super.onCreate(savedInstanceState);

		setContentView(R.layout.headlines);

		setStatusBarTint();
		
		setSmallScreen(findViewById(R.id.sw600dp_anchor) == null && 
				findViewById(R.id.sw600dp_port_anchor) == null);
				
		GlobalState.getInstance().load(savedInstanceState);
		
		if (isSmallScreen() || findViewById(R.id.sw600dp_port_anchor) != null) {
			m_slidingMenu = new SlidingMenu(this);
			
/*			if (findViewById(R.id.sw600dp_port_anchor) != null) {
				m_slidingMenu.setBehindWidth(getScreenWidthInPixel() * 2/3);
			} */
			
			m_slidingMenu.setMode(SlidingMenu.LEFT);
			m_slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
			m_slidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
			m_slidingMenu.setMenu(R.layout.feeds);
			m_slidingMenu.setSlidingEnabled(true);
			
			m_slidingMenu.setOnClosedListener(new SlidingMenu.OnClosedListener() {
				
				@Override
				public void onClosed() {
					getSupportActionBar().setDisplayHomeAsUpEnabled(true);
					m_actionbarUpEnabled = true;
					m_feedIsSelected = true;
					
					initMenu();
				}
			});
			
			m_slidingMenu.setOnOpenedListener(new SlidingMenu.OnOpenedListener() {
					
				@Override
				public void onOpened() {
					if (m_actionbarRevertDepth == 0) {
						m_actionbarUpEnabled = false;
						getSupportActionBar().setDisplayHomeAsUpEnabled(false);
						refresh(false);
					}
					
					m_feedIsSelected = false;
					initMenu();
				}
			});
		}

		if (savedInstanceState == null) {
			if (m_slidingMenu != null)
				m_slidingMenu.showMenu();

			final Intent i = getIntent();
			boolean shortcutMode = i.getBooleanExtra("shortcut_mode", false);
			
			Log.d(TAG, "is_shortcut_mode: " + shortcutMode);

			if (shortcutMode) {
				LoginRequest lr = new LoginRequest(this, false, new OnLoginFinishedListener() {
					
					@Override
					public void OnLoginSuccess() {
						int feedId = i.getIntExtra("feed_id", 0);
						boolean isCat = i.getBooleanExtra("feed_is_cat", false);
						String feedTitle = i.getStringExtra("feed_title");
						
						Feed tmpFeed = new Feed(feedId, feedTitle, isCat);
						
						onFeedSelected(tmpFeed);
					}
					
					@Override
					public void OnLoginFailed() {
						login();						
					}
				});
				
				HashMap<String, String> map = new HashMap<String, String>() {
					{
						put("op", "login");
						put("user", m_prefs.getString("login", "").trim());
						put("password", m_prefs.getString("password", "").trim());
					}
				};

				lr.execute(map);
			}
			
			//m_pullToRefreshAttacher.setRefreshing(true);

			FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
							
			if (m_prefs.getBoolean("enable_cats", false)) {
				ft.replace(R.id.feeds_fragment, new FeedCategoriesFragment(), FRAG_CATS);				
			} else {
				ft.replace(R.id.feeds_fragment, new FeedsFragment(), FRAG_FEEDS);
			}

			ft.commit();
				
			AppRater.appLaunched(this);
			checkTrial(true);

		} else { // savedInstanceState != null
			m_actionbarUpEnabled = savedInstanceState.getBoolean("actionbarUpEnabled");
			m_actionbarRevertDepth = savedInstanceState.getInt("actionbarRevertDepth");
			m_feedIsSelected = savedInstanceState.getBoolean("feedIsSelected");
			m_feedWasSelected = savedInstanceState.getBoolean("feedWasSelected");

			if (findViewById(R.id.sw600dp_port_anchor) != null && m_feedWasSelected && m_slidingMenu != null) {
				m_slidingMenu.setBehindWidth(getScreenWidthInPixel() * 2/3);
			}
			
			if (m_slidingMenu != null && m_feedIsSelected == false) {
				m_slidingMenu.showMenu();
			} else if (m_slidingMenu != null) {
				m_actionbarUpEnabled = true;
			} else {
				m_actionbarUpEnabled = m_actionbarRevertDepth > 0;
			}

			if (m_actionbarUpEnabled) {
				getSupportActionBar().setDisplayHomeAsUpEnabled(true);
			}

			if (!isSmallScreen()) {
				// temporary hack because FeedsActivity doesn't track whether active feed is open
				LinearLayout container = (LinearLayout) findViewById(R.id.fragment_container);
				
				if (container != null)
					container.setWeightSum(3f);
			}
			
		}
		
		/* if (!isCompatMode() && !isSmallScreen()) {
			((ViewGroup)findViewById(R.id.headlines_fragment)).setLayoutTransition(new LayoutTransition());
			((ViewGroup)findViewById(R.id.feeds_fragment)).setLayoutTransition(new LayoutTransition());
		} */

	}
	
	@Override
	protected void initMenu() {
		super.initMenu();
		
		if (m_menu != null && getSessionId() != null) {
			Fragment ff = getSupportFragmentManager().findFragmentByTag(FRAG_FEEDS);
			Fragment cf = getSupportFragmentManager().findFragmentByTag(FRAG_CATS);
			HeadlinesFragment hf = (HeadlinesFragment)getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES);
			
			if (m_slidingMenu != null) {
				m_menu.setGroupVisible(R.id.menu_group_feeds, m_slidingMenu.isMenuShowing());
				m_menu.setGroupVisible(R.id.menu_group_headlines, hf != null && hf.isAdded() && !m_slidingMenu.isMenuShowing());
			} else {
				m_menu.setGroupVisible(R.id.menu_group_feeds, (ff != null && ff.isAdded()) || (cf != null && cf.isAdded()));
				m_menu.setGroupVisible(R.id.menu_group_headlines, hf != null && hf.isAdded());
				
				m_menu.findItem(R.id.update_headlines).setVisible(false);
			}
			
			m_menu.findItem(R.id.headlines_toggle_sidebar).setVisible(false);
			
			MenuItem item = m_menu.findItem(R.id.show_feeds);

			if (getUnreadOnly()) {
				item.setTitle(R.string.menu_all_feeds);
			} else {
				item.setTitle(R.string.menu_unread_feeds);
			}
		}		
	}
	
	public void onFeedSelected(Feed feed) {
		GlobalState.getInstance().m_loadedArticles.clear();
		//m_pullToRefreshAttacher.setRefreshing(true);

			FragmentTransaction ft = getSupportFragmentManager()
					.beginTransaction();

			ft.replace(R.id.headlines_fragment, new LoadingFragment(), null);
			ft.commit();

			if (!isCompatMode() && !isSmallScreen()) {
				LinearLayout container = (LinearLayout) findViewById(R.id.fragment_container);
				if (container != null) {
					float wSum = container.getWeightSum();
					if (wSum <= 2.0f) {
						ObjectAnimator anim = ObjectAnimator.ofFloat(container, "weightSum", wSum, 3.0f);
						anim.setDuration(200);
						anim.start();
					}
				}
			}

			final Feed fFeed = feed;
			
			new Handler().postDelayed(new Runnable() {
				@Override
				public void run() {
					FragmentTransaction ft = getSupportFragmentManager()
							.beginTransaction();

					HeadlinesFragment hf = new HeadlinesFragment();
					hf.initialize(fFeed);
					ft.replace(R.id.headlines_fragment, hf, FRAG_HEADLINES);
					
					ft.commit();

					m_feedIsSelected = true;
					m_feedWasSelected = true;
					
					if (m_slidingMenu != null) {
						if (findViewById(R.id.sw600dp_port_anchor) != null) {
							m_slidingMenu.setBehindWidth(getScreenWidthInPixel() * 2/3);
						}

						m_slidingMenu.showContent();
						getSupportActionBar().setDisplayHomeAsUpEnabled(true);
						m_actionbarUpEnabled = true;
						
					}
				}
			}, 10);
			

			Date date = new Date();

			if (date.getTime() - m_lastRefresh > 10000) {
				m_lastRefresh = date.getTime();
				refresh(false);
			}
	}
	
	public void onCatSelected(FeedCategory cat, boolean openAsFeed) {
		FeedCategoriesFragment fc = (FeedCategoriesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_CATS);
		
		//m_pullToRefreshAttacher.setRefreshing(true);
		
		if (!openAsFeed) {
			
			if (fc != null) {
				fc.setSelectedCategory(null);
			}

			FragmentTransaction ft = getSupportFragmentManager()
					.beginTransaction();

			FeedsFragment ff = new FeedsFragment();
			ff.initialize(cat);
			ft.replace(R.id.feeds_fragment, ff, FRAG_FEEDS);

			ft.addToBackStack(null);
			ft.commit();
			
			getSupportActionBar().setDisplayHomeAsUpEnabled(true);
			m_actionbarUpEnabled = true;
			m_actionbarRevertDepth = m_actionbarRevertDepth + 1;

		} else {
			
			if (fc != null) {
				fc.setSelectedCategory(cat);
			}

			Feed feed = new Feed(cat.id, cat.title, true);
			onFeedSelected(feed);
		}
	}
	
	public void onCatSelected(FeedCategory cat) {
		onCatSelected(cat, m_prefs.getBoolean("browse_cats_like_feeds", false));		
	}
	
	@Override
	public void onBackPressed() {
		if (m_actionbarRevertDepth > 0) {
			
			if (m_feedIsSelected && m_slidingMenu != null && !m_slidingMenu.isMenuShowing()) {
				m_slidingMenu.showMenu();
			} else {			
				m_actionbarRevertDepth = m_actionbarRevertDepth - 1;
				m_actionbarUpEnabled = m_actionbarRevertDepth > 0;
				getSupportActionBar().setDisplayHomeAsUpEnabled(m_actionbarUpEnabled);
			
				onBackPressed();
			}
		} else if (m_slidingMenu != null && !m_slidingMenu.isMenuShowing()) {
			m_slidingMenu.showMenu();
		} else {
			super.onBackPressed();
		}
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case android.R.id.home:
			if (m_actionbarUpEnabled)
				onBackPressed();
			return true;
		case R.id.show_feeds:
			setUnreadOnly(!getUnreadOnly());
			initMenu();
			refresh();
			return true;
		case R.id.update_feeds:
			//m_pullToRefreshAttacher.setRefreshing(true);
			refresh();
			return true;
		default:
			Log.d(TAG, "onOptionsItemSelected, unhandled id=" + item.getItemId());
			return super.onOptionsItemSelected(item);
		}
	}
	
	@Override
	protected void loginSuccess(boolean refresh) {
		setLoadingStatus(R.string.blank, false);
		//findViewById(R.id.loading_container).setVisibility(View.GONE);
		initMenu();
		
		if (refresh) refresh();
	}
	
	@Override
	public void onSaveInstanceState(Bundle out) {
		super.onSaveInstanceState(out);	
		
		out.putBoolean("actionbarUpEnabled", m_actionbarUpEnabled);
		out.putInt("actionbarRevertDepth", m_actionbarRevertDepth);
		out.putBoolean("feedIsSelected", m_feedIsSelected);
		out.putBoolean("feedWasSelected", m_feedWasSelected);
		
		//if (m_slidingMenu != null )
		//	out.putBoolean("slidingMenuVisible", m_slidingMenu.isMenuShowing());
		
		GlobalState.getInstance().save(out);
	}
	
	@Override
	public void onResume() {
		super.onResume();
		initMenu();
	}

	@Override
	public void onArticleListSelectionChange(ArticleList m_selectedArticles) {
		initMenu();		
	}

	public void openFeedArticles(Feed feed) {
		GlobalState.getInstance().m_loadedArticles.clear();
		
		Intent intent = new Intent(FeedsActivity.this, HeadlinesActivity.class);
		intent.putExtra("feed", feed);
		intent.putExtra("article", (Article)null);
		intent.putExtra("searchQuery", (String)null);
 	   
		startActivityForResult(intent, HEADLINES_REQUEST);
		overridePendingTransition(R.anim.right_slide_in, 0);
	}
	
	public void onArticleSelected(Article article, boolean open) {
		if (article.unread) {
			article.unread = false;
			saveArticleUnread(article);
		}
		
		if (open) {
			HeadlinesFragment hf = (HeadlinesFragment)getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES);

			Intent intent = new Intent(FeedsActivity.this, HeadlinesActivity.class);
			intent.putExtra("feed", hf.getFeed());
			intent.putExtra("article", article);
			intent.putExtra("searchQuery", hf.getSearchQuery());
	 	   
			startActivityForResult(intent, HEADLINES_REQUEST);
			overridePendingTransition(R.anim.right_slide_in, 0);

		} else {
			initMenu();
		}
	}

	@Override
	public void onArticleSelected(Article article) {
		onArticleSelected(article, true);		
	}

	public void catchupFeed(final Feed feed) {
		super.catchupFeed(feed);
		refresh();
	}

	@Override
	public void onHeadlinesLoaded(boolean appended) {
		// TODO Auto-generated method stub
		
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (requestCode == HEADLINES_REQUEST) {
			GlobalState.getInstance().m_activeArticle = null;			
		}		
	}

	public void createFeedShortcut(Feed feed) {
		final Intent shortcutIntent = new Intent(this, FeedsActivity.class);
		shortcutIntent.putExtra("feed_id", feed.id);
		shortcutIntent.putExtra("feed_is_cat", feed.is_cat);
		shortcutIntent.putExtra("feed_title", feed.title);
		shortcutIntent.putExtra("shortcut_mode", true);
		
		Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
		
		intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, feed.title);
		intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
		intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this, R.drawable.icon));  
		intent.putExtra("duplicate", false);
		
		sendBroadcast(intent);
		
		toast(R.string.shortcut_has_been_placed_on_the_home_screen);
	}
	
	public void createCategoryShortcut(FeedCategory cat) {
		createFeedShortcut(new Feed(cat.id, cat.title, true));
	}

	public void unsubscribeFeed(final Feed feed) {
		ApiRequest req = new ApiRequest(getApplicationContext()) {
			protected void onPostExecute(JsonElement result) {
				refresh();
			}
		};

		@SuppressWarnings("serial")
		HashMap<String, String> map = new HashMap<String, String>() {
			{
				put("sid", getSessionId());
				put("op", "unsubscribeFeed");
				put("feed_id", String.valueOf(feed.id));
			}
		};
		
		req.execute(map);

	}
}
