#encoding=utf-8
#import math

# Užil jsem ke článku:
# python zpracuj.py >64.txt

from __future__ import division
strany=["North","South","East","West"]
ns=strany[0:2]; ew=strany[2:4]
#getcontext().prec = 6 # balíček decimal
#http://pythonhosted.org/bigfloat/
#from mpmath import *
#mp.dps = 2

# Termíny dle goulash webu, http://playbridge.com/pb_gen_goulash.php
# Do článku: http://playbridge.com/pb_get_boards.php?set_id=PP3655Y
#  platnost končí v dubnu 2014
bezy=["notrump"]
drahe=["spades","hearts"]
levne=["diamonds","clubs"]
from collections import defaultdict
strana=""
bodu=0


##### Jednoduché funkce na výpis prvního a posledního řádku tabulek
# První řádek
def uvodniradek():
 print "Linka Zapasováno      Závazek          Slem    Počet"
 print "                 částečný celoherní malý velký"

# Poslední řádek
def radekpocet():
 kontrolaA=0
 print "Počet",
 for mvypis in ["passed","partial","game","small","grand"]:
  print kontrolaall[mvypis],
  kontrolaA+=kontrolaall[mvypis]
 print kontrolaA
 print


##### Hlavní cyklus přes vstupní soubory
for soubor in ["64mych3zpracuj.txt", "64cizi3zpracuj.txt"]:
 # "64cizi3zpracuj.txt", "64mych3zpracuj.txt"
 #f=open(soubor[0:6]+"6.txt","w")
 data=[]; uprava=[]
 nsbodu=0; ewbodu=0
 nsher=0; ewher=0
 nsprutok=0; ewprutok=0
 nslevel=0; ewlevel=0
 urovne=defaultdict(int)
 print "\nZpracovávám "+soubor+"..."
 
 for radek in open(soubor,"r").readlines():
  data.append(radek.strip().split())

 for polozka in data:
  #print polozka
  posledni=polozka[len(polozka)-1]
  
  if posledni in strany:
   strana=posledni
   level=int(polozka[1])
   barva=polozka[2]
   #urovne[level]+=1
  else: 
   bodu=int(posledni)

   # Tady to mám složitě, přešel jsem pak na defaultdict...   
   if strana in ew: 
    bodu=-bodu
    ewbodu+=bodu
    ewher+=1
    ewprutok+=abs(bodu)
    ewlevel+=level
    mstrana="EW"
   else:
    nsbodu+=bodu
    nsher+=1
    nsprutok+=abs(bodu)
    nslevel+=level
    mstrana="NS"

   if bodu<0:
    znacka="-"
   else:
    znacka="+"
   zapis=mstrana+znacka+str(level)
   urovne[zapis]+=1

   # Roztřídění do passed, partial, game       
   if bodu==0: urovne["+"+"passed"+mstrana]+=1
   elif level==6: urovne[znacka+"small"+mstrana]+=1
   elif level==7: urovne[znacka+"grand"+mstrana]+=1
   elif level>=3 and barva in bezy: urovne[znacka+"game"+mstrana]+=1
   elif level>=4 and barva in drahe: urovne[znacka+"game"+mstrana]+=1
   elif level==5 and barva in levne: urovne[znacka+"game"+mstrana]+=1
   else: urovne[znacka+"partial"+mstrana]+=1 #print polozka,level, barva
   
   uprava.append([strana,bodu])


 ##### Úvodní informace
 #print uprava
 print
 print "ns bodů",nsbodu,"ew bodů",ewbodu
 print "ns her", nsher,"ew her",ewher
 print "ns bodů průměr","{0:.2f}".format(nsbodu/nsher),"ew bodů průměr","{0:.2f}".format(ewbodu/ewher)
 print "oba","{0:.2f}".format((nsbodu+ewbodu)/(nsher+ewher))
 #print nslevel, ewlevel
 print "ns level,", "{0:.2f}".format(nslevel/nsher)
 print "ew level,", "{0:.2f}".format(ewlevel/ewher)
 #http://stackoverflow.com/questions/2389846/python-decimals-format
 #http://stackoverflow.com/questions/8234445/python-format-output-string-right-alignment
 #print "{0:.4f}".format(2/5)
 print
 print "ns průtok", nsprutok, "ew průtok", ewprutok
 print "ns her", nsher,"ew her",ewher
 print "ns průtok průměr","{0:.2f}".format(nsprutok/nsher),"ew průtok průměr","{0:.2f}".format(ewprutok/ewher)
 print "oba","{0:.2f}".format((nsprutok+ewprutok)/(nsher+ewher))
 print 
 

 ##### Výpis úrovní
 # První tabulka
 #print urovne
 print "Linka",
 for level in range(0,8):
  print level,
 print "Počet","Průměr"
 prumerall=0; prumerallkolik=0
 for tiskstrana in ["NS","EW"]:
  for tiskutok in ["+","-"]:
   prumer=0; prumerkolik=0
   for tisklevel in range(0,8):
    cochci=tiskstrana+tiskutok+str(tisklevel)
    if tisklevel==0: print tiskstrana+tiskutok,
    print urovne[cochci], #"{0:2}".format(urovne[cochci]),
    prumer+=urovne[cochci]*tisklevel
    prumerkolik+=urovne[cochci]
    urovne[tisklevel]+=urovne[cochci]
    urovne[tiskstrana+str(tisklevel)]+=urovne[cochci]
    urovne[tiskutok+str(tisklevel)]+=urovne[cochci]
   prumerall+=prumer
   prumerallkolik+=prumerkolik
   print prumerkolik, # "{0:3}".format(prumerkolik), "",
   print "{0:.2f}".format(prumer/prumerkolik)   
 print "Počet",
 for tisklevel in range(0,8):
  print urovne[tisklevel],
 print prumerallkolik, 
 print "{0:.2f}".format(prumerall/prumerallkolik)
 print

 # Další dvě tabulky
 # Přeházené: NS+EW; "+" a "-"
 for mujcyklus in [["NS","EW"], ["+","-"]]:
  print "Linka",
  for level in range(0,8):
   print level,
  print "Počet","Průměr"
  prumerall=0; prumerallkolik=0
  for vytiskni in mujcyklus:
    prumer=0; prumerkolik=0
    for tisklevel in range(0,8):
     cochci=vytiskni+str(tisklevel)
     if tisklevel==0: print vytiskni,
     print urovne[cochci], #"{0:2}".format(urovne[cochci]),
     prumer+=urovne[cochci]*tisklevel
     prumerkolik+=urovne[cochci]
     #urovne[tisklevel]+=urovne[cochci]
    prumerall+=prumer
    prumerallkolik+=prumerkolik
    print prumerkolik, #"{0:3}".format(prumerkolik), "",
    print "{0:.2f}".format(prumer/prumerkolik)   
  print "Počet",
  for tisklevel in range(0,8):
   print urovne[tisklevel],
  print prumerallkolik, 
  print "{0:.2f}".format(prumerall/prumerallkolik)
  print


 ##### Výše závazku
 # První tabulka
 uvodniradek()
 kontrolaall=defaultdict(int)
 for mastrana in ["NS","EW"]:
  for mznacka in ["+","-"]:
   kontrola=0
   print mastrana+mznacka,
   for mvypis in ["passed","partial","game","small","grand"]:
    kontrola+=urovne[mznacka+mvypis+mastrana]
    kontrolaall[mastrana+mvypis]+=urovne[mznacka+mvypis+mastrana]
    kontrolaall[mznacka+mvypis]+=urovne[mznacka+mvypis+mastrana]
    #kontrolaall[mastrana+mznacka]+=urovne[mznacka+mvypis+mastrana]
    kontrolaall[mvypis]+=urovne[mznacka+mvypis+mastrana]
    print urovne[mznacka+mvypis+mastrana],
   print kontrola
 radekpocet()

 # Další dvě tabulky
 for vnejsicyklus in [["NS","EW"], ["+","-"]]:
  uvodniradek()
  for vnitrnicyklus in vnejsicyklus:
   print vnitrnicyklus,
   kontrolaA=0
   for mvypis in ["passed","partial","game","small","grand"]:
    print kontrolaall[vnitrnicyklus+mvypis],
    kontrolaA+=kontrolaall[vnitrnicyklus+mvypis]
   print kontrolaA
  radekpocet()
  


