from candidates import *
from voters import *
from plurality import *
from borda import *
from copeland import *
from approval import *
from stv import *
from copy import deepcopy

OUTPUT = 'election.el'
OUTPUTHTML = 'election_results.html'

html = """
<html>
<title>Election Results</title>
<head>
<link rel="stylesheet" href="../voting.css"/>
<script type="text/javascript" src="../MochiKit/MochiKit.js"></script>
<script type="text/javascript" src="../PlotKit/Base.js"></script>
<script type="text/javascript" src="../PlotKit/Layout.js"></script>
<script type="text/javascript" src="../PlotKit/Canvas.js"></script>
<script type="text/javascript" src="../PlotKit/SweetCanvas.js"></script>
<script src="sifr.js" type="../text/javascript"></script>
</head>

<h1>Results for %s</h1>
<p>
The candidates: %s
<br>
Number of voters: %i
</p>


<div class="results">
    <div class="pie">
        <h2>Plurality:</h2>
        <p>
        %s
        </p>
        <div><canvas id="plur_pie" height="200" width="200"></canvas></div>
    </div>
    <div class="pie">
        <h2>Borda Count:</h2>
        <p>
        %s
        </p>

        <div><canvas id="bord_pie" height="200" width="200"></canvas></div>
    </div>
    <div class="pie">
        <h2>Approval:</h2>
        <p>
        %s
        </p>
        <div><canvas id="appr_pie" height="200" width="200"></canvas></div>
    </div>
    <div class="pie">
        <h2>Even and Equal:</h2>
        <p>
        %s
        </p>
        <div><canvas id="even_pie" height="200" width="200"></canvas></div>
    </div>
</div>
<div class="results">
    <div class="copeland">
        <h2>Copeland:</h2>
        <p>
        %s
        </p>
        <div class='o'><canvas id="cope_bar" height="200" width="400"></canvas></div>
    </div>
    <div class="stv">
        <h2>STV:</h2>
        <p>
        %s
        </p>
        <div class='o'><canvas id="stv_line" height="200" width="400"></canvas></div>
    </div>
</div>

<script type="text/javascript">
var options = {
   "IECanvasHTC": "/plotkit/iecanvas.htc",
   "colorScheme": PlotKit.Base.baseVoting(),
   "shouldStroke": false,
   "drawBackground": false,
   "axisLabelColor": MochiKit.Color.Color.fromHexString("#111111"),
   "padding": {left: 0, right: 0, top: 10, bottom: 30},
   "xTicks": %s,
   "drawYAxis": false
};

var options_bar = {
   "IECanvasHTC": "/plotkit/iecanvas.htc",
   "colorScheme": PlotKit.Base.baseVoting(),
   "shouldStroke": false,
   "drawBackground": false,
   "axisLabelColor": MochiKit.Color.Color.fromHexString("#111111"),
   "padding": {left: 0, right: 0, top: 10, bottom: 30},
   "xTicks": %s,
   "yNumberOfTicks": 3,
   "drawYAxis": true,
   "yTickPrecision": 0
};

var options_line = {
   "IECanvasHTC": "/plotkit/iecanvas.htc",
   "colorScheme": PlotKit.Base.baseVoting(),
   "shouldStroke": true,
   "shouldFill": false,
   "drawBackground": false,
   "axisLabelColor": MochiKit.Color.Color.fromHexString("#111111"),
   "padding": {left: 0, right: 0, top: 10, bottom: 30},
   "drawYAxis": true,
   "yTickPrecision": 0
};



function drawGraph() {
    var plur_lay = new PlotKit.Layout("pie", options);
    var bord_lay = new PlotKit.Layout("pie", options);    
    var appr_lay = new PlotKit.Layout("pie", options);    
    var even_lay = new PlotKit.Layout("pie", options);    
    var cope_lay = new PlotKit.Layout("bar", options_bar);
    var stv_lay = new PlotKit.Layout("line", options_line);

    plur_lay.addDataset("plur", %s);
    bord_lay.addDataset("bord", %s);
    appr_lay.addDataset("appr", %s);
    even_lay.addDataset("even", %s);
    cope_lay.addDataset("cope", %s);
%s

    plur_lay.evaluate();
    bord_lay.evaluate();
    appr_lay.evaluate();
    even_lay.evaluate();
    cope_lay.evaluate();
    stv_lay.evaluate();
    
    var plur_can = MochiKit.DOM.getElement("plur_pie");
    var plur_plot = new PlotKit.SweetCanvasRenderer(plur_can, plur_lay, options);    
    var bord_can = MochiKit.DOM.getElement("bord_pie");
    var bord_plot = new PlotKit.SweetCanvasRenderer(bord_can, bord_lay, options);
    var appr_can = MochiKit.DOM.getElement("appr_pie");
    var appr_plot = new PlotKit.SweetCanvasRenderer(appr_can, appr_lay, options);
    var even_can = MochiKit.DOM.getElement("even_pie");
    var even_plot = new PlotKit.SweetCanvasRenderer(even_can, even_lay, options);

    var cope_can = MochiKit.DOM.getElement("cope_bar");
    var cope_plot = new PlotKit.SweetCanvasRenderer(cope_can, cope_lay, options_bar);  
    var stv_can = MochiKit.DOM.getElement("stv_line");
    var stv_plot = new PlotKit.SweetCanvasRenderer(stv_can, stv_lay, options_line);   
          
    plur_plot.render();
    bord_plot.render();
    appr_plot.render();        
    even_plot.render();
    cope_plot.render();        
    stv_plot.render();         
}
MochiKit.DOM.addLoadEvent(drawGraph);
</script>

</body>
</html>
"""

