/*
 * Copyright © 2016 Keith Packard <keithp@keithp.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 */

package org.altusmetrum.AltosDroid;

import java.lang.ref.WeakReference;
import java.util.*;
import java.text.*;
import org.altusmetrum.AltosDroid.R;

import android.app.Activity;
import android.content.*;
import android.graphics.*;
import android.os.*;
import android.view.*;
import android.view.View.*;
import android.view.inputmethod.*;
import android.widget.*;
import android.widget.AdapterView.*;

import org.altusmetrum.altoslib_13.*;

class FrequencyItem {
	public AltosFrequency frequency;
	public LinearLayout frequency_view = null;
	public TextView	pretty_view = null;

	private void update() {
		if (pretty_view != null && frequency != null)
			pretty_view.setText(frequency.toString());
	}

	public void realize(LinearLayout frequency_view,
			    TextView pretty_view) {
		if (frequency_view != this.frequency_view ||
		    pretty_view != this.pretty_view)
		{
			this.frequency_view = frequency_view;
			this.pretty_view = pretty_view;
			update();
		}
	}

	public void set_frequency(AltosFrequency frequency) {
		this.frequency = frequency;
		update();
	}

	public FrequencyItem(AltosFrequency frequency) {
		this.frequency = frequency;
	}
}

class FrequencyAdapter extends ArrayAdapter<FrequencyItem> {
	int resource;
	int selected_item = -1;

	public FrequencyAdapter(Context context, int in_resource) {
		super(context, in_resource);
		resource = in_resource;
	}

	public int count() {
		int	count;

		for (count = 0;; count++) {
			try {
				getItem(count);
			} catch (IndexOutOfBoundsException ie) {
				return count;
			}
		}
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		FrequencyItem item = getItem(position);
		if (item.frequency_view == null) {
			LinearLayout frequency_view = new LinearLayout(getContext());
			String inflater = Context.LAYOUT_INFLATER_SERVICE;
			LayoutInflater li = (LayoutInflater) getContext().getSystemService(inflater);
			li.inflate(resource, frequency_view, true);

			item.realize(frequency_view,
				     (TextView) frequency_view.findViewById(R.id.frequency));
		}
		if (position == selected_item)
			item.frequency_view.setBackgroundColor(Color.RED);
		else
			item.frequency_view.setBackgroundColor(Color.BLACK);
		return item.frequency_view;
	}
}

public class ManageFrequenciesActivity extends Activity {
	private ListView frequencies_view;

	private Button set;
	private Button remove;
	private Button done;

	private EditText set_frequency;
	private EditText set_description;

	private HashMap<String,FrequencyItem> frequencies = new HashMap<String,FrequencyItem>();;

	private FrequencyAdapter frequencies_adapter;

	private boolean is_bound;
	private boolean changed = false;

	private void done() {

		set();

		if (changed) {
			AltosFrequency[] frequencies = new AltosFrequency[frequencies_adapter.count()];
			for (int i = 0; i < frequencies.length; i++)
				frequencies[i] = frequencies_adapter.getItem(i).frequency;
			AltosPreferences.set_common_frequencies(frequencies);
		}

		Intent intent = new Intent();
		setResult(Activity.RESULT_OK, intent);
		finish();
	}

	private void load_item() {
		if (frequencies_adapter.selected_item >= 0) {
			FrequencyItem item = frequencies_adapter.getItem(frequencies_adapter.selected_item);

			set_frequency.setText(item.frequency.frequency_string());
			set_description.setText(item.frequency.description);
		} else {
			set_frequency.setText("");
			set_description.setText("");
		}
	}

	private void select_item(int position) {
		if (position != frequencies_adapter.selected_item) {
			if (frequencies_adapter.selected_item >= 0)
				frequencies_view.setItemChecked(frequencies_adapter.selected_item, false);
			if (position >= 0)
				frequencies_view.setItemChecked(position, true);
			frequencies_adapter.selected_item = position;
		} else {
			if (frequencies_adapter.selected_item >= 0)
				frequencies_view.setItemChecked(frequencies_adapter.selected_item, false);
			frequencies_adapter.selected_item = -1;
		}
		load_item();
	}

