package info.hxq.materialcalendar.proxy;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.text.format.Time;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.orhanobut.logger.Logger;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.IOException;

import inaka.com.tinytask.DoThis;
import inaka.com.tinytask.Something;
import inaka.com.tinytask.TinyTask;
import info.hxq.materialcalendar.db.DatabaseHelper;
import info.hxq.materialcalendar.entity.Taboo;
import info.hxq.materialcalendar.tool.AssetJSONLoad;
import info.hxq.materialcalendar.web.RQManager;

import static com.android.volley.Request.Method;

/**
 * Created by haoxiqiang on 15/3/20.
 */
public final class TabooProxy {

    public static final String FETCHURL = "http://www.123cha.com/calendar/js/";

    public static final String TABLENAME = "taboo";
    public static final String CREATE_TABLE =
            "CREATE TABLE " + TABLENAME + "(" +
                    "'date' text(8,0) NOT NULL," +
                    "'nongli' text," +
                    "'ganzhi' text," +
                    "'yi' text," +
                    "'ji' text," +
                    "'jishenyiqu' text," +
                    "'xiongshenyiji' text," +
                    "'taishenzhanfang' text," +
                    "'wuxing' text," +
                    "'chong' text," +
                    "'pengzubaiji' text," +
                    "PRIMARY KEY(date)" +
                    ");";
    private static final int SAVEYEAR = 2015;

    public static void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion < DatabaseHelper.DATABASE_VERSION) {
            db.execSQL("DROP TABLE IF EXISTS " + TABLENAME + ";");
            db.execSQL(CREATE_TABLE);
        }
    }

    public static void fetchJSContent() {
        RequestQueue requestQueue = RQManager.getInstance().getRequestQueue();
        for (int i = (SAVEYEAR - 10); i < (SAVEYEAR + 10); i++) {
            final String datePrefix = String.valueOf(i);
            StringRequest stringRequest = new StringRequest(Method.GET, FETCHURL + datePrefix + ".js", new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    String result = response.substring(response.indexOf("=") + 1, response.length() - 3) + "]";
                    try {
                        AssetJSONLoad.json2file(datePrefix + ".json", result);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                /* TODO Auto-generated method stub */

                }
            });
            requestQueue.add(stringRequest);
        }
        requestQueue.start();
    }

    public static void init() {
        if (SettingProxy.hasTabooInit()) {
            return;
        }

        try {
            JSONArray jsonArray = AssetJSONLoad.loadJsonArray("taboo/" + SAVEYEAR + ".json");
            for (int j = 0; j < jsonArray.length(); j++) {
                insertTaboo(jsonArray.getJSONObject(j), String.valueOf(SAVEYEAR));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        TinyTask.perform(new Something<String>() {
            @Override
            public String whichDoes() {
                for (int i = (SAVEYEAR - 10); i < (SAVEYEAR + 10); i++) {
                    if (SAVEYEAR == i) {
                        continue;
                    }
                    final String datePrefix = String.valueOf(i);
                    try {
                        JSONArray jsonArray = AssetJSONLoad.loadJsonArray("taboo/" + datePrefix + ".json");
                        for (int j = 0; j < jsonArray.length(); j++) {
                            insertTaboo(jsonArray.getJSONObject(j), datePrefix);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                return "success";
            }

        }).whenDone(new DoThis<String>() {
            @Override
            public void ifOK(String result) {
                Logger.i(result);
            }

            @Override
            public void ifNotOK(Exception e) {
                Logger.e(e);
            }
        }).go();

        SettingProxy.saveTabooInit();
    }

    public static void insertTaboo(JSONObject tabooObj, String datePrefix) {
        /**
         * <pre>
         "0": "辛卯年、生肖属兔、庚子月、辛酉日",
         "1": "厨灶门外东南",
         "2": "石榴木 收执位",
         "3": "冲兔(乙卯)煞东",
         "4": "辛不合酱主人不尝 酉不宴客醉坐颠狂",
         "5": "母仓 要安 除神 明堂 鸣犬",
         "6": "祭祀 开光 理发 整手足甲 安床 作灶 扫舍 教牛马",
         "7": "五离 河魁 大时 大败 咸池 四耗 地曩",
         "8": "伐木 纳畜 破土 安葬 开生坟 嫁娶 开市 动土 交易 作梁",
         "nongli": "公元2012年01月01日 农历12月(小)08日 星期日 山羊座",
         "riqi": "d0101"
         </pre>
         */
        SQLiteDatabase db = DatabaseHelper.getDatabase();
        Cursor cursor = null;
        try {
            String riqi = tabooObj.getString("riqi");
            riqi = riqi.substring(1, riqi.length());
            String date = datePrefix + riqi;
            cursor =
                    db.query(TABLENAME, new String[]{"date"}, "date = ?", new String[]{date}, null,
                            null, null);
            ContentValues contentValues = new ContentValues();
            contentValues.put("date", date);
            contentValues.put("nongli", tabooObj.getString("nongli"));
            contentValues.put("ganzhi", tabooObj.optString("0"));
            contentValues.put("yi", tabooObj.optString("6"));
            contentValues.put("ji", tabooObj.optString("8"));
            contentValues.put("jishenyiqu", tabooObj.optString("5"));
            contentValues.put("xiongshenyiji", tabooObj.optString("4"));
            contentValues.put("taishenzhanfang", tabooObj.optString("7"));
            contentValues.put("wuxing", tabooObj.optString("2"));
            contentValues.put("chong", tabooObj.optString("3"));
            contentValues.put("pengzubaiji", tabooObj.optString("4"));
            if (cursor.getCount() == 0) {
                db.insert(TABLENAME, null, contentValues);
            } else {
                db.update(TABLENAME, contentValues, "date=?", new String[]{date});
            }
        } catch (Exception e) {
            Logger.d(e.getMessage());
        } finally {
            if (cursor != null && !cursor.isClosed()) {
                cursor.close();
            }
        }
    }

    public static Taboo getTodayTaboo() {
        Time time = new Time();
        time.setToNow();
        int month = time.month + 1;
        String todayDate = String.valueOf(time.year) + String.valueOf(month < 10 ? "0" + month : month) + String.valueOf(time.monthDay);
        return getTabooByDate(todayDate);
    }

    public static Taboo getTabooByDate(String dateParam) {
        Taboo taboo;
        Logger.e("dateParam:" + dateParam);
        SQLiteDatabase db = DatabaseHelper.getDatabase();
        Cursor cursor =
                db.query(TABLENAME, new String[]{"date", "nongli", "ganzhi", "yi",
                                "ji", "jishenyiqu", "xiongshenyiji", "taishenzhanfang", "wuxing", "chong", "pengzubaiji"}, "date = ?", new String[]{dateParam}, null,
                        null, null);
        if (cursor.getCount() == 0) {
            Logger.d("query todayDate:" + dateParam + "  is  0");
            taboo = null;
        } else {
            cursor.moveToFirst();
            taboo = new Taboo();
            taboo.date = cursor.getString(0);
            taboo.nongli = cursor.getString(1);
            taboo.ganzhi = cursor.getString(2);
            taboo.yi = cursor.getString(3);
            taboo.ji = cursor.getString(4);
            taboo.jishenyiqu = cursor.getString(5);
            taboo.xiongshenyiji = cursor.getString(6);
            taboo.taishenzhanfang = cursor.getString(7);
            taboo.wuxing = cursor.getString(8);
            taboo.chong = cursor.getString(9);
            taboo.pengzubaiji = cursor.getString(10);
        }
        cursor.close();
        return taboo;
    }
}