package com.topjohnwu.magisk.module;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.Log;

import com.topjohnwu.magisk.R;
import com.topjohnwu.magisk.utils.Utils;
import com.topjohnwu.magisk.utils.WebRequest;

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

import java.util.Date;

public class Repo extends BaseModule {
    protected String repoName, mLogUrl, mManifestUrl, mZipUrl;
    protected Date mLastUpdate;
    protected boolean mIsInstalled = false, mCanUpdate = false;

    public Repo(Context context, String name, Date lastUpdate) {
        repoName = name;
        mLastUpdate = lastUpdate;
        mLogUrl = context.getString(R.string.file_url, repoName, "changelog.txt");
        mManifestUrl = context.getString(R.string.file_url, repoName, "module.prop");
        mZipUrl = context.getString(R.string.zip_url, repoName);
        update();
    }

    public void update() {
        String props = WebRequest.makeWebServiceCall(mManifestUrl, WebRequest.GET, true);
        String lines[] = props.split("\\n");
        parseProps(lines);
    }

    public void update(Date lastUpdate) {
        if (lastUpdate.after(mLastUpdate)) {
            mLastUpdate = lastUpdate;
            update();
        }
    }

    public String getZipUrl() {
        return mZipUrl;
    }

    public String getLogUrl() {
        return mLogUrl;
    }

    public String getManifestUrl() {
        return mManifestUrl;
    }

    public Date getLastUpdate() {
        return mLastUpdate;
    }

    public boolean isInstalled() { return mIsInstalled; }
    public boolean canUpdate() { return mCanUpdate; }
    public boolean isCacheModule() { return mIsCacheModule; }
}