	private int find(AltosFrequency frequency) {
		for (int pos = 0; pos < frequencies_adapter.getCount(); pos++) {
			FrequencyItem	item = frequencies_adapter.getItem(pos);
			if (item.frequency.frequency == frequency.frequency &&
			    item.frequency.description.equals(frequency.description))
				return pos;
		}
		return -1;
	}

	private int insert_item(AltosFrequency frequency) {
		FrequencyItem new_item = new FrequencyItem(frequency);
		int	pos;
		for (pos = 0; pos < frequencies_adapter.getCount(); pos++) {
			FrequencyItem	item = frequencies_adapter.getItem(pos);
			if (item.frequency.frequency == new_item.frequency.frequency) {
				item.set_frequency(frequency);
				return pos;
			}
			if (item.frequency.frequency > new_item.frequency.frequency)
				break;
		}
		frequencies_adapter.insert(new_item, pos);
		return pos;
	}

	private class FrequencyItemClickListener implements ListView.OnItemClickListener {
		@Override
		public void onItemClick(AdapterView<?> av, View v, int position, long id) {
			select_item(position);
		}
	}

	private void hide_keyboard() {
		InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
		View view = getCurrentFocus();
		if (view != null)
			imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
	}

	private void set() {
		String	frequency_text = set_frequency.getEditableText().toString();
		String	description_text = set_description.getEditableText().toString();

		try {
			double	f = AltosParse.parse_double_locale(frequency_text);
			AltosFrequency frequency = new AltosFrequency(f, description_text);
			int pos;

			pos = find(frequency);
			if (pos < 0) {
				pos = insert_item(frequency);
				changed = true;
			}
			frequencies_adapter.selected_item = -1;
			select_item(pos);
		} catch (ParseException pe) {
		}
		hide_keyboard();
	}

	private void remove() {
		if (frequencies_adapter.selected_item >= 0) {
			frequencies_adapter.remove(frequencies_adapter.getItem(frequencies_adapter.selected_item));
			select_item(-1);
			frequencies_view.setAdapter(frequencies_adapter);
			changed = true;
		}
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// Setup the window
		requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
		setContentView(R.layout.manage_frequencies);

		frequencies_view = (ListView) findViewById(R.id.frequencies);
		frequencies_view.setClickable(true);

		frequencies_adapter = new FrequencyAdapter(this, R.layout.frequency);

		frequencies_view.setAdapter(frequencies_adapter);
		frequencies_view.setOnItemClickListener(new FrequencyItemClickListener());

		AltosFrequency[] frequencies = AltosPreferences.common_frequencies();
		for (AltosFrequency frequency : frequencies)
			insert_item(frequency);

		set_frequency = (EditText) findViewById(R.id.set_frequency);
		set_description = (EditText) findViewById(R.id.set_description);

		set = (Button) findViewById(R.id.set);
		set.setOnClickListener(new OnClickListener() {
				public void onClick(View v) {
					set();
				}
			});

		remove = (Button) findViewById(R.id.remove);
		remove.setOnClickListener(new OnClickListener() {
				public void onClick(View v) {
					remove();
				}
			});

		done = (Button) findViewById(R.id.done);
		done.setOnClickListener(new OnClickListener() {
				public void onClick(View v) {
					done();
				}
			});

		// Set result CANCELED incase the user backs out
		setResult(Activity.RESULT_CANCELED);
	}

	@Override
	protected void onStart() {
		super.onStart();
	}

	@Override
	protected void onResume() {
		super.onResume();
	}

	@Override
	protected void onPause() {
		super.onPause();
	}

	@Override
	protected void onStop() {
		super.onStop();
	}
}
