#! /usr/bin/env python
# -*- coding: utf-8 -*-

#=======================================
# cpadel.py - genera calendario de partidos para n equipos
#-------------------------------------------------------------------------------------------------
# FJA - neocipres@telefonica.net  Febrero de 2007 (06/02/07)
#-------------------------------------------------------------------------------------------------
# Distribuido de acuerdo a los términos de la licencia GNU/GPL
#=======================================

__uso__ = '''\nAyuda:\n
\tcpadel.py - genera calendario de partidos para n equipos. Los
\tresultados se escriben en el archivo cpadel.out \n
\tUso: cpadel <numero de equipos>\n
        cpadel es un enlace a cpadel.py
\n'''
__autor__ = 'FJA - neocipres@telefonica.net     Febrero de 2007 (06/02/07)'

import sys, random

lpartidos = []
lindices = []
lpnoa = []
tparejas = ()
lsem = []
cero = 0, 0
nsem = 0
npartidos = 0
ind = 0

def raya( n ):
    rep = lambda p: p[0]*p[1]
    return rep((n, "="))
     
    
def generaLind( npartidos ):
    lista = []
    for i in range(npartidos):
        lista.append( i )
    random.shuffle( lista ) # permuta el contenido de la lista, la clave del cordero !!!
    return lista
    
def generaLnoa(npartidos, lpartidos):
    lista = []
    for i in range( npartidos ):
        lista.append( lpartidos[i] )
         
    return lista
    
def generaM( filas, cols):
    lista = []
    for i in range( 0, filas):
        fila = []
        for j in range(0 , cols):
            celda = cero
            fila.append( celda )
        lista.append( fila )
    return lista
    
def generaCal():
    salir = 0
    lineasInf = []
    
    # generamos los partidos
    try:
        ne = int( cadnum )
        for i in range( ne ):
            k = i + 1
            for j in range( k, ne ):
                if i+1 <> j+1:
                    tparejas = i+1, j+1
                lpartidos.append( tparejas) 
                
        
        npartidos = len( lpartidos )
        if ne % 2 == 0:
            ps = ne/2
            nsem = ( npartidos - npartidos % ps )/ps
        else:
            ps = ne/2 + ne % 2
            nsem = ( npartidos - npartidos % ps )/ps + ( ne - 1 )
              
        print "\n== Partidos a realizar por ", ne," equipos",raya(50), "\n"
        c = 0
        linea = []
        for i in range( npartidos ):
            print lpartidos[i], 
            linea.append( lpartidos[i] )
            c +=1
            if c > 9:
                print "\n"
                c = 0
                lineasInf.append( linea )
                linea = []
        lineasInf.append( linea )
        print "\n\n== Partidos: ", npartidos, raya(70), "\n"
        # generamos matriz
        lsem = generaM( nsem, ps )
        lpnoa = generaLnoa( npartidos, lpartidos )
        # la rellenamos con los partidos
        continuar = raw_input("\tPulsa enter ... ")
        while not salir:
            # aleatoriamente modificamos el orden de los índices, y a probar suerte ...
            lindices = generaLind( npartidos ) 
            for n in lindices:
                celda = lpartidos[n]
                a = celda[0]
                b = celda[1]
                for i in range( 0, nsem):
                    for j in range(0 , ps):
                        if a in lsem[i][j] or b  in lsem[i][j]:
                            break
                        else:
                            if lsem[i][j] == cero:
                                lsem[i][j] = celda
                                lpnoa.remove( celda ) 
                                ind = 1
                                break
                     
                        
                    if ind:
                        ind = 0
                        break
             
            print "\n",raya(70),"\n"    
            print "\tPartidos no adjudicados: ", len( lpnoa ), "\n\n\t", lpnoa
            print  "\n",raya(70),"\n"   
            if len( lpnoa ) == 0:
                salir = 1
            else:
                lsem = generaM( nsem, ps )
                lpnoa = generaLnoa( npartidos, lpartidos )
            #fin = raw_input("¿Repetir? (s/n): ")
            #if 'S' in fin.upper():
            #    lsem = generaM( nsem, ps )
            #    lpnoa = generaLnoa( npartidos, lpartidos )
            #else:
            #    salir = 1
        
        print "\n\t", nsem," jornadas\n"
        for i in range( len( lsem ) ):
            if i < 9:
                espacio = " "
            else:
                espacio = ""
            print "\tJornada ",espacio,i+1," - ",lsem[i]
        print "\n", raya(70), "\n"
        print "\tGenerando informe ...\n"
        informe = []
        informe.append("\n == Partidos a realizar por "+str(ne)+" equipos " + raya(50) +"\n\n")
        for i in range( len(lineasInf) ):
            informe.append( str(lineasInf[i])+"\n" )
            
        informe.append("\n\n == Partidos: "+str(npartidos)+" "+raya(70)+"\n\n")
        informe.append("\n "+str(nsem)+" jornadas")
        informe.append("\n"+raya(80)+"\n\n")
        for i in range( len( lsem ) ):
            if i < 9:
                espacio = " "
            else:
                espacio = ""
            informe.append(" Jornada "+espacio+str(i+1)+" - "+str(lsem[i])+"\n")
        informe.append("\n"+raya(80)+"\n")
        try:
            f = open('cpadel.out', 'w')
            for i in range( len( informe ) ):
                f.write( str(informe[i]) )
        except IOError, detalle:
            print "Error: ", detalle
        else:
            f.close()
            print "\n\tInforme generado en cpadel.out\n\n"
        
    except OSError, detalle:
        print "\n\t Error: ", detalle, "\n"
     
 
try:
    cadnum = sys.argv[1]
except IndexError:
    print raya(70)
    print  __uso__ 
    print "\t", __autor__ ,"\n"
    print raya(70)
    
else:
    generaCal()