package com.antest1.kcanotify.h5;

import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import static com.antest1.kcanotify.h5.KcaApiData.findRemodelLv;
import static com.antest1.kcanotify.h5.KcaApiData.getItemTranslation;
import static com.antest1.kcanotify.h5.KcaApiData.getKcItemStatusById;
import static com.antest1.kcanotify.h5.KcaApiData.getKcShipDataById;
import static com.antest1.kcanotify.h5.KcaApiData.getShipTranslation;
import static com.antest1.kcanotify.h5.KcaApiData.loadTranslationData;
import static com.antest1.kcanotify.h5.KcaApiData.removeKai;
import static com.antest1.kcanotify.h5.KcaConstants.DB_KEY_MATERIALS;
import static com.antest1.kcanotify.h5.KcaConstants.DB_KEY_USEITEMS;
import static com.antest1.kcanotify.h5.KcaConstants.KCANOTIFY_DB_VERSION;
import static com.antest1.kcanotify.h5.KcaConstants.PREF_EQUIPINFO_FILTCOND;
import static com.antest1.kcanotify.h5.KcaConstants.PREF_KCA_LANGUAGE;
import static com.antest1.kcanotify.h5.KcaUtils.getId;
import static com.antest1.kcanotify.h5.KcaUtils.getJapanCalendarInstance;
import static com.antest1.kcanotify.h5.KcaUtils.getStringPreferences;
import static com.antest1.kcanotify.h5.KcaUtils.joinStr;


public class AkashiDetailActivity extends AppCompatActivity {
    Toolbar toolbar;
    KcaDBHelper dbHelper;
    static Gson gson = new Gson();
    TextView itemNameTextView, itemImprovDefaultShipTextView, getItemImprovStat;
    JsonObject itemImprovementData;

    TextView dmat_count, smat_count;
    TextView current_date;

    public AkashiDetailActivity() {
        LocaleUtils.updateConfig(this);
    }

    private String getStringWithLocale(int id) {
        return KcaUtils.getStringWithLocale(getApplicationContext(), getBaseContext(), id);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_akashi_detail);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle(getResources().getString(R.string.action_akashi_detail));
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        dbHelper = new KcaDBHelper(getApplicationContext(), null, KCANOTIFY_DB_VERSION);

        Calendar calendar = getJapanCalendarInstance();
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 0(Sun) ~ 6(Sat)
        Date date = calendar.getTime();
        SimpleDateFormat date_format = new SimpleDateFormat("yyyy/MM/dd", Locale.ENGLISH);
        current_date = findViewById(R.id.current_date);
        current_date.setText(KcaUtils.format("%s (%s)", date_format.format(date),
                getStringWithLocale(getId("akashi_term_day_" + dayOfWeek, R.string.class))));

        dmat_count = findViewById(R.id.count_dmat);
        smat_count = findViewById(R.id.count_smat);
        JsonArray material_data = dbHelper.getJsonArrayValue(DB_KEY_MATERIALS);
        if (material_data != null) {
            JsonElement dmat_value = material_data.get(6);
            String dmat_str = dmat_value.isJsonPrimitive() ? dmat_value.getAsString() : dmat_value.getAsJsonObject().get("api_value").getAsString();
            dmat_count.setText(String.valueOf(dmat_str));

            JsonElement smat_value = material_data.get(7);
            String smat_str = smat_value.isJsonPrimitive() ? smat_value.getAsString() : smat_value.getAsJsonObject().get("api_value").getAsString();
            smat_count.setText(String.valueOf(smat_str));
        }

        /*
        JsonArray useitem_data = dbHelper.getJsonArrayValue(DB_KEY_USEITEMS);
        if (useitem_data != null) {
            for (int i = 0; i < useitem_data.size(); i++) {
                JsonObject item = useitem_data.get(i).getAsJsonObject();
                int key = item.get("api_id").getAsInt();
                if (key == 3) { // DEVMAT
                    dmat_count.setText(String.valueOf(item.get("api_count").getAsInt()));
                } else if (key == 4) { // SCREW
                    smat_count.setText(String.valueOf(item.get("api_count").getAsInt()));
                }
            }
        }*/

