package org.emoncms.myapps.chart;

import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.util.Log;

import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;

import org.emoncms.myapps.HTTPClient;
import org.emoncms.myapps.R;
import org.json.JSONArray;
import org.json.JSONException;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

/**
 * Retrieves data for the DailyUsage chart and updates the chart
 */
public class UseByDayDataLoader implements Runnable {

    private static final int INTERVAL = 86400;
    private static final String FEED_URL = "%s/feed/data.json?apikey=%s&id=%d&start=%d&end=%d&interval=86400&skipmissing=1&limitinterval=1";


    private MyElectricDataManager myElectricDataManager;
    private Context context;
    private long timeZoneOffset;
    private DailyBarChart dailyUsageBarChart;
    private int daysToDisplay;

    public UseByDayDataLoader(Context context, MyElectricDataManager myElectricDataManager, DailyBarChart dailyUsageBarChart) {
        this.myElectricDataManager = myElectricDataManager;
        this.context = context;
        this.dailyUsageBarChart = dailyUsageBarChart;
        timeZoneOffset = (long) Math.floor((Calendar.getInstance().get(Calendar.ZONE_OFFSET) + Calendar.getInstance().get(Calendar.DST_OFFSET)) * 0.001);

    }

    public void setDaysToDisplay(int days) {
        this.daysToDisplay = days;
    }

    @Override
    public void run() {
        int kWhFeedId = myElectricDataManager.getSettings().getUseFeedId();

        long end = (long) Math.floor(((Calendar.getInstance().getTimeInMillis() * 0.001) + timeZoneOffset) / INTERVAL) * INTERVAL;

        end -= timeZoneOffset;
        long start = end - (INTERVAL * daysToDisplay);

        final long chart2EndTime = end * 1000;
        final long chart2StartTime = start * 1000;

        String url = String.format(FEED_URL, myElectricDataManager.getEmonCmsUrl(), myElectricDataManager.getEmoncmsApikey(), kWhFeedId, chart2StartTime, chart2EndTime);
        Log.i("EMONCMS:URL", "mDaysofWeekRunner:" + url);

        JsonArrayRequest jsArrayRequest = new JsonArrayRequest
                (url, new Response.Listener<JSONArray>() {

                    @Override
                    public void onResponse(JSONArray response) {
                        List<Long> dates = new ArrayList<>();
                        List<Double> power = new ArrayList<>();
                        String dayOfWeekInitials[] = context.getResources().getStringArray(R.array.day_of_week_initials);
                        Calendar calendar = Calendar.getInstance();

                        for (int i = 0; i < response.length(); i++) {
                            JSONArray row;

                            try {
                                row = response.getJSONArray(i);
                                Long date = row.getLong(0);
                                if (date <= chart2EndTime) {
                                    dates.add(date);
                                    power.add(row.getDouble(1) *  myElectricDataManager.getSettings().getPowerScaleAsFloat());
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }

                        dailyUsageBarChart.clearData();

                        int[] chart2_colors = new int[power.size()];

                        for (int i = 0; i < power.size() - 1; i++) {
                            calendar.setTimeInMillis(dates.get(i));

                            dailyUsageBarChart.addData(dayOfWeekInitials[calendar.get(Calendar.DAY_OF_WEEK) - 1],power.get(i + 1) - power.get(i));

                            if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY ||
                                    calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
                                chart2_colors[i] = ContextCompat.getColor(context, R.color.chartBlueDark);
                            else
                                chart2_colors[i] = ContextCompat.getColor(context, R.color.chartBlue);
                        }

                        if (power.size() > 0) {
                            double yesterdaysPowerUsage = power.get(power.size() - 1);
                            double powerToday = (myElectricDataManager.getTotalUsagekWh()) - yesterdaysPowerUsage;
                            myElectricDataManager.setUseToYesterday((float)yesterdaysPowerUsage);


                            calendar.setTimeInMillis(dates.get(dates.size() - 1));

                            dailyUsageBarChart.addData(dayOfWeekInitials[calendar.get(Calendar.DAY_OF_WEEK) - 1],powerToday);


                            if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY ||
                                    calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
                                chart2_colors[chart2_colors.length - 1] = ContextCompat.getColor(context, R.color.chartBlueDark);
                            } else {
                                chart2_colors[chart2_colors.length - 1] = ContextCompat.getColor(context, R.color.chartBlue);
                            }
                        }

                        dailyUsageBarChart.setBarColours(chart2_colors);
                        dailyUsageBarChart.refreshChart();

                       myElectricDataManager.clearMessage();
                       myElectricDataManager.loadPowerHistory(0);
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        myElectricDataManager.showMessage(R.string.connection_error);
                        myElectricDataManager.loadUseHistory(5000);

                    }
                });

        jsArrayRequest.setTag(myElectricDataManager.getPageTag());
        HTTPClient.getInstance(context).addToRequestQueue(jsArrayRequest);
    }
}