/******************************************************************************
 *
 *  Copyright 2014 Paphus Solutions Inc.
 *
 *  Licensed under the Eclipse Public License, Version 1.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.eclipse.org/legal/epl-v10.html
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

package org.botlibre.sdk.activity;

import org.botlibre.sdk.activity.MainActivity.LaunchType;
import org.botlibre.sdk.activity.actions.HttpAction;
import org.botlibre.sdk.activity.actions.HttpFetchUserAction;
import org.botlibre.sdk.activity.actions.HttpFlagAction;
import org.botlibre.sdk.activity.actions.HttpGetImageAction;
import org.botlibre.sdk.activity.actions.HttpStarAction;
import org.botlibre.sdk.activity.actions.HttpThumbsDownAction;
import org.botlibre.sdk.activity.actions.HttpThumbsUpAction;
import org.botlibre.sdk.config.UserConfig;
import org.botlibre.sdk.config.WebMediumConfig;
import org.botlibre.sdk.util.Utils;

import org.botlibre.offline.pizzabot.R;

import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;

/**
 * Generic activity for viewing a content's details.
 */
@SuppressLint("DefaultLocale")
public abstract class WebMediumActivity extends LibreActivity {
	protected WebMediumConfig instance;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		this.instance = MainActivity.instance;
        super.onCreate(savedInstanceState); 
		resetView();
	}
	
	@Override
	public void onResume() {
		if (MainActivity.instance != null && MainActivity.instance.id.equals(this.instance.id)) {
			this.instance = MainActivity.instance;
		} else {
			MainActivity.instance = this.instance;
		}
		resetView();
		super.onResume();
	}
	
	@Override
	public void onPostResume() {
		super.onPostResume();
		
		if (MainActivity.wasDelete) {
			MainActivity.wasDelete = false;
			finish();
		}
	}
	
	@Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.menu_webmedium, menu);
        return true;
    }
	
	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
        boolean isAdmin = (MainActivity.user != null) && this.instance.isAdmin;
        if (!isAdmin || this.instance.isExternal) {
        	menu.findItem(R.id.menuAdmin).setEnabled(false);
        }
        if (isAdmin || this.instance.isFlagged) {
        	menu.findItem(R.id.menuFlag).setEnabled(false);
        }
	    return true;
	}
	
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId())
        {        
	    case R.id.menuAdmin:
	    	admin();
	        return true;        
        case R.id.menuFlag:
        	flag();
            return true;
        case R.id.menuCreator:
        	viewCreator();
            return true;
        case R.id.menuStar:
        	star();
            return true;
        case R.id.menuThumbsUp:
        	thumbsUp();
            return true;
        case R.id.menuThumbsDown:
        	thumbsDown();
            return true;
        case R.id.website:
        	openWebsite();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

	public void resetView() {
		if (this.instance == null) {
			return;
		}
		((TextView) findViewById(R.id.title)).setText(this.instance.name);
        HttpGetImageAction.fetchImage(this, this.instance.avatar, findViewById(R.id.icon));
        
        if (!this.instance.isFlagged) {
	        findViewById(R.id.flaggedLabel).setVisibility(View.GONE);
        } else {
	        findViewById(R.id.imageView).setVisibility(View.GONE);        	
        }
        TextView textView = (TextView) findViewById(R.id.nameLabel);
        textView.setText(Utils.stripTags(this.instance.name));
        boolean isAdmin = (MainActivity.user != null) && this.instance.isAdmin;
        if (isAdmin) {
        	findViewById(R.id.adminButton).setVisibility(View.VISIBLE);
        } else {
        	findViewById(R.id.adminButton).setVisibility(View.GONE);
        }
        if (this.instance.isExternal) {
        	findViewById(R.id.adminButton).setVisibility(View.GONE);
        }
        if (!isAdmin && MainActivity.launchType != LaunchType.Browse) {
        	findViewById(R.id.menuButton).setVisibility(View.GONE);
        }
        
        textView = (TextView) findViewById(R.id.websiteLabel);
        if (this.instance.website == null || this.instance.website.isEmpty()) {
        	textView.setVisibility(View.GONE);
        } else {
            textView.setText(this.instance.website);
        }
        
        textView = (TextView) findViewById(R.id.subdomainLabel);
        if (this.instance.subdomain == null || this.instance.subdomain.isEmpty()) {
        	textView.setVisibility(View.GONE);
        } else {
        	String subdomain = "";
        	if (this.instance.subdomain.contains(".")) {
        		subdomain = "http://" + this.instance.subdomain;
        	} else {
        		subdomain = "http://" + this.instance.subdomain + "." + MainActivity.SERVER;
        	}
        	if (subdomain.equals(this.instance.website)) {
            	textView.setVisibility(View.GONE);
        	} else {
        		textView.setText(subdomain);
        	}
        }
        
        WebView web = (WebView) findViewById(R.id.descriptionLabel);
        web.loadDataWithBaseURL(null, Utils.formatHTMLOutput(this.instance.description), "text/html", "utf-8", null);        
        web.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
            	try {
            		view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            	} catch (Exception failed) {
            		return false;
            	}
                return true;
            }
        });
        web = (WebView) findViewById(R.id.detailsLabel);
        WebSettings webSettings = web.getSettings();
        webSettings.setDefaultFontSize(10);
        web.loadDataWithBaseURL(null, Utils.formatHTMLOutput(this.instance.details), "text/html", "utf-8", null);        
        web.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
            	try {
            		view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            	} catch (Exception failed) {
            		return false;
            	}
                return true;
            }
        });
        web = (WebView) findViewById(R.id.disclaimerLabel);
        webSettings = web.getSettings();
        webSettings.setDefaultFontSize(10);
        web.loadDataWithBaseURL(null, Utils.formatHTMLOutput(this.instance.disclaimer), "text/html", "utf-8", null);        
        web.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
            	try {
            		view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            	} catch (Exception failed) {
            		return false;
            	}
                return true;
            }
        });
        textView = (TextView) findViewById(R.id.categoriesLabel);
        if (textView != null) {
        	textView.setText(this.instance.categories);
        }
        textView = (TextView) findViewById(R.id.tagsLabel);
        if (this.instance.tags == null || this.instance.tags.isEmpty()) {
        	textView.setVisibility(View.GONE);
        } else {
            textView.setText(this.instance.tags);
        }
        
        textView = (TextView) findViewById(R.id.licenseLabel);
        if (this.instance.license == null || this.instance.license.isEmpty()) {
        	textView.setVisibility(View.GONE);
        } else {
            textView.setText(this.instance.license);
        }
        
        textView = (TextView) findViewById(R.id.thumbsupLabel);
        textView.setText(String.valueOf(this.instance.thumbsUp));
        textView = (TextView) findViewById(R.id.thumbsdownLabel);
        textView.setText(String.valueOf(this.instance.thumbsDown));
        textView = (TextView) findViewById(R.id.starsLabel);
        textView.setText(String.valueOf(this.instance.stars));

        textView = (TextView) findViewById(R.id.connectsLabel);
        if (this.instance.connects != null && this.instance.connects.length() > 0) {
        	textView.setText(this.instance.connects + " conects, " + this.instance.dailyConnects + " today, " + this.instance.weeklyConnects + " week, " + this.instance.monthlyConnects + " month");
        } else {
        	textView.setText("");
        }

        textView = (TextView) findViewById(R.id.creatorLabel);
        textView.setText("by " + this.instance.creator + ", " + this.instance.displayCreationDate());
        
        findViewById(R.id.imageView).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				ImageActivity.image = instance.avatar;
		        Intent intent = new Intent(WebMediumActivity.this, ImageActivity.class);
		        startActivity(intent);
			}
		});
        
        HttpGetImageAction.fetchImage(this, this.instance.avatar, (ImageView)findViewById(R.id.imageView));
	}

	public abstract String getType();

	public void viewCreator() {
		UserConfig config = new UserConfig();
		config.user = this.instance.creator;

        HttpAction action = new HttpFetchUserAction(this, config);
    	action.execute();
	}
	
	/**
	 * Flag the instance.
	 */
	@SuppressLint("DefaultLocale")
	public void flag() {
        if (MainActivity.user == null) {
        	MainActivity.showMessage("You must sign in to flag a " + getType().toLowerCase(), this);
        	return;
        }
        final EditText text = new EditText(this);
        MainActivity.prompt("Enter reason for flagging the " + getType().toLowerCase() + " as offensive", this, text, new DialogInterface.OnClickListener() {
	        public void onClick(DialogInterface dialog, int whichButton) {
	            WebMediumConfig instance = WebMediumActivity.this.instance.credentials();
	            instance.flaggedReason = text.getText().toString();
	            if (instance.flaggedReason.trim().length() == 0) {
	            	MainActivity.error("You must enter a valid reason for flagging the " + getType().toLowerCase(), null, WebMediumActivity.this);
	            	return;
	            }
	            
	            HttpFlagAction action = new HttpFlagAction(WebMediumActivity.this, instance);
	        	action.execute();
	        }
        });
	}
	
	public void thumbsUp(View view) {
		thumbsUp();
	}
	
	public void thumbsUp() {
        if (MainActivity.user == null) {
        	MainActivity.showMessage("You must sign in to thumbs up a " + getType().toLowerCase(), this);
        	return;
        }
        HttpThumbsUpAction action = new HttpThumbsUpAction(this, this.instance.credentials());
    	action.execute();
	}
	
	public void thumbsDown(View view) {
		thumbsDown();
	}
	
	public void thumbsDown() {
        if (MainActivity.user == null) {
        	MainActivity.showMessage("You must sign in to thumbs down a " + getType().toLowerCase(), this);
        	return;
        }
        HttpThumbsDownAction action = new HttpThumbsDownAction(this, this.instance.credentials());
    	action.execute();
	}
	
	public void openWebsite() {
		Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(MainActivity.WEBSITE + "/browse?id=" + this.instance.id));
		startActivity(intent);
	}

	public void star(View view) {
		star();
	}
	
	public void star() {
        if (MainActivity.user == null) {
        	MainActivity.showMessage("You must sign in to rate a " + getType().toLowerCase(), this);
        	return;
        }
        
        final Dialog dialog = new Dialog(this);
		dialog.setContentView(R.layout.dialog_stars);
		dialog.setTitle("Rate " + getType());
		final int[] stars = new int[1];
		stars[0] = 0;
		dialog.findViewById(R.id.oneStar).setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				dialog.dismiss();
				star(1);
			}
		});
		dialog.findViewById(R.id.twoStar).setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				dialog.dismiss();
				star(2);
			}
		});
		dialog.findViewById(R.id.threeStar).setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				dialog.dismiss();
				star(3);
			}
		});
		dialog.findViewById(R.id.fourStar).setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				dialog.dismiss();
				star(4);
			}
		});
		dialog.findViewById(R.id.fiveStar).setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				dialog.dismiss();
				star(5);
			}
		});

		dialog.show();
	}

	public void star(int stars) {
		if (stars == 0) {
			return;
		}
		
        WebMediumConfig config = this.instance.credentials();
        config.stars = String.valueOf(stars);
        HttpStarAction action = new HttpStarAction(this, config);
    	action.execute();
	}
	
	public void admin(View view) {
		admin();
	}
	
	public abstract void admin();

	public void menu(View view) {
		PopupMenu popup = new PopupMenu(this, view);
	    MenuInflater inflater = popup.getMenuInflater();
	    inflater.inflate(R.menu.menu_webmedium, popup.getMenu());
	    onPrepareOptionsMenu(popup.getMenu());
	    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
	        @Override
	        public boolean onMenuItemClick(MenuItem item) {
	            return onOptionsItemSelected(item);
	        }
	    });
	    popup.show();
	}
	
}