package cn.fanfan.detail.essay;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.Header;
import org.apache.http.client.CookieStore;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import cn.fanfan.common.Config;
import cn.fanfan.main.R;
import cn.fanfan.topic.imageload.ImageDownLoader;
import cn.fanfan.topic.imageload.ImageDownLoader.onImageLoaderListener;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.PersistentCookieStore;
import com.loopj.android.http.RequestParams;
import com.umeng.analytics.MobclickAgent;

import android.app.ActionBar;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemClickListener;

public class EssayCommentActivity extends Activity implements OnItemClickListener,
		OnScrollListener {

	private AsyncHttpClient client;
	private int totalItem;
	private CookieStore myCookieStore;
	private boolean isFirstEnter;
	private int mFirstVisibleItem;
	private int mVisibleItemCount;
	private Dialog aDialog;
	private ListView comlist;
	private ImageDownLoader imageDownLoader;
	private List<EssayCommentModel> comitems;
	private EssayCommentAdapter comAdapter;
	private String id;
	private EditText comment;
	private ImageButton publish;
	private String atuid = null;
	private int voteval = 0;
	private Button zan;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.comment_list);

		ActionBar actionBar = getActionBar();
		actionBar.setIcon(null);
		actionBar.setTitle("�������");
		actionBar.setDisplayUseLogoEnabled(false);
		actionBar.setDisplayHomeAsUpEnabled(true);
		actionBar.show();
		Intent intent = getIntent();
		id = intent.getStringExtra("artid");
		client = new AsyncHttpClient();
		myCookieStore = new PersistentCookieStore(this);
		client.setCookieStore(myCookieStore);
		comment = (EditText) findViewById(R.id.comment);
		publish = (ImageButton) findViewById(R.id.publish);
		publish.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				RequestParams params = new RequestParams();
				params.put("article_id", id);
				params.put("message", comment.getText().toString());
				params.put("at_uid", atuid);
				postcom(params);
				comment.setText("");
				refresh();
			}
		});
		comitems = new ArrayList<EssayCommentModel>();
		imageDownLoader = new ImageDownLoader(this);
		comlist = (ListView) findViewById(R.id.comlist);
		isFirstEnter = true;
		comlist.setOnItemClickListener(this);
		comlist.setOnScrollListener(this);

		Getcom(id);

	}
	public boolean checkKeyboardShowing(){
		comlist.requestFocus();
		InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
		boolean active = imm.isActive(comment);
		imm.hideSoftInputFromWindow(comment.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
		
		comment.clearFocus();
		return active;
	}
	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
		// TODO Auto-generated method stub
		aDialog = new Dialog(this);
		LayoutInflater inflater = LayoutInflater.from(this);
		View view = inflater.inflate(R.layout.dialog, null);
	    zan = (Button) view.findViewById(R.id.zan);
		Button back = (Button) view.findViewById(R.id.backanswer);
		Button cancel = (Button) view.findViewById(R.id.cancel);
		voteval = comitems.get(arg2).getVotevalue();
		zanstatus();
		aDialog.setTitle("ѡ��");
		aDialog.setCanceledOnTouchOutside(true);
		aDialog.setContentView(view);
		zan.setOnClickListener(new Click(arg2));
		back.setOnClickListener(new Click(arg2));
		cancel.setOnClickListener(new Click(arg2));
		aDialog.show();
	}

	class Click implements android.view.View.OnClickListener {
		private int arg2;

		public Click(int arg2) {
			// TODO Auto-generated constructor stub
			this.arg2 = arg2;
		}

		@Override
		public void onClick(View arg0) {
			// TODO Auto-generated method stub
			switch (arg0.getId()) {
			case R.id.zan:
				if (voteval == 1) {
					voteval = 0;
					dozan(comitems.get(arg2).getId(), 0);
				} else {
					voteval = 1;
					dozan(comitems.get(arg2).getId(), 1);
				}
				zanstatus();
				aDialog.hide();
				break;
			case R.id.backanswer:
				atuid = comitems.get(arg2).getUid();
				aDialog.hide();
				break;
			case R.id.cancel:
				aDialog.hide();
				break;
			default:
				break;
			}
		}

	}

	private void zanstatus() {
		if (voteval == 1) {
			zan.setText("������");
		} else {
			zan.setText("��");
		}
	}

	private void dozan(int id, int value) {
		String url = Config.getValue("EssayComment");
		RequestParams params = new RequestParams();
		params.put("type", "comment");
		params.put("item_id", id);
		params.put("rating", value);
		client.post(url, params, new AsyncHttpResponseHandler() {

			@Override
			public void onFailure(int arg0, Header[] arg1, byte[] arg2,
					Throwable arg3) {
				// TODO Auto-generated method stub
				Toast.makeText(EssayCommentActivity.this, "���ʧ��", Toast.LENGTH_LONG).show();
			}

			@Override
			public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
				// TODO Auto-generated method stub
				String info = new String(arg2);
				JSONObject jsonObject = null;
				int errno = 0;
				try {
					jsonObject = new JSONObject(info);
					errno = jsonObject.getInt("errno");
				} catch (JSONException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

				if (errno == 1) {
					Toast.makeText(EssayCommentActivity.this, "����ɹ�", Toast.LENGTH_LONG).show();
					refresh();
				} else {

					try {
						String err = jsonObject.getString("err");
						Toast.makeText(EssayCommentActivity.this, err, Toast.LENGTH_LONG)
								.show();
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}
				
			}

		});
	}

	private void Getcom(String id) {
		String url = "http://w.hihwei.com/?/api/article/comment/?id=" + id;
		client.get(url, new AsyncHttpResponseHandler() {

			@Override
			public void onFailure(int arg0, Header[] arg1, byte[] arg2,
					Throwable arg3) {
				// TODO Auto-generated method stub
               
			}

			@Override
			public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
				// TODO Auto-generated method stub
				String info = new String(arg2);
				JSONObject jsonObject = null;
				JSONObject jsonObject2 = null;
				JSONObject rsm = null;
				int errno = 0;
				int total_rows = 0;
				try {
					jsonObject = new JSONObject(info);
					errno = jsonObject.getInt("errno");
				} catch (JSONException e) {
					// TODO: handle exception
					e.printStackTrace();
				}

				if (errno == 1) {
					try {
						rsm = jsonObject.getJSONObject("rsm");
						total_rows = rsm.getInt("total_rows");
						if (total_rows != 0) {
							JSONArray rows = rsm.getJSONArray("rows");
							for (int i = 0; i < rows.length(); i++) {
								jsonObject2 = rows.getJSONObject(i);
								EssayCommentModel comitemno = new EssayCommentModel();
								comitemno.setUid(jsonObject2.getString("uid"));
								JSONObject user_info = jsonObject2
										.getJSONObject("user_info");
								comitemno.setUsername(user_info
										.getString("user_name"));
								comitemno.setAvatarfile(user_info
										.getString("avatar_file"));
								comitemno.setComcontent(jsonObject2
										.getString("message"));
								comitemno.setAgreecount(jsonObject2
										.getString("votes"));
								comitemno.setVotevalue(jsonObject2
										.getInt("vote_value"));
								comitemno.setId(jsonObject2.getInt("id"));
								if (jsonObject2.getInt("at_uid") != 0) {
									JSONObject atuser = jsonObject2
											.getJSONObject("at_user_info");
									comitemno.setBackname(atuser
											.getString("user_name"));
									comitemno.setBackuid(atuser
											.getString("uid"));
								} else {
									comitemno.setBackname("");
									comitemno.setBackuid("");
								}
								comitems.add(comitemno);
							}
						}
					} catch (JSONException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				} else {
					try {
						String err = jsonObject.getString("err");
						Toast.makeText(EssayCommentActivity.this, err, Toast.LENGTH_LONG)
								.show();
					} catch (JSONException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}
				comAdapter = new EssayCommentAdapter(EssayCommentActivity.this, comitems,
						imageDownLoader);
				comlist.setAdapter(comAdapter);

			}

		});
	}
	private void refresh(){
		comitems.clear();
		checkKeyboardShowing();
		Thread.currentThread();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Getcom(id);
	}

	private void postcom(RequestParams params) {
		String url = "http://w.hihwei.com/?/api/publish/save_comment/";
		client.post(url, params, new AsyncHttpResponseHandler() {

			@Override
			public void onFailure(int arg0, Header[] arg1, byte[] arg2,
					Throwable arg3) {
				// TODO Auto-generated method stub
				Toast.makeText(EssayCommentActivity.this, "���ʧ��", Toast.LENGTH_LONG).show();
			}

			@Override
			public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
				// TODO Auto-generated method stub
				atuid="";
				Toast.makeText(EssayCommentActivity.this, "��۳ɹ�", Toast.LENGTH_LONG).show();
			}

		});
	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// TODO Auto-generated method stub
		if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
			showImage(mFirstVisibleItem, mVisibleItemCount);
		} else {
			cancleTask();
		}
	}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub
		mFirstVisibleItem = firstVisibleItem;
		mVisibleItemCount = visibleItemCount;
		totalItem = totalItemCount;
		// ��������Ϊ�״ν����������������
		if (isFirstEnter && visibleItemCount > 0) {
			showImage(mFirstVisibleItem, mVisibleItemCount);
			isFirstEnter = false;
		}
	}

	private void showImage(int firstVisibleItem, int visibleItemCount) {
		// ע��firstVisibleItem + visibleItemCount-1 = 20 1���а�����footview����һ��ҪС�ģ�
		for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++) {
			String mImageUrl = comitems.get(i).getAvatarfile();
			if (!mImageUrl.equals("")) {
				mImageUrl = Config.getValue("userImageBaseUrl") + mImageUrl;
				final ImageView mImageView = (ImageView) comlist
						.findViewWithTag(mImageUrl);
				imageDownLoader.getBitmap(mImageUrl,
						new onImageLoaderListener() {

							public void onImageLoader(Bitmap bitmap, String url) {
								if (mImageView != null && bitmap != null) {
									mImageView.setImageBitmap(bitmap);
								}
							}
						});
			} else {
				continue;
			}
		}
	}

	public boolean onOptionsItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		switch (item.getItemId()) {
		case android.R.id.home:
			finish();
			break;

		default:
			break;
		}
		return super.onOptionsItemSelected(item);
	}

	public void cancleTask() {
		imageDownLoader.cacelTask();
	}
	public void onResume() {
		super.onResume();
		MobclickAgent.onResume(this);
		}
		public void onPause() {
		super.onPause();
		MobclickAgent.onPause(this);
		}
}