package org.example.proyecto;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.Calendar;
import java.util.concurrent.ExecutionException;

/**
 * Created by Victor on 05/09/2016.
 */
public class CustomDialog extends Dialog implements
        android.view.View.OnClickListener {

    public String urlTiempo = "http://api.openweathermap.org/data/2.5/weather?q=";
    public String appid = "&units=metric&lang=es&appid=9c64b7863274b6a1c301966af6c0f57e";
    public String json;

    public JSONObject jObj,sysObj;


    public String icon,name;

    public int error;

    public Activity c;
    public Button btn_aceptar, btn_cancelar;
    public EditText editTextCiudad;
    public String nombreCiudad;
    public boolean ciudadCorrecta=false;
    public boolean yaAnadida = false;

    public ProgressDialog progress;

    Calendar calendar = Calendar.getInstance();


    public CustomDialog(Activity a) {
        super(a);
        // TODO Auto-generated constructor stub
        this.c = a;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.dialog_anadir_ciudad);

        btn_aceptar = (Button) findViewById(R.id.btn_aceptar);
        btn_cancelar = (Button) findViewById(R.id.btn_cancelar);
        btn_aceptar.setOnClickListener(this);
        btn_cancelar.setOnClickListener(this);

        editTextCiudad=(EditText)findViewById(R.id.editText_ciudad);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_aceptar:

                try{
                    nombreCiudad = editTextCiudad.getText().toString();
                } catch (Exception e){
                    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                    builder.setMessage("La ciudad introducida no es correcta");
                    builder.setPositiveButton(android.R.string.ok, null);
                    builder.create().show();
                    break;
                }

                while (nombreCiudad.charAt(0) == ' ')
                    nombreCiudad = nombreCiudad.substring(1,nombreCiudad.length());

                for (int i=1;i<nombreCiudad.length()-1;i++){
                    if (nombreCiudad.charAt(i) == ' '){
                        nombreCiudad = nombreCiudad.substring(0,i)
                                + nombreCiudad.substring(i+1,nombreCiudad.length());
                        i--;
                    }
                }

                nombreCiudad = nombreCiudad.substring(0,1).toUpperCase()
                        + nombreCiudad.substring(1).toLowerCase();

                if (nombreCiudad.charAt(nombreCiudad.length()-1) == ' ')
                    nombreCiudad = nombreCiudad.substring(0,nombreCiudad.length()-1);



                ciudadCorrecta = comprobarCiudad(nombreCiudad);


                if(!ciudadCorrecta){
                    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                    builder.setMessage("La ciudad introducida no es correcta");
                    builder.setPositiveButton(android.R.string.ok, null);
                    builder.create().show();
                    break;
                }


                for(int i=0; i<MisCiudades.adaptador.vectorCiudades.size();i++){
                    if (MisCiudades.adaptador.vectorCiudades.elementAt(i).nombreCiudad.equals(name)){
                        yaAnadida = true;
                        break;
                    }
                }

                if (yaAnadida){
                    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                    builder.setMessage("Esta ciudad ya está añadida");
                    builder.setPositiveButton(android.R.string.ok, null);
                    builder.create().show();
                } else if (ciudadCorrecta) {

                    progress = ProgressDialog.show(getContext(), "Cargando", "Añadiendo ciudad", true);

                    MiThread hilo = new MiThread(nombreCiudad,c);
                    hilo.start();
                }

                break;

            case R.id.btn_cancelar:
                dismiss();
                break;

            default:
                break;
        }
        dismiss();
    }

    public void anadirCiudad(String nombreCiudad){

        MisCiudades.adaptador.obtenerClima(nombreCiudad);

        Ciudad nuevaCiudad = new Ciudad (MisCiudades.adaptador.name,MisCiudades.adaptador.lon,
                MisCiudades.adaptador.lat,MisCiudades.adaptador.country);

        MisCiudades.adaptador.vectorCiudades.add(nuevaCiudad);

        int i = MisCiudades.adaptador.vectorCiudades.size()-1;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).nombreCiudadUrl = nombreCiudad;

        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.weatherId = MisCiudades.adaptador.weatherId;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.description = MisCiudades.adaptador.description;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.weatherMain = MisCiudades.adaptador.weatherMain;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.bitmapIcon = MisCiudades.adaptador.bitmapIcon;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.temp = MisCiudades.adaptador.temp;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.pressure = MisCiudades.adaptador.pressure;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.humidity = MisCiudades.adaptador.humidity;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.temp_min = MisCiudades.adaptador.temp_min;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.temp_max = MisCiudades.adaptador.temp_max;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.sunrise = MisCiudades.adaptador.sunrise;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.sunset = MisCiudades.adaptador.sunset;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.speed = MisCiudades.adaptador.speed;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.windDirection = MisCiudades.adaptador.windDirection;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.rain = MisCiudades.adaptador.rain;
        MisCiudades.adaptador.vectorCiudades.elementAt(i).tiempoActual.actualizacion =
                String.valueOf(calendar.get(Calendar.HOUR_OF_DAY) + ":" +
                        String.valueOf(calendar.get(Calendar.MINUTE)) + ":" +
                        String.valueOf(calendar.get(Calendar.SECOND)) + " " +
                        String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)) +"/"+
                        String.valueOf((calendar.get(Calendar.MONTH))+1)+"/"+
                        String.valueOf(calendar.get(Calendar.YEAR)));



        MisCiudades.adaptador.obtenerPrediccion(nombreCiudad,i);

    }

    public boolean comprobarCiudad(String ciudad){

        TareaWeb tarea = new TareaWeb();
        tarea.execute(urlTiempo+ciudad+appid);

        // Obtener el resultado del AsyncTask
        try {
            json = tarea.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        // We create out JSONObject from the data
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        try {
            error = getInt("cod", jObj);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        if (error == 404) {
            return false;
        } else {

            try {
                sysObj = getObject("sys", jObj);
                name = getString("name", jObj);
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return true;
        }

    }

    private static JSONObject getObject(String tagName, JSONObject jObj) throws JSONException {
        JSONObject subObj = jObj.getJSONObject(tagName);
        return subObj;
    }

    private static String getString(String tagName, JSONObject jObj) throws JSONException {
        return jObj.getString(tagName);
    }

    private static int getInt(String tagName, JSONObject jObj) throws JSONException {
        return jObj.getInt(tagName);
    }


    public class MiThread extends Thread {

        String nombreCiudad;
        Activity activity;

        public MiThread(String nombreCiudad,Activity activity){
            this.nombreCiudad = nombreCiudad;
            this.activity = activity;
        }

        @Override
        public void run() {

            anadirCiudad(nombreCiudad);

            activity.runOnUiThread(new Runnable(){

                @Override public void run(){
                    MisCiudades.adaptador.notifyDataSetChanged();

                    //MisCiudades.adaptador.almacen.guardarCiudad(nombreCiudad,
                            //MisCiudades.adaptador);

                    MisCiudades.adaptador.almacen.actualizarVectorCiudades(MisCiudades.adaptador);

                    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                    builder.setMessage("Ciudad añadida correctamente");
                    builder.setPositiveButton(android.R.string.ok, null);
                    builder.create().show();
                    progress.dismiss();
                }

            });
        }
    }
}