package de.gultsch.chat.ui;

import de.gultsch.chat.R;
import de.gultsch.chat.entities.Account;
import de.gultsch.chat.utils.Validator;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class EditAccount extends DialogFragment {

	protected Account account;

	public void setAccount(Account account) {
		this.account = account;
	}

	public interface EditAccountListener {
		public void onAccountEdited(Account account);
	}

	protected EditAccountListener listener = null;

	public void setEditAccountListener(EditAccountListener listener) {
		this.listener = listener;
	}

	@Override
	public Dialog onCreateDialog(Bundle savedInstanceState) {
		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
		LayoutInflater inflater = getActivity().getLayoutInflater();
		View view = inflater.inflate(R.layout.edit_account_dialog, null);
		final EditText jidText = (EditText) view.findViewById(R.id.account_jid);
		final EditText usernameText = (EditText) view
				.findViewById(R.id.account_username);
		final EditText serverText = (EditText) view
				.findViewById(R.id.account_server);
		final TextView usernameDesc = (TextView) view
				.findViewById(R.id.textView2);
		final TextView confirmPwDesc = (TextView) view.findViewById(R.id.account_confirm_password_desc);
		CheckBox showAdvanced = (CheckBox) view
				.findViewById(R.id.account_show_advanced);
		final RelativeLayout advancedOptions = (RelativeLayout) view
				.findViewById(R.id.advanced_options);
		showAdvanced.setOnCheckedChangeListener(new OnCheckedChangeListener() {

			@Override
			public void onCheckedChanged(CompoundButton buttonView,
					boolean isChecked) {
				if (isChecked) {
					advancedOptions.setVisibility(View.VISIBLE);
					usernameDesc.setText("Username");
					usernameText.setVisibility(View.VISIBLE);
					jidText.setVisibility(View.GONE);
				} else {
					advancedOptions.setVisibility(View.GONE);
					usernameDesc.setText("Jabber ID");
					usernameText.setVisibility(View.GONE);
					jidText.setVisibility(View.VISIBLE);
				}
			}
		});

		final EditText password = (EditText) view
				.findViewById(R.id.account_password);
		final EditText passwordConfirm = (EditText) view
				.findViewById(R.id.account_password_confirm2);
		final CheckBox registerAccount = (CheckBox) view
				.findViewById(R.id.edit_account_register_new);

		final String okButtonDesc;

		if (account != null) {
			builder.setTitle("Edit account");
			registerAccount.setVisibility(View.GONE);
			jidText.setText(account.getJid());
			password.setText(account.getPassword());
			usernameText.setText(account.getUsername());
			serverText.setText(account.getServer());
			okButtonDesc = "Edit";
		} else {
			builder.setTitle("Add account");
			okButtonDesc = "Add";
		}

		registerAccount
				.setOnCheckedChangeListener(new OnCheckedChangeListener() {

					@Override
					public void onCheckedChanged(CompoundButton buttonView,
							boolean isChecked) {
						AlertDialog d = (AlertDialog) getDialog();
						Button positiveButton = (Button) d.getButton(Dialog.BUTTON_POSITIVE);
						if (isChecked) {
							positiveButton.setText("Register");
							passwordConfirm.setVisibility(View.VISIBLE);
							confirmPwDesc.setVisibility(View.VISIBLE);
						} else {
							passwordConfirm.setVisibility(View.GONE);
							positiveButton.setText("Add");
							confirmPwDesc.setVisibility(View.GONE);
						}
					}
				});

		builder.setView(view);
		builder.setNeutralButton("Cancel", null);
		builder.setPositiveButton(okButtonDesc, null);
		return builder.create();
	}

	@Override
	public void onStart() {
		super.onStart();
		final AlertDialog d = (AlertDialog) getDialog();
		Button positiveButton = (Button) d.getButton(Dialog.BUTTON_POSITIVE);
		positiveButton.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				boolean showAdvanced = ((CheckBox) d.findViewById(R.id.account_show_advanced)).isChecked();
				EditText jidEdit = (EditText) d.findViewById(R.id.account_jid);
				String jid = jidEdit.getText().toString();
				EditText usernameEdit = (EditText) d.findViewById(R.id.account_username);
				String username = usernameEdit.getText().toString();
				EditText serverEdit = (EditText) d.findViewById(R.id.account_server);
				String server = serverEdit.getText().toString();
				EditText passwordEdit = (EditText) d.findViewById(R.id.account_password);
				String password = passwordEdit.getText().toString();
				if (!showAdvanced) {
					if (Validator.isValidJid(jid)) {
						String[] parts = jid.split("@");
						username = parts[0];
						server = parts[1];
					} else {
						jidEdit.setError("Invalid Jabber ID");
						return;
					}
				} else {
					if (username.length()==0) {
						usernameEdit.setError("username is too short");
						return;
					} else if (server.length()==0) {
						serverEdit.setError("server is too short");
						return;
					}
				}
				if (account!=null) {
					account.setPassword(password);
					account.setUsername(username);
					account.setServer(server);
				} else {
					account = new Account(username, server, password);
				}
				if (listener!=null) {
					listener.onAccountEdited(account);
					d.dismiss();
				}
			}
		});
	}
}