class election():
    title = None
    candidates = None
    num_voters = None
    v = None
    p = None
    b = None
    a = None
    e = None
    co = None
    st = None


    def __init__(self,input,title,cands=None):
        self.v = voters.parser(input)
        self.num_voters = self.v.num_voters
        if cands == None:
            self.candidates = self.v.cands.candidates
        else:
            self.candidates = cands
        self.p = plurality(self.v) 
        self.b = borda(self.v)
        self.a = approval(self.v)
        self.e = approval(self.v, 'even_and_equal')
        self.co = copeland(self.v)
        self.st = stv(self.v)
        self.title = title

        
    def outputhtml(self,out=OUTPUTHTML):
        f = open(out, "w")
        i = 0
        l = len(self.candidates)
        sl = []
        s = ''
        for c in self.candidates:
            s += '{v:%i, label:"%s"}' % (i, c)
            if i < l-1:
                s+= ','
            i += 1
        sl.append('[%s]'%s)
        sl.append('[%s]'%s)

        i = 0
        s = ''
        for c in self.candidates:
            v = self.p.score()[c]
            s += '[%i,%i]'%(i,v)
            if i < l-1:
                s+= ','
            i += 1
        sl.append('[%s]'%s)

        i = 0
        s = ''
        for c in self.candidates:
            v = self.b.score()[c]
            s += '[%i,%i]'%(i,v)
            if i < l-1:
                s+= ','
            i += 1
        sl.append('[%s]'%s)

        i = 0
        s = ''
        for c in self.candidates:
            v = self.a.score()[c]
            s += '[%i,%i]'%(i,v)
            if i < l-1:
                s+= ','
            i += 1
        sl.append('[%s]'%s)

        i = 0
        s = ''
        for c in self.candidates:
            v = self.e.score()[c]
            s += '[%i,%f]'%(i,v)
            if i < l-1:
                s+= ','
            i += 1
        sl.append('[%s]'%s)

        i = 0
        s = ''
        for c in self.candidates:
            v = self.co.score()[c]
            s += '[%i,%f]'%(i,v)
            if i < l-1:
                s+= ','
            i += 1
        sl.append('[%s]'%s)


        s = ''
        self.st.score()
        hs = deepcopy(self.st.had_scores)
        for ca,va in hs.iteritems():
            if len(va) == 1:
                va.append(va[0])
        for c in self.candidates:
            j = 0
            t = ''
            for v in hs[c]:
                t += '[%i,%i]'%(j,v)
                if j < l-1:
                    t+= ','
                j += 1
            u = '    stv_lay.addDataset("%s", [%s]);\n' % (c, t)
            s += u          
        sl.append(s)

        htmlvals = (
          self.title, 
          str(self.candidates), 
          self.num_voters, 
          str(self.p),
          str(self.b),
          str(self.a),
          str(self.e),
          str(self.co),
          str(self.st),
          sl[0],
          sl[1],
          sl[2],
          sl[3],
          sl[4],
          sl[5],
          sl[6],
          sl[7]                 
          )
        f.write(html % htmlvals)
        f.close()

