package kz.arta.synergy.workflow.mobile.android.common.activities;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;

import kz.arta.synergy.workflow.mobile.android.R;
import kz.arta.synergy.workflow.mobile.android.common.adapters.AdapterLogs;
import kz.arta.synergy.workflow.mobile.android.common.models.LogSyncItem;
import kz.arta.synergy.workflow.mobile.android.common.offline.get.LogsTable;
import kz.arta.synergy.workflow.mobile.android.common.utils.Fonts;

/**
 * Created by neox on 23.07.14.
 * Активити логов синхронизации (на самом деле здесь творится говнокод)
 */
public class LogsActivity extends Activity {

    /**
     * Активити
     */
    private Activity activity;

    /**
     * Сам список
     */
    private ExpandableListView expListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        setContentView(R.layout.sync_log_activity);
        super.onCreate(savedInstanceState);

        if (getActionBar() != null) {
            getActionBar().hide();
        }

        activity = this;

        ((TextView) findViewById(R.id.title_action_bar_sync_activity)).setTypeface(Fonts.getMedium(activity));

        expListView = (ExpandableListView) findViewById(R.id.lvExp);
        expListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
                return false;
            }
        });

        prepareListData();

        Button clearButton = (Button) findViewById(R.id.clear_sync_button);
        clearButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showDialog();
            }
        });
    }

    /**
     * Метод отображает диалог
     */
    private void showDialog() {
        AlertDialog.Builder ad = new AlertDialog.Builder(activity);
        ad.setTitle(getString(R.string.clear_logs));  // заголовок
        ad.setMessage(getString(R.string.delete_all_history_answer)); // сообщение
        ad.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int arg1) {
                clear();
            }
        });
        ad.setNegativeButton(getString(R.string.no), null);
        ad.setCancelable(true);
        ad.show();
    }

    /**
     * Метод очищает данные из таблицы
     */
    private void clear() {
        new LogsTable(activity).removeAll();
        expListView.setVisibility(View.GONE);
    }

    /**
     * Отображение данных
     */
    private void prepareListData() {

        List<String> listDataHeader = new ArrayList<>();
        HashMap<String, List<LogSyncItem>> listDataChild = new HashMap<>();

        List<LogSyncItem> allData = new LogsTable(this).getMessages();
        if (allData != null && allData.size() != 0) {

            List<List<LogSyncItem>> item = arrayCheck(allData);
            List<List<LogSyncItem>> finishedList = new LinkedList<>();

            // ищем только не пустые синхронизации
            for (int i = 0; i < item.size(); i++) {
                if (item.get(i).size() != 2) {
                    finishedList.add(item.get(i));
                }
            }

            // добавляем все данные в список
            if (finishedList.size() <= 20) {
                for (int i = 0; i < finishedList.size(); i++) {
                    String tempStr = "";
                    for (int j = 0; j < i; j++) {
                        tempStr += " ";
                    }
                    listDataHeader.add(getString(R.string.sync_from) + " " + finishedList.get(i).get(0).getData() + tempStr);
                    for (int j = 0; j < finishedList.get(i).size(); j++) {
                        listDataChild.put(listDataHeader.get(listDataHeader.size() - 1), finishedList.get(i));
                    }
                }
            } else {
                for (int i = finishedList.size() - 20; i < finishedList.size(); i++) {
                    String tempStr = "";
                    for (int j = 0; j < i; j++) {
                        tempStr += " ";
                    }
                    listDataHeader.add(getString(R.string.sync_from) + " " + finishedList.get(i).get(0).getData() + tempStr);
                    for (int j = 0; j < finishedList.get(i).size(); j++) {
                        listDataChild.put(listDataHeader.get(listDataHeader.size() - 1), finishedList.get(i));
                    }
                }
            }

        }
        Collections.sort(listDataHeader, new Comparator<String>() {
            @Override
            public int compare(String s, String s2) {
                return -1;
            }
        });

        AdapterLogs listAdapter = new AdapterLogs(this, listDataHeader, listDataChild);

        expListView.setAdapter(listAdapter);

        listAdapter.notifyDataSetChanged();
    }

    /**
     * Метод разбивает массив на нное количество массивов
     * Условие разбивки - одинаковое значение свойства random
     *
     * @param array массив
     * @return список
     */
    private List<List<LogSyncItem>> arrayCheck(List<LogSyncItem> array) {
        List<List<LogSyncItem>> result = new ArrayList<>();
        HashSet<String> used = new HashSet<>();
        for (int i = 0; i < array.size(); i++) {
            if (used.contains(array.get(i).getRandom())) {
                continue;
            } else {
                used.add(array.get(i).getRandom());
            }
            List<LogSyncItem> positions = new ArrayList<>();
            for (int j = i; j < array.size(); j++) {
                if (array.get(i).getRandom().equals(array.get(j).getRandom())) {
                    positions.add(array.get(j));
                }
            }
            result.add(positions);
        }
        return result;
    }
}
