package eu.siacs.conversations.ui;

import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.os.Handler;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Spinner;
import android.widget.TextView;

import java.util.List;

import eu.siacs.conversations.R;
import eu.siacs.conversations.databinding.ActivitySetPresenceBinding;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.ListItem;
import eu.siacs.conversations.entities.Presence;
import eu.siacs.conversations.entities.PresenceTemplate;
import eu.siacs.conversations.utils.UIHelper;

public class SetPresenceActivity extends XmppActivity implements View.OnClickListener {

	//data
	protected Account mAccount;
	private List<PresenceTemplate> mTemplates;

	private ActivitySetPresenceBinding binding;

	private Pair<Integer, Intent> mPostponedActivityResult;

	private Runnable onPresenceChanged = new Runnable() {
		@Override
		public void run() {
			finish();
		}
	};

	protected void onCreate(final Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.binding = DataBindingUtil.setContentView(this,R.layout.activity_set_presence);
		ArrayAdapter adapter = ArrayAdapter.createFromResource(this,
				R.array.presence_show_options,
				R.layout.simple_list_item);
		this.binding.presenceShow.setAdapter(adapter);
		this.binding.presenceShow.setSelection(1);
		this.binding.changePresence.setOnClickListener(v -> executeChangePresence());
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.change_presence, menu);
		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(final MenuItem item) {
		if (item.getItemId() == R.id.action_account_details) {
			if (mAccount != null) {
				switchToAccount(mAccount);
			}
			return true;
		} else {
			return super.onOptionsItemSelected(item);
		}
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode == RESULT_OK) {
			if (xmppConnectionServiceBound && mAccount != null) {
				if (requestCode == REQUEST_ANNOUNCE_PGP) {
					announcePgp(mAccount, null,data, onPresenceChanged);
				}
				this.mPostponedActivityResult = null;
			} else {
				this.mPostponedActivityResult = new Pair<>(requestCode, data);
			}
		}
	}

	private void executeChangePresence() {
		Presence.Status status = getStatusFromSpinner();
		boolean allAccounts = this.binding.allAccounts.isChecked();
		String statusMessage = this.binding.presenceStatusMessage.getText().toString().trim();
		if (allAccounts && noAccountUsesPgp()) {
			xmppConnectionService.changeStatus(status, statusMessage);
			finish();
		} else if (mAccount != null) {
			if (mAccount.getPgpId() == 0 || !hasPgp()) {
				xmppConnectionService.changeStatus(mAccount, status, statusMessage, true);
				finish();
			} else {
				xmppConnectionService.changeStatus(mAccount, status, statusMessage, false);
				announcePgp(mAccount, null,null, onPresenceChanged);
			}
		}
	}

	private Presence.Status getStatusFromSpinner() {
		switch (this.binding.presenceShow.getSelectedItemPosition()) {
			case 0:
				return Presence.Status.CHAT;
			case 2:
				return Presence.Status.AWAY;
			case 3:
				return Presence.Status.XA;
			case 4:
				return Presence.Status.DND;
			default:
				return Presence.Status.ONLINE;
		}
	}

	private void setStatusInSpinner(Presence.Status status) {
		switch(status) {
			case AWAY:
				this.binding.presenceShow.setSelection(2);
				break;
			case XA:
				this.binding.presenceShow.setSelection(3);
				break;
			case CHAT:
				this.binding.presenceShow.setSelection(0);
				break;
			case DND:
				this.binding.presenceShow.setSelection(4);
				break;
			default:
				this.binding.presenceShow.setSelection(1);
				break;
		}
	}

	@Override
	protected void refreshUiReal() {

	}

	@Override
	void onBackendConnected() {
		mAccount = extractAccount(getIntent());
		if (mAccount != null) {
			setStatusInSpinner(mAccount.getPresenceStatus());
			String message = mAccount.getPresenceStatusMessage();
			if (this.binding.presenceStatusMessage.getText().length() == 0 && message != null) {
				this.binding.presenceStatusMessage.append(message);
			}
			mTemplates = xmppConnectionService.getPresenceTemplates(mAccount);
			if (this.mPostponedActivityResult != null) {
				this.onActivityResult(mPostponedActivityResult.first, RESULT_OK, mPostponedActivityResult.second);
			}
			boolean e = noAccountUsesPgp();
			this.binding.allAccounts.setEnabled(e);
			this.binding.allAccounts.setTextColor(e ? getPrimaryTextColor() : getSecondaryTextColor());
		}
		redrawTemplates();
	}

	private void redrawTemplates() {
		if (mTemplates == null || mTemplates.size() == 0) {
			this.binding.templatesCard.setVisibility(View.GONE);
		} else {
			this.binding.templates.removeAllViews();
			this.binding.templatesCard.setVisibility(View.VISIBLE);
			LayoutInflater inflater = getLayoutInflater();
			for (PresenceTemplate template : mTemplates) {
				View templateLayout = inflater.inflate(R.layout.presence_template, this.binding.templates, false);
				templateLayout.setTag(template);
				setListItemBackgroundOnView(templateLayout);
				templateLayout.setOnClickListener(this);
				TextView message = (TextView) templateLayout.findViewById(R.id.presence_status_message);
				TextView status = (TextView) templateLayout.findViewById(R.id.status);
				ImageButton button = (ImageButton) templateLayout.findViewById(R.id.delete_button);
				button.setTag(template);
				button.setOnClickListener(this);
				ListItem.Tag tag = UIHelper.getTagForStatus(this, template.getStatus());
				status.setText(tag.getName());
				status.setBackgroundColor(tag.getColor());
				message.setText(template.getStatusMessage());
				this.binding.templates.addView(templateLayout);
			}
		}
	}

	@Override
	public void onClick(View v) {
		PresenceTemplate template = (PresenceTemplate) v.getTag();
		if (template == null) {
			return;
		}
		if (v.getId() == R.id.presence_template) {
			setStatusInSpinner(template.getStatus());
			this.binding.presenceStatusMessage.getEditableText().clear();
			this.binding.presenceStatusMessage.getEditableText().append(template.getStatusMessage());
			new Handler().post(() -> this.binding.scrollView.smoothScrollTo(0,0));
		} else if (v.getId() == R.id.delete_button) {
			xmppConnectionService.databaseBackend.deletePresenceTemplate(template);
			mTemplates.remove(template);
			redrawTemplates();
		}
	}
}
