package com.example;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.*;
import android.widget.*;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.HttpResponse;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.util.ArrayList;
import java.util.List;

public class MyActivity extends Activity {
    TableLayout tl = null;
    String userid, passwd, pf, pfHtml;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        buildTable();
    }

    public void download() {
        try {
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
            userid = prefs.getString("userid", "");
            passwd =  prefs.getString("passwd", "");
            pf = prefs.getString("pf", "");
            if (passwd == null || passwd == null || pf == null) {
                AlertDialog alertDialog = new AlertDialog.Builder(this).create();
                alertDialog.setTitle("Error!");
                alertDialog.setMessage("Call Settings first (Menu Button/Options).");
                alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });
                alertDialog.show();
                return;
            }

            DefaultHttpClient client = DefaultHttpClient.class.newInstance();
            // login: get challenge and 'u' from form
            HttpPost request1 = new HttpPost("https://login.yahoo.com/config/login_verify2?.intl=au&.src=ym&.done=http://finance.yahoo.com");
            HttpResponse response1 = client.execute(request1);
            String resp = EntityUtils.toString(response1.getEntity());
            int from = resp.indexOf("name=\".u\" value=\"") + 17;
            int to = resp.indexOf(">", from) - 1;
            String u = resp.substring(from, to);
            from = resp.indexOf("name=\".challenge\" value=\"") + 25;
            to = resp.indexOf(">", from) - 1;
            String challenge = resp.substring(from, to);

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("login", userid));
            nameValuePairs.add(new BasicNameValuePair("passwd", passwd));
            nameValuePairs.add(new BasicNameValuePair(".tries", "1"));
            nameValuePairs.add(new BasicNameValuePair(".src", "ym"));
            nameValuePairs.add(new BasicNameValuePair(".md5", ""));
            nameValuePairs.add(new BasicNameValuePair(".hash", ""));
            nameValuePairs.add(new BasicNameValuePair(".js", ""));
            nameValuePairs.add(new BasicNameValuePair(".last", ""));
            nameValuePairs.add(new BasicNameValuePair("promo", ""));
            nameValuePairs.add(new BasicNameValuePair(".intl", "de"));
            nameValuePairs.add(new BasicNameValuePair(".bypass", ""));
            nameValuePairs.add(new BasicNameValuePair(".partner", ""));
            nameValuePairs.add(new BasicNameValuePair(".u", u));
            nameValuePairs.add(new BasicNameValuePair(".v", "0"));
            nameValuePairs.add(new BasicNameValuePair(".challenge", challenge));
            nameValuePairs.add(new BasicNameValuePair(".yplus", ""));
            nameValuePairs.add(new BasicNameValuePair(".emailCode", ""));
            nameValuePairs.add(new BasicNameValuePair("pkg", ""));
            nameValuePairs.add(new BasicNameValuePair("stepid", ""));
            nameValuePairs.add(new BasicNameValuePair(".ev", ""));
            nameValuePairs.add(new BasicNameValuePair("hasMsgr", "0"));
            nameValuePairs.add(new BasicNameValuePair(".chkP", "Y"));
            nameValuePairs.add(new BasicNameValuePair(".done", "http://finance.yahoo.com"));
            nameValuePairs.add(new BasicNameValuePair(".pd", "ym_ver=0&c=&ivt=&sg="));
            nameValuePairs.add(new BasicNameValuePair("pad", "6"));
            nameValuePairs.add(new BasicNameValuePair("add", "6"));
            nameValuePairs.add(new BasicNameValuePair(".save", ""));
            nameValuePairs.add(new BasicNameValuePair(".persistent", "y"));

            HttpPost request2 = new HttpPost("https://login.yahoo.com/config/login?");
            request2.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            client.execute(request2); // dont need response

            HttpGet request3 = new HttpGet("http://finance.yahoo.com/portfolio/pf_" + pf + "/view/v2");
            HttpResponse response3 = client.execute(request3);

            HttpEntity resEntity = response3.getEntity();
            if (resEntity != null) {
                pfHtml = EntityUtils.toString(resEntity);
                buildTable();
            }
        } catch (Exception ex) {
            show("Error! Check settings. Exception was " + ex);
        }

    }
    // open the Options Menu at startup
    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        openOptionsMenu();
    }
    void buildTable() {
        if (pfHtml == null) {
            return;
        }
        String s = pfHtml;
        tl = (TableLayout) findViewById(R.id.txttable);
        tl.setPadding(5, 0, 5, 0);
        tl.removeAllViews();
        TableRow tr = new TableRow(this);
        tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
        addCol(tr, "Ticker");
        addCol(tr, "Price");
        addCol(tr, "Holding");
        addCol(tr, "Value");
        addCol(tr, "Gain");
        tl.addView(tr, new TableLayout.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
        int nxt = 0;
        String[] colnames = {"symbol", "price", "shares_owned", "holdings_value", "holdings_percent_gain"};
        while ((nxt = s.indexOf("<td class=\"col-symbol", nxt)) >= 0) {
            int end = s.indexOf("</tr>", nxt);
            String row = s.substring(nxt, end);
            tr = new TableRow(this);
            tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
            for (int col = 0; col < colnames.length; col++) {
                String colval = getCol(colnames[col], row);
                addCol(tr, colval);
                nxt = end;
            }
            tl.addView(tr, new TableLayout.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
        }
        int from = s.indexOf("<tr class=\"totals\">");
        int to = s.indexOf("</tr>", from);
        String holdval = getCol("holdings_value", s.substring(from, to));
        String holdgain = getCol("holdings_percent_gain", s.substring(from, to));
        tr = new TableRow(this);
        tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
        addCol(tr, "Total");
        addCol(tr, "");
        addCol(tr, "");
        addCol(tr, holdval);
        addCol(tr, holdgain);
        tl.addView(tr, new TableLayout.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
        tl.setSaveEnabled(true);
    }

    String getCol(String col, String str) {
        boolean minus = false;
        int from = str.indexOf("<td class=\"col-" + col);
        int to = str.indexOf("</td>", from);
        String s = str.substring(from, to);
        s = s.substring(s.lastIndexOf("<span "));
        if (s.contains("alt=\"down\"")) minus = true;
        s = s.replaceAll("<[^>]*>", "").replace("&#8364;", "");
        if (minus) {
            s = "-" + s.replace(" ", "");
        }
        return s;
    }

    void addCol(TableRow tr, String s) {
        TextView txt = new TextView(this);
        txt.setText(" " + s);
        if (s.matches("[0123456789\\.,%-]+")) txt.setGravity(Gravity.RIGHT);
        txt.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
        tr.addView(txt);
    }

    void show(String s) {
        TextView t = new TextView(this);
        t.setText(s);
        t.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
        tl.addView(t);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.actionbar, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.settings:
                startActivity(new Intent(this, Preferences.class));
                return true;
            case R.id.download:
                download();
                return true;
            case R.id.cancel:
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

}