//public class Repo {
//    private String mBaseUrl;
//    private String mZipUrl;
//    private String mLogUrl;
//    private String mManifestUrl;
//    private String mVersion;
//    private String mName;
//    private String mDescription;
//    private String mAuthor;
//    public String mAuthorUrl;
//    private String mId;
//    private String mVersionCode;
//    private String mSupportUrl;
//    private String mDonateUrl;
//    private String lastUpdate;
//    private Context appContext;
//    private boolean mIsInstalled,mCanUpdate,mIsCacheModule;
//
//
//    public Repo(String manifestString, Context context) {
//        appContext = context;
//        ParseProps(manifestString);
//
//    }
//
//
//
//    public Repo(String name, String url, Date updated, Context context) {
//        appContext = context;
//        this.mName = name;
//        this.mBaseUrl = url;
//        this.lastUpdate = updated.toString();
//
//        this.fetch();
//
//    }
//
//    public Repo(String moduleName, String moduleDescription, String zipUrl, Date lastUpdated, Context context) {
//        appContext = context;
//        this.mZipUrl = zipUrl;
//        this.mDescription = moduleDescription;
//        this.mName = moduleName;
//        this.lastUpdate = lastUpdated.toString();
//        this.fetch();
//
//    }
//
//    public void fetch() {
//
//        // Construct initial url for contents
//        String repoString = WebRequest.makeWebServiceCall(mBaseUrl + "/contents?access_token=" + Utils.procFile(appContext.getString(R.string.some_string), appContext), WebRequest.GET);
//        try {
//            JSONArray repoArray = new JSONArray(repoString);
//            for (int f = 0; f < repoArray.length(); f++) {
//                JSONObject jsonobject = repoArray.getJSONObject(f);
//                String name = jsonobject.getString("name");
//                String url = jsonobject.getString("download_url").trim();
//                Log.d("Magisk","Repo - checking object named " + name + " with value of " + url);
//                if (name.contains(".zip")) {
//                    this.mZipUrl = url;
//                }
//                if (name.equals("module.prop")) {
//                    this.mManifestUrl = url;
//                }
//                if (name.contains("log.txt")) {
//                    Log.d("Magisk","Repo: Setting log URL for " + name + " of " +  url);
//                    this.mLogUrl = url;
//                }
//            }
//        } catch (JSONException e) {
//            e.printStackTrace();
//        }
//
//        String manifestString = WebRequest.makeWebServiceCall(mManifestUrl, WebRequest.GET, true);
//
//        if (ParseProps(manifestString)) {
//            PutProps(manifestString);
//        }
//
//    }
//
//    private void PutProps(String manifestString) {
//        manifestString = manifestString + "zipUrl=" + mZipUrl + "\nbaseUrl=" + mBaseUrl + "\nlogUrl=" + mLogUrl + "\nmanifestUrl=" + mManifestUrl;
//        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
//        SharedPreferences.Editor editor = prefs.edit();
//        editor.putString("repo_" + mId, manifestString);
//        editor.putBoolean("hasCachedRepos", true);
//        editor.putString("updated_" + mId, this.lastUpdate);
//        editor.apply();
//    }
//    private boolean ParseProps(String string) {
//
//        if ((string.length() <= 1) | (!string.contains("id"))) {
//            return false;
//        } else {
//            String lines[] = string.split("\\n");
//            for (String line : lines) {
//                if (line != "") {
//                    String props[] = line.split("=");
//                    switch (props[0]) {
//                        case "versionCode":
//                            this.mVersionCode = props[1];
//                            break;
//                        case "name":
//                            this.mName = props[1];
//                            break;
//                        case "author":
//                            this.mAuthor = props[1];
//                            break;
//                        case "id":
//                            this.mId = props[1];
//                            break;
//                        case "version":
//                            this.mVersion = props[1];
//                            break;
//                        case "description":
//                            this.mDescription = props[1];
//                            break;
//                        case "donate":
//                            this.mDonateUrl = props[1];
//                            break;
//                        case "cacheModule":
//                            this.mIsCacheModule = Boolean.valueOf(props[1]);
//                            break;
//                        case "support":
//                            this.mSupportUrl = props[1];
//                            break;
//                        case "logUrl":
//                            this.mLogUrl = props[1];
//                            break;
//                        case "donateUrl":
//                            this.mDonateUrl = props[1];
//                            break;
//                        case "zipUrl":
//                            this.mZipUrl = props[1];
//                            break;
//                        case "baseUrl":
//                            this.mBaseUrl = props[1];
//                            break;
//                        case "manifestUrl":
//                            this.mManifestUrl = props[1];
//                            break;
//                        default:
//                            Log.d("Magisk", "Manifest string not recognized: " + props[0]);
//                            break;
//                    }
//                }
//
//            }
//            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
//                if (prefs.contains("repo-isInstalled_" + this.mId)) {
//                    mIsInstalled = prefs.getBoolean("repo-isInstalled_" + this.mId,false);
//                }
//                if (prefs.contains("repo-canUpdate_" + this.mId)) {
//                    mCanUpdate = prefs.getBoolean("repo-canUpdate_" + this.mId,false);
//                }
//                if (prefs.contains("updated_" + this.mId)) {
//                    lastUpdate = prefs.getString("updated_" + this.mId,"");
//                }
//
//
//
//            return this.mId != null;
//
//        }
//    }
//
//
//
//
//
//
//
//
//    public String getStringProperty(String mValue) {
//        switch (mValue) {
//            case "author":
//                return mAuthor;
//            case "id":
//                return mId;
//            case "version":
//                return mVersion;
//            case "description":
//                return mDescription;
//            case "supportUrl":
//                return mSupportUrl;
//            case "donateUrl":
//                return mDonateUrl;
//            case "baseeUrl":
//                return mBaseUrl;
//            case "zipUrl":
//                return mZipUrl;
//            default:
//                return null;
//        }
//    }
//
//    public String getName() {
//        return mName;
//    }
//
//    public String getmVersion() {
//        return mVersion;
//    }
//
//    public int getmVersionCode() {
//        return Integer.valueOf(mVersionCode);
//    }
//
//    public String getDescription() {
//        return mDescription;
//    }
//
//    public String getId() {
//        return mId;
//    }
//
//    public String getZipUrl() {
//        return mZipUrl;
//    }
//
//    public String getmBaseUrl() {
//        return mBaseUrl;
//    }
//
//    public String getLogUrl() {
//        return mLogUrl;
//    }
//
//
//    public String getAuthor() {
//        return mAuthor;
//    }
//
//    public String getDonateUrl() {
//        return mDonateUrl;
//    }
//
//    public String getmManifestUrl() {
//        return mManifestUrl;
//    }
//
//    public String getSupportUrl() {
//        return mSupportUrl;
//    }
//
//    public String getLastUpdate() {
//        return lastUpdate;
//    }
//
//    public boolean isInstalled() { return mIsInstalled; }
//    public boolean canUpdate() { return mCanUpdate; }
//    public boolean isCacheModule() { return mIsCacheModule; }
//}