        if (!getIntent().hasExtra("item_id")) {
            finish();
        } else {
            itemNameTextView = findViewById(R.id.akashi_detail_name);
            itemImprovDefaultShipTextView = findViewById(R.id.akashi_improv_default_list);

            int itemid = getIntent().getIntExtra("item_id", 0);
            String itemImprovmetInfo = getIntent().getStringExtra("item_info");
            String kcItemName = "";
            if (itemid != 0) {
                JsonObject kcItemData = getKcItemStatusById(itemid, "type,name");
                kcItemName = getItemTranslation(kcItemData.get("name").getAsString());
                itemNameTextView.setText(kcItemName);
            } else {
                Toast.makeText(this, "??", Toast.LENGTH_LONG).show();
            }

            getItemImprovStat = findViewById(R.id.akashi_improv_status_list);
            List<Integer> status = getImprovedCount(String.valueOf(itemid));
            List<String> statusText = new ArrayList<>();
            for (int i = 0; i < status.size(); i++) {
                if (status.get(i) > 0) {
                    int val = status.get(i);
                    statusText.add(KcaUtils.format("★%s: %d", i == 10 ? "max" : String.valueOf(i), val));
                }
            }
            if (statusText.size() > 0) {
                getItemImprovStat.setText(KcaUtils.joinStr(statusText, ", "));
            } else {
                getItemImprovStat.setText("-");
            }

            if (itemImprovmetInfo.length() > 0) {
                itemImprovementData = new JsonParser().parse(itemImprovmetInfo).getAsJsonObject();
                JsonArray itemImprovementDetail = itemImprovementData.getAsJsonArray("improvement");
                JsonArray itemDefaultEquippedOn = itemImprovementData.getAsJsonArray("default_equipped_on");
                boolean itemConvertException = itemImprovementData.has("convert_exception");
                if (itemImprovementDetail.size() < 2) {
                    findViewById(R.id.akashi_improv_detail_2).setVisibility(View.GONE);
                }
                for (int i = 0; i < itemImprovementDetail.size(); i++) {
                    JsonObject data = itemImprovementDetail.get(i).getAsJsonObject();
                    JsonArray resources = data.getAsJsonArray("resource");

                    Set<String> total_items = new HashSet<>();
                    for (int j = 1; j <= 3; j++) {
                        int item = resources.get(j).getAsJsonArray().get(4).getAsInt();
                        if (item != 0) total_items.add(String.valueOf(item));
                    }
                    Log.e("KCA", total_items.toString());
                    JsonObject item_count = getItemCount(total_items);

                    for (int j = 1; j <= 3; j++) {
                        String[] mse_string = getMseString(resources.get(j).getAsJsonArray(), item_count);
                        ((TextView) findViewById(getId("akashi_improv_detail_m".concat(String.valueOf(j))
                                .concat("_").concat(String.valueOf(i + 1)), R.id.class)))
                                .setText(mse_string[0]);
                        ((TextView) findViewById(getId("akashi_improv_detail_s".concat(String.valueOf(j))
                                .concat("_").concat(String.valueOf(i + 1)), R.id.class)))
                                .setText(mse_string[1]);
                        if (j == 3 && data.has("require_item")) {
                            String e3 = mse_string[2];
                            JsonArray require_items = data.getAsJsonArray("require_item");

                            JsonObject useritem_count = new JsonObject();
                            JsonArray useitem_data = dbHelper.getJsonArrayValue(DB_KEY_USEITEMS);
                            if (useitem_data != null) {
                                for (int n = 0; n < useitem_data.size(); n++) {
                                    JsonObject item = useitem_data.get(n).getAsJsonObject();
                                    String key = item.get("api_id").getAsString();
                                    String value = item.get("api_count").getAsString();
                                    useritem_count.addProperty(key, value);
                                }
                            }

                            List<String> require_items_str = new ArrayList<>();
                            require_items_str.add(e3);
                            for (int k = 0; k < require_items.size(); k++) {
                                JsonArray r_item = require_items.get(k).getAsJsonArray();
                                String require_item_name;
                                int useritem_id = 0;
                                int require_item_count = r_item.get(1).getAsInt();
                                switch (r_item.get(0).getAsInt()) {
                                    case 1:
                                        require_item_name = getStringWithLocale(R.string.item_engine);
                                        useritem_id = 72;
                                        break;
                                    case 2:
                                        require_item_name = getStringWithLocale(R.string.item_gmi_material);
                                        useritem_id = 75;
                                        break;
                                    case 3:
                                        require_item_name = getStringWithLocale(R.string.item_skilled_crew);
                                        useritem_id = 70;
                                        break;
                                    case 4:
                                        require_item_name = getStringWithLocale(R.string.item_kouku_material);
                                        useritem_id = 77;
                                        break;
                                    case 5:
                                        require_item_name = getStringWithLocale(R.string.item_action_report);
                                        useritem_id = 78;
                                        break;
                                    case 6:
                                        require_item_name = getStringWithLocale(R.string.item_rocket_material);
                                        useritem_id = 92;
                                        break;
                                    default:
                                        require_item_name = "";
                                        useritem_id = -1;
                                        break;
                                }
                                String useritem_id_str = String.valueOf(useritem_id);
                                int useritem_count_view = 0;
                                if (useritem_count.has(useritem_id_str)) {
                                    useritem_count_view = useritem_count.get(useritem_id_str).getAsInt();
                                }
                                require_items_str.add(KcaUtils.format("%sx%d (%d)",
                                        require_item_name, require_item_count, useritem_count_view));
                            }
                            e3 = KcaUtils.joinStr(require_items_str, "\n");
                            ((TextView) findViewById(getId("akashi_improv_detail_e".concat(String.valueOf(j))
                                    .concat("_").concat(String.valueOf(i + 1)), R.id.class)))
                                    .setText(e3);
                        } else {
                            ((TextView) findViewById(getId("akashi_improv_detail_e".concat(String.valueOf(j))
                                    .concat("_").concat(String.valueOf(i + 1)), R.id.class)))
                                    .setText(mse_string[2]);
                        }

                    }

                    ((TextView) findViewById(getId("akashi_improv_consume_".concat(String.valueOf(i + 1)), R.id.class)))
                            .setText(getConcatString(resources.get(0).getAsJsonArray()));

                    JsonElement upgrade = data.get("upgrade");
                    if (upgrade.isJsonArray()) {
                        int upgradeItemId = upgrade.getAsJsonArray().get(0).getAsInt();
                        int upgradeItemStar = upgrade.getAsJsonArray().get(1).getAsInt();
                        String upgradeItemName = getItemTranslation(getKcItemStatusById(upgradeItemId, "name").get("name").getAsString());
                        String upgradeStarString = "";
                        if (upgradeItemStar > 0) {
                            upgradeStarString = upgradeStarString.concat(" ").concat("★").concat(String.valueOf(upgradeItemStar));
                        }
                        ((TextView) findViewById(getId("akashi_improv_detail_upgrade_".concat(String.valueOf(i + 1)), R.id.class)))
                                .setText("→ ".concat(upgradeItemName.concat(upgradeStarString)));
                    } else {
                        findViewById(getId("akashi_improv_detail_row3_".concat(String.valueOf(i + 1)), R.id.class)).
                                setVisibility(View.GONE);
                    }

                    JsonArray req = data.get("req").getAsJsonArray();
                    ((TextView) findViewById(getId("akashi_improv_support_".concat(String.valueOf(i + 1)), R.id.class)))
                            .setText(getSupportString(req, itemConvertException));
                }
                List<String> shipList = new ArrayList<>();
                List<String> shipNameList = new ArrayList<>();
                JsonObject shipName = new JsonObject();

                if (itemDefaultEquippedOn != null) {
                    for (JsonElement element : itemDefaultEquippedOn) {
                        String shipId = element.getAsString();
                        shipList.add(shipId);
                        JsonObject kcShipData = getKcShipDataById(Integer.parseInt(shipId), "name");
                        shipName.addProperty(shipId, getShipTranslation(kcShipData.get("name").getAsString(), false));
                    }
                    if (shipList.size() > 0) {
                        JsonObject shipRemovelLv = findRemodelLv(joinStr(shipList, ","));
                        for (int i = 0; i < shipList.size(); i++) {
                            String id = shipList.get(i);
                            shipNameList.add(KcaUtils.format("%s(%d)", shipName.get(id).getAsString(), shipRemovelLv.get(id).getAsInt()));
                        }
                        itemImprovDefaultShipTextView.setText(joinStr(shipNameList, " / "));
                    } else {
                        itemImprovDefaultShipTextView.setText("-");
                    }
                } else {
                    itemImprovDefaultShipTextView.setText("-");
                }

            } else {
                Toast.makeText(this, "??", Toast.LENGTH_LONG).show();
            }
        }
    }

    @Override
    public void onPause() {
        super.onPause();
       finish();
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    private String getConcatString(JsonArray array) {
        List<String> list = new ArrayList<>();
        for (JsonElement e : array) {
            list.add(e.getAsString());
        }
        return joinStr(list, " / ");
    }

    private String[] getMseString(JsonArray array, JsonObject item_count) {
        String[] value_list = new String[7];
        for (int i = 0; i < array.size(); i++) {
            value_list[i] = array.get(i).getAsString();
            if (i >= 4 && value_list[i].equals("0")) {
                value_list[i] = "-";
            } else if (value_list[i].equals("-1")) {
                value_list[i] = "?";
            }
        }

        if (!value_list[4].equals("-")) {
            int count = 0;
            if (item_count.has(value_list[4])) count = item_count.get(value_list[4]).getAsInt();
            String equipName = getItemTranslation(getKcItemStatusById(Integer.parseInt(value_list[4]), "name")
                    .get("name").getAsString());
            value_list[4] = equipName;
            value_list[6] = String.valueOf(count);
        }

        String material_data = value_list[0].concat(" / ").concat(value_list[1]);
        String screw_data = value_list[2].concat(" / ").concat(value_list[3]);
        String equip_data = "";
        if (value_list[4].equals("-")) {
            equip_data = value_list[4];
        } else {
            equip_data = KcaUtils.format( "%sx%s (%s)", value_list[4], value_list[5], value_list[6] );
        }
        String[] result = {material_data, screw_data, equip_data};
        return result;
    }


    private String getSupportString(JsonArray array, boolean exception) {
        String supportString = "";
        for (int i = 0; i < array.size(); i++) {
            List<String> daylist = new ArrayList<>();
            JsonArray item = array.get(i).getAsJsonArray();
            if (item.get(1).isJsonArray()) {
                JsonArray day = item.get(0).getAsJsonArray();
                for (int j = 0; j < day.size(); j++) {
                    if (day.get(j).getAsBoolean()) {
                        daylist.add(getStringWithLocale(getId("akashi_term_day_".concat(String.valueOf(j)), R.string.class)));
                    }
                }
                String daytext = joinStr(daylist, ",");

                int[] shiplist = removeKai(item.get(1).getAsJsonArray(), exception);
                for (int j = 0; j < shiplist.length; j++) {
                    JsonObject kcShipData = getKcShipDataById(shiplist[j], "name");
                    String shipname = getShipTranslation(kcShipData.get("name").getAsString(), false);
                    supportString = supportString.concat(KcaUtils.format("%s(%s)", shipname, daytext)).concat("\n");
                }
            } else {
                supportString = "-";
            }

        }
        return supportString.trim();
    }

    private List<Integer> getImprovedCount(String equip_id) {
        JsonArray user_equipment_data = dbHelper.getItemData();
        List<Integer> count = new ArrayList<>(11);
        for (int i = 0; i <= 10; i++) count.add(0);

        for (JsonElement data: user_equipment_data) {
            JsonObject equip = data.getAsJsonObject();
            JsonObject value = new JsonParser().parse(equip.get("value").getAsString()).getAsJsonObject();
            String slotitem_id = value.get("api_slotitem_id").getAsString();
            int level = value.get("api_level").getAsInt();
            if (equip_id.equals(slotitem_id)) {
                count.set(level, count.get(level) + 1);
            }
        }
        return count;
    }


    private JsonObject getItemCount(Set<String> equip_id) {
        JsonArray user_equipment_data = dbHelper.getItemData();
        String filtcond = getStringPreferences(getApplicationContext(), PREF_EQUIPINFO_FILTCOND);
        JsonObject count_result = new JsonObject();
        for (String e: equip_id) {
            count_result.addProperty(e, 0);
        }

        for (JsonElement data: user_equipment_data) {
            JsonObject equip = data.getAsJsonObject();
            JsonObject value = new JsonParser().parse(equip.get("value").getAsString()).getAsJsonObject();
            String slotitem_id = value.get("api_slotitem_id").getAsString();
            int level = value.get("api_level").getAsInt();
            if (level == 0 && equip_id.contains(slotitem_id)) {
                count_result.addProperty(slotitem_id, count_result.get(slotitem_id).getAsInt() + 1);
            }
        }
        return count_result;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Log.e("KCA", "lang: " + newConfig.getLocales().get(0).getLanguage() + " " + newConfig.getLocales().get(0).getCountry());
            KcaApplication.defaultLocale = newConfig.getLocales().get(0);
        } else {
            Log.e("KCA", "lang: " + newConfig.locale.getLanguage() + " " + newConfig.locale.getCountry());
            KcaApplication.defaultLocale = newConfig.locale;
        }
        if (getStringPreferences(getApplicationContext(), PREF_KCA_LANGUAGE).startsWith("default")) {
            LocaleUtils.setLocale(KcaApplication.defaultLocale);
        } else {
            String[] pref = getStringPreferences(getApplicationContext(), PREF_KCA_LANGUAGE).split("-");
            LocaleUtils.setLocale(new Locale(pref[0], pref[1]));
        }
        loadTranslationData(getApplicationContext());
        super.onConfigurationChanged(newConfig);
    }
}