package silent.kuasapmaterial.fragment;

import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.provider.CalendarContract;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.google.android.gms.analytics.HitBuilders;
import com.kuas.ap.donate.R;

import org.json.JSONArray;
import org.json.JSONException;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import silent.kuasapmaterial.base.SilentFragment;
import silent.kuasapmaterial.libs.PinnedSectionListView;

public class ScheduleFragment extends SilentFragment implements AdapterView.OnItemClickListener {

	private View view;
	private PinnedSectionListView mListView;
	private SwipeRefreshLayout mSwipeRefreshLayout;

	List<String> mList;
	Activity activity;

	private int mInitListPos = 0, mInitListOffset = 0;

	String mScheduleData = "[{\"week\":\"寒\",\"events\":[\"(2/1) 104學年度第2學期開始日\",\"(2/1 ~ 2/5) " +
			"104學年度第1學期學業成績優良排名表送生輔組協查有無記過紀錄\",\"(2/2 ~ 2/4) 寄發104學年度第1學期學生成績單\",\"(2/3) " +
			"核發104學年度寒畢畢業證書\",\"(2/8 ~ 2/10) 春節放假\",\"(2/11) 補假一天(補2/7農曆除夕)\",\"(2/12) " +
			"調整放假\"]},{\"week\":\"預備週\",\"events\":[\"(2/15 ~ 2/19) " +
			"第1次公告104學年度第1學期學業成績優良名單\",\"(2/19) 研究生辦理104學年度第1學期離校手續截止日\",\"(2/19) " +
			"註冊繳費截止日\"]},{\"week\":\"第一週\",\"events\":[\"(2/22) 日間部、進修推廣處開學(上午正式上課)\",\"" +
			"(2/22) 網路公布104學年度第2學期加退選日程及相關辦法\",\"(2/22) 轉學生學分抵免申請開始\",\"(2/22) " +
			"輔系、雙主修申請開始\",\"(2/22) 校際選課申請開始\",\"(2/22) 研究生自完成註冊手續後開始辦理學位考試申請\",\"(2/22 ~ " +
			"2/26) 第2次公告104學年度第1學期學業成績優良名單\",\"(2/26 ~ 3/4) " +
			"通知104學年度第1學期學業成績優良學生至學校網站登載銀行帳號(限郵局及台灣企銀)\"]},{\"week\":\"第二週\"," +
			"\"events\":[\"(2/29) 補假一天(補2/28和平紀念日)\",\"(3/1) 校際選課截止日\",\"(3/1 ~ 3/8) " +
			"日間部學生加退選課申請作業(選課時間另行公布)\",\"(3/2) 輔系、雙主修申請截止日\",\"(3/4) 轉學生學分抵免申請截止日\"]}," +
			"{\"week\":\"第三週\",\"events\":[\"(3/9) 104學年度第2學期人工加掛選課申請截止日\"]}," +
			"{\"week\":\"第四週\",\"events\":[\"(3/14) 加退選結束教師自行列印點名單及成績冊(web)\",\"(3/16) " +
			"104學年度第2學期第1次教務會議\"]},{\"week\":\"第五週\",\"events\":[\"(3/24 ~ 3/30) " +
			"學生加退選課繳費\"]},{\"week\":\"第六週\",\"events\":[\"(3/28 ~ 4/1) " +
			"核算104學年度第2學期教師鐘點費\",\"(3/28 ~ 4/7) 教師上網登錄期中考考試時間\",\"(4/1) 學生逕修讀博士學位開始申請\"," +
			"\"(4/1) 學生辦理休、退學學雜費退 2/3 截止日\"]},{\"week\":\"第七週\",\"events\":[\"(4/4) " +
			"民族掃墓節放假一天\",\"(4/5) 補假一天(補4/3兒童節)\",\"(4/7 ~ 4/13) 104學年度暑修意願網路調查\"]}," +
			"{\"week\":\"第八週\",\"events\":[\"(4/11 ~ 4/23) 上網公布期中考考試時間、開放同學查詢\",\"(4/15) " +
			"學生逕修讀博士學位申請截止日\",\"(4/15) 教師期中考試卷申印製卷截止日\"]},{\"week\":\"第九週\"," +
			"\"events\":[\"(4/18 ~ 4/23) 日間部、進修推廣處期中考試\"]},{\"week\":\"第十週\"," +
			"\"events\":[\"(4/25) 104學年度第2學期停修課程開始申請\",\"(4/25) 登錄教師研究計畫案及義務授課減授時數\",\"" +
			"(4/25) 開放學生上網查詢期中成績暨期中預警科目\",\"(4/26) 公告104學年度暑修初步課表\",\"(4/30) " +
			"104學年度第2學期研究生學位考試申請期限截止日\",\"(4/30 ~ 5/1) 105學年度四技統一入學測驗考試\"]}," +
			"{\"week\":\"第十一週\",\"events\":[\"(5/1) 105學年度二技統一入學測驗考試\",\"(5/1) 日間部大學部學生轉系" +
			"(組)開始申請\",\"(5/2 ~ 5/6) 104學年度暑修網路選課\",\"(5/4) 教師登錄期中成績暨預警作業截止日\",\"(5/6 ~ " +
			"5/9) 發放期中預警學生名單予各系、班級導師、任課老師\"]},{\"week\":\"第十二週\",\"events\":[\"(5/9 ~ " +
			"5/29) 導師填報期中預警輔導紀錄表(web)\",\"(5/13) 學生辦理休、退學學雜費退 1/3 截止日\"]}," +
			"{\"week\":\"第十三週\",\"events\":[\"(5/15) 104學年度第2學期停修課程申請截止日\",\"(5/15) " +
			"日間部大學部學生轉系(組)申請期限截止日\",\"(5/16 ~ 5/18) 寄發105學年度第1學期復學通知\",\"(5/18) " +
			"104學年度第2學期第2次教務會議\"]},{\"week\":\"第十四週\",\"events\":[\"(5/23 ~ 5/25) " +
			"核算停修後教師鐘點費\"]},{\"week\":\"第十五週\",\"events\":[\"(5/30) 發放舊生註冊須知\",\"(5/30 ~ " +
			"6/7) 教師上網登錄期末考時間\",\"(5/30 ~ 6/3) 104學年度暑修繳費\",\"(6/1) " +
			"開放上網查詢105學年度第1學期課程表\",\"(6/3 ~ 6/8) 日間部學生105學年度第1學期選課登記志願(初選第一階段)\",\"(6/4) " +
			"補行上班上課\"]},{\"week\":\"第十六週\",\"events\":[\"(6/9) 端午節放假一天\",\"(6/10) " +
			"調整放假\"]},{\"week\":\"第十七週\",\"events\":[\"(6/13 ~ 6/25) 上網公佈期末考時間,開放學生查詢\"," +
			"\"(6/14 ~ 6/21) 日間部學生105學年度第1學期選課電腦篩選\",\"(6/17) 學生期末考扣考資料通知學生、家長、老師\",\"" +
			"(6/17) 教師期末考試卷申印製卷截止日\"]},{\"week\":\"第十八週\",\"events\":[\"(6/20 ~ 6/25) " +
			"日間部、進修推廣處期末考試\",\"(6/22 ~ 6/24) 日間部學生105學年度第1學期選課電腦篩選分發結果公告\"]}," +
			"{\"week\":\"第十九週\",\"events\":[\"(6/27 ~ 6/30) 日間部學生105學年度第1學期初選第二階段選課\",\"" +
			"(6/29) 教師送交畢業班學期考試成績截止日\"]},{\"week\":\"暑\",\"events\":[\"(7/3) " +
			"教師送交104學年度第2學期學生學期成績截止日\",\"(7/4 ~ 7/6) 本學期修課不及格者辦理暑修報名並同時繳費\",\"(7/4 ~ 7/6)" +
			" 外校生至本校暑修選課報名並同時繳費\",\"(7/11) 暑修開始上課,預計8/20上課結束\",\"(7/11) " +
			"寄發104學年度第2學期退學通知\",\"(7/18) 核發104學年度畢業生畢業證書\",\"(7/18 ~ 7/20) " +
			"寄發104學年度第2學期學生成績單\",\"(7/31) 104學年度第2學期研究生學位考試截止日\"]}]";

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
	                         Bundle savedInstanceState) {
		super.onCreateView(inflater, container, savedInstanceState);

		view = inflater.inflate(R.layout.fragment_messages, container, false);

		restoreArgs(savedInstanceState);
		findViews();
		setUpViews();

		return view;
	}

	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		this.activity = activity;
		initGA("Messages Screen", activity);
	}

	private void restoreArgs(Bundle savedInstanceState) {
		if (savedInstanceState != null) {
			mInitListPos = savedInstanceState.getInt("mInitListPos");
			mInitListOffset = savedInstanceState.getInt("mInitListOffset");
		}
	}

	@Override
	public void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);

		if (mListView != null) {
			outState.putInt("mInitListPos", mListView.getFirstVisiblePosition());
			View vNewTop = mListView.getChildAt(0);
			outState.putInt("mInitListOffset", (vNewTop == null) ? 0 : vNewTop.getTop());
		}
	}

	private void findViews() {
		mListView = (PinnedSectionListView) view.findViewById(R.id.listView);
		mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefreshLayout);
	}

	private void setUpViews() {
		// TODO wait for API
		mSwipeRefreshLayout.setEnabled(false);
		mListView.setDividerHeight(0);

		mList = new ArrayList<>();
		try {
			JSONArray jsonArray = new JSONArray(mScheduleData.trim());
			for (int i = 0; i < jsonArray.length(); i++) {
				mList.add(jsonArray.getJSONObject(i).getString("week"));
				JSONArray eventArray = jsonArray.getJSONObject(i).getJSONArray("events");
				for (int j = 0; j < eventArray.length(); j++) {
					mList.add("*" + eventArray.getString(j));
					if (mInitListPos == 0) {
						try {
							Calendar calendar = Calendar.getInstance();
							Date now = new Date(System.currentTimeMillis());
							String _time = eventArray.getString(j).split("\\) ")[0].substring(1);
							String _startTime =
									_time.contains("~") ? _time.split("~")[1].trim() : _time;
							calendar.set(Calendar.getInstance().get(Calendar.YEAR),
									Integer.parseInt(_startTime.split("/")[0]) - 1,
									Integer.parseInt(_startTime.split("/")[1]));
							if (calendar.getTime().after(now)) {
								mInitListPos = mList.size() - 5 < 0 ? 0 : mList.size() - 5;
							}
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}

		ScheduleAdapter adapter = new ScheduleAdapter(activity);
		mListView.setAdapter(adapter);
		mListView.setOnItemClickListener(this);

		((ListView) mListView).setSelectionFromTop(mInitListPos, mInitListOffset);
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
		mTracker.send(new HitBuilders.EventBuilder().setCategory("add schedule").setAction("create")
				.build());
		new AlertDialog.Builder(activity).setTitle(R.string.schedule).setMessage(
				getString(R.string.add_cal_content, mList.get(position).split("\\) ")[1]))
				.setPositiveButton(R.string.determine, new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						mTracker.send(new HitBuilders.EventBuilder().setCategory("add schedule")
								.setAction("click").build());
						AddCalendarEvent(mList.get(position).substring(1));
					}
				}).setNegativeButton(R.string.cancel, null).show();
	}

	public void AddCalendarEvent(String Msg) {
		String _time = Msg.split("\\) ")[0].substring(1);
		String _msg = Msg.split("\\) ")[1];
		String _startTime;
		String _endTime;
		if (_time.contains("~")) {
			_startTime = _time.split("~")[0].trim();
			_endTime = _time.split("~")[1].trim();
		} else {
			_startTime = _time;
			_endTime = _time;
		}
		Intent calendarIntent =
				new Intent(Intent.ACTION_INSERT, CalendarContract.Events.CONTENT_URI);
		Calendar beginTime = Calendar.getInstance();
		Calendar endTime = Calendar.getInstance();
		beginTime.set(Calendar.getInstance().get(Calendar.YEAR),
				Integer.parseInt(_startTime.split("/")[0]) - 1,
				Integer.parseInt(_startTime.split("/")[1]), 0, 0, 0);
		endTime.set(Calendar.getInstance().get(Calendar.YEAR),
				Integer.parseInt(_endTime.split("/")[0]) - 1,
				Integer.parseInt(_endTime.split("/")[1]), 23, 59, 59);
		calendarIntent
				.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
		calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
		calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, true);
		calendarIntent.putExtra(CalendarContract.Events.TITLE, _msg);
		calendarIntent.putExtra(CalendarContract.Events.EVENT_LOCATION, "國立高雄應用科技大學");
		startActivity(calendarIntent);
	}

	public ListView getListView() {
		return mListView;
	}

	public class ScheduleAdapter extends BaseAdapter
			implements PinnedSectionListView.PinnedSectionListAdapter {
		private LayoutInflater inflater;

		private static final int TYPE_WEEK = 0, TYPE_SCHEDULE = 1;

		public ScheduleAdapter(Context context) {
			this.inflater =
					(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		@Override
		public int getCount() {
			return mList.size();
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public String getItem(int position) {
			return mList.get(position);
		}

		@Override
		public int getViewTypeCount() {
			// TYPE_WEEK and TYPE_SCHEDULE
			return 2;
		}

		@Override
		public boolean isItemViewTypePinned(int viewType) {
			return viewType == TYPE_WEEK;
		}

		@Override
		public int getItemViewType(int position) {
			if (getItem(position).startsWith("*")) {
				return TYPE_SCHEDULE;
			}
			return TYPE_WEEK;
		}

		@Override
		public boolean isEnabled(int position) {
			return (getItemViewType(position) != TYPE_WEEK);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			int type = getItemViewType(position);
			ViewHolder holder;
			if (convertView == null) {
				holder = new ViewHolder();
				switch (type) {
					case TYPE_WEEK:
						convertView =
								inflater.inflate(R.layout.list_schedule_header, parent, false);
						break;

					default:
						convertView = inflater.inflate(R.layout.list_schedule_item, parent, false);
				}
				holder.textView = (TextView) convertView.findViewById(R.id.textView);
				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
			}

			if (type == TYPE_WEEK) {
				holder.textView.setText(mList.get(position));
			} else {
				holder.textView.setText(mList.get(position).substring(1));
			}
			return convertView;
		}

		class ViewHolder {
			TextView textView;
		}
	}
}