package nico.styTool;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.mob.mobapi.API;
import com.mob.mobapi.APICallback;
import com.mob.mobapi.MobAPI;
import com.mob.mobapi.apis.Horoscope;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import static com.mob.tools.utils.R.forceCast;

public class HoroscopeAPIActivity extends AppCompatActivity implements APICallback, OnItemSelectedListener
{
    private Spinner  spYear;
    private Spinner  spMonth;
    private Spinner  spDay;
    private Spinner  spHour;
    private TextView tvHoroscope;
    private TextView tvLunar;
    private TextView tvLunarDate;
    private TextView tvZodiac;
    private Horoscope api;

    protected void onCreate(Bundle savedInstanceState)
    {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_horoscope);
	StatusBarUtil.setColor(this, getResources().getColor(R.color.colorPrimary));
	spYear  = forceCast(findViewById(R.id.spYear));
	spMonth = forceCast(findViewById(R.id.spMonth));
	spDay   = forceCast(findViewById(R.id.spDay));
	spHour  = forceCast(findViewById(R.id.spHour));

	spYear.setOnItemSelectedListener(this);
	spMonth.setOnItemSelectedListener(this);
	spDay.setOnItemSelectedListener(this);
	spHour.setOnItemSelectedListener(this);

	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH");
	String[] dates = dateFormat.format(new java.util.Date()).split("-");
	int startyear = 1900;
	initSpinner(startyear, 2099, spYear); // year range(1900 - 2099)
	initSpinner(1, 12, spMonth);
	initSpinner(1, 31, spDay);
	initSpinner(0, 23, spHour);

	// set to today
	spYear.setSelection(Integer.parseInt(dates[0]) - startyear);
	spMonth.setSelection(Integer.parseInt(dates[1]) - 1);
	spDay.setSelection(Integer.parseInt(dates[2]) - 1);
	spHour.setSelection(Integer.parseInt(dates[3]));

	tvHoroscope = forceCast(findViewById(R.id.tvHoroscope));
	tvLunar     = forceCast(findViewById(R.id.tvLunar));
	tvLunarDate = forceCast(findViewById(R.id.tvLunarDate));
	tvZodiac    = forceCast(findViewById(R.id.tvZodiac));

	api = (Horoscope) MobAPI.getAPI(Horoscope.NAME);
    }

    private String IntegerToString(int index)
    {
	if (index < 10)
	{
	    return "0" + index;
	}

	return "" + index;
    }

    private void initSpinner(int start, int end, Spinner spinner)
    {
	ArrayList<String> spinnerList = new ArrayList<String>();

	for (int i = start; i < end + 1; i++)
	{
	    spinnerList.add(IntegerToString(i));
	}

	spinner.setAdapter(new ArrayAdapter<String>(this, R.layout.view_spinner, spinnerList));
    }

    public void onSuccess(API api, int action, Map<String, Object> result)
    {
	HashMap<String, Object> res = forceCast(result.get("result"));
	tvHoroscope.setText(com.mob.tools.utils.R.toString(res.get("horoscope")));
	tvLunar.setText(com.mob.tools.utils.R.toString(res.get("lunar")));
	tvLunarDate.setText(com.mob.tools.utils.R.toString(res.get("lunarDate")));
	tvZodiac.setText(com.mob.tools.utils.R.toString(res.get("zodiac")));
    }

    public void onError(API api, int action, Throwable details)
    {
	details.printStackTrace();
	Toast.makeText(this, R.string.error_raise, Toast.LENGTH_SHORT).show();
    }

    public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
    {
	String manDate = spYear.getSelectedItem() + "-" + spMonth.getSelectedItem() + "-" + spDay.getSelectedItem();
	String manHour = (String) spHour.getSelectedItem();
	api.queryHoroscope(manDate, manHour, this);
    }

    public void onNothingSelected(AdapterView<?> parent)
    {
    }
}