#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  libSIIAU.py
#  
#  Copyright 2017 ImNotRoot <https://github.com/ImNotRoot>
#  
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 3 of the License, or
#  (at your option) any later version.
#  
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#  
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#
#

#from commands import getoutput, getstatusoutput
from requests import get, post

import sys, time, os

class AuthenticationError(BaseException):
    def __init__(self, message):
        self.message = message
        super(AuthenticationError, self).__init__(message)

class Alumno:
	__UA="User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36"
	__URL="http://siiauescolar.siiau.udg.mx"
	
	__headers = {
		'User-Agent': __UA,
	}
	
	__COOKIES=""
	__majrp=""
	
	codigo=""
	nip=""
	nombre=""
	items=[]
	carreras=[]
	valido=True
	
	pidm=""
	
	def __getCarreras(self,url):
		#cmd="curl -L -b cookies.txt -i -A '"+self.__UA+"' -X GET '"+self.__URL+""+url+"'"
		r=get(self.__URL+""+url,headers=self.__headers,cookies=self.__COOKIES)
		#out=getoutput(cmd)
		out=r.text
		if("OPTION" in out):
			cab='<OPTION value="'
			while(cab in out):
				temp=""
				val1=""
				val2=""
				out=out[out.find(cab)+len(cab):]
				temp=out[:out.find('"')]
				val1=temp[:temp.find("-")]
				val2=temp[temp.find("-")+1:]
				temp={"carrera":val1,"inicio":val2}
				self.items.append(temp)
		else:
			self.items.append(None)
		self.__getInfoBasica()
	
	def __getLink(self):
		#cmd="curl -L -b cookies.txt -i -A '"+self.__UA+"' -X GET siiauescolar.siiau.udg.mx/wus/gupmenug.menu_sistema?p_pidm_n="+str(self.pidm)
		r=get("http://siiauescolar.siiau.udg.mx/wus/gupmenug.menu_sistema?p_pidm_n="+str(self.pidm),headers=self.__headers,cookies=self.__COOKIES)
		out=r.text
		#out=getoutput(cmd)
		grado=""
		flag=True
		cab='<img src="/ows-img/closed.gif" alt="'
		cab2='<a href="'
		while(cab in out and flag):
			out=out[out.find(cab)+len(cab):]
			grado=out[:out.find('"')]
			out=out[out.find(cab2)+len(cab2):]
			link=out[:out.find('"')]
			#print link
			if(" " not in link):
				#print link
				flag=False
				self.__getCarreras(link)
		if(flag):
			self.items.append(None)
			self.__getInfoBasica();
			#print "Por el momento el API no soporta la extracción de datos para alumnos solamente con preparatoria"
	
	def __getPidm(self,text):
		cab='p_bienvenida_c" VALUE="'
		text=text[text.find(cab)+len(cab):]
		text=text[:text.find('"')]
		self.pidm=text
		#print text
	
	def __getInfoBasica(self):
		encuesta=False
		for info in self.items:
			if(info==None):
				#cmd="curl -L -b cookies.txt -i -A '"+self.__UA+"' -X GET 'siiauescolar.siiau.udg.mx/wal/sgphist.ficha?pidmp="+self.pidm+"'"
				r=get("http://siiauescolar.siiau.udg.mx/wal/sgphist.promedio?pidmp="+self.pidm,headers=self.__headers,cookies=self.__COOKIES)
			else:
				#cmd="curl -L -b cookies.txt -i -A '"+self.__UA+"' -X GET 'siiauescolar.siiau.udg.mx/wal/sgphist.ficha?pidmp="+self.pidm+"&majrp="+info["carrera"]+"&cicloap="+info["inicio"]+"'"
				r=get("http://siiauescolar.siiau.udg.mx/wal/sgphist.promedio?pidmp="+self.pidm+"&majrp="+info["carrera"]+"&cicloap="+info["inicio"],headers=self.__headers,cookies=self.__COOKIES)
			#out=getoutput(cmd)
			out=r.text
			if("Encuestas</b>" in out):
				encuesta=True
				#print("Favor de contestar todas las encuestas para poder continuar")
			else:
				#print out
				out=out[out.find("Nombre:"):]
				out=out[out.find("<FONT"):]
				out=out[out.find(">")+1:]
				self.nombre=out[:out.find("</FONT>")]
				
				out=out[out.find("Situaci"):]
				out=out[out.find("<FONT"):]
				out=out[out.find(">")+1:]
				situacion=out[:out.find("</FONT>")]
				
				out=out[out.find("Carrera:"):]
				out=out[out.find("<FONT"):]
				out=out[out.find(">")+1:]
				carrera=out[:out.find("</FONT>")]
				
				self.__majrp=carrera[carrera.find("(")+1:carrera.find(")")]
				
				out=out[out.find("Centro:"):]
				out=out[out.find("<FONT"):]
				out=out[out.find(">")+1:]
				centro=out[:out.find("</FONT>")]
				
				out=out[out.find("Sede:"):]
				out=out[out.find("<FONT"):]
				out=out[out.find(">")+1:]
				sede=out[:out.find("</FONT>")]
				
				out=out[out.find("PROMEDIO"):]
				out=out[out.find("<FONT"):]
				out=out[out.find(">")+1:]
				promedio=out[:out.find("</FONT>")]
				
				self.carreras.append({"carrera":carrera,"centro":centro,"sede":sede,"situacion":situacion,"promedio":promedio})
		#print self.carreras
		if(not encuesta):
			self.__getKardex()
		
	def __getKardex(self):
		cont=0
		encuesta=False
		for info in self.items:
			if(info == None):
				r=get("http://siiauescolar.siiau.udg.mx/wal/sgphist.kardex?pidmp="+self.pidm+"&majrp="+self.__majrp,headers=self.__headers,cookies=self.__COOKIES)
			else:
				#r=get("http://siiauescolar.siiau.udg.mx/wal/sgphist.kardex?pidmp=891060&majrp=INNI&cicloap=201420",cookies=self.__COOKIES)
				r=get("http://siiauescolar.siiau.udg.mx/wal/sgphist.kardex?pidmp="+self.pidm+"&majrp="+info["carrera"]+"&cicloap="+info["inicio"],headers=self.__headers,cookies=self.__COOKIES)
			out=r.text
			materias=[]
			if("Encuestas</b>" in out):
				encuesta=True
				#print("Favor de contestar todas las encuestas para poder continuar")
			else:
				'''
				cab="Calendario "
				cab2="</FONT>"
				'''
				
				cab='<TR bgcolor="#ffffff">'
				cab2="<A HREF="
				cab3="<FONT "
				cab4='<TD COLSPAN="3"></TD>'
				#print out
				while(cab in out):
					out=out[out.find(cab)+len(cab):]
					aprobado=True
					#print out.find(cab4)
					if(out.find(cab4)!=1):
						out=out[out.find(cab2)+len(cab2):]
						out=out[out.find(">")+1:]
						nrc=out[:out.find("</A>")]
						
						out=out[out.find(cab2)+len(cab2):]
						out=out[out.find(">")+1:]
						clave=out[:out.find("</A>")]
						
						out=out[out.find(cab3)+len(cab3):]
						out=out[out.find(">")+1:]
						materia=out[:out.find("</FONT>")]
					
					out=out[out.find(cab3)+len(cab3):]
					if(out.find('COLOR="red"')==0):
						aprobado=False
						#print "reprobado"
					out=out[out.find(">")+1:]
					calificacion=out[:out.find("</FONT>")]
					
					out=out[out.find(cab3)+len(cab3):]
					out=out[out.find(">")+1:]
					tipo=out[:out.find("</FONT>")]
					
					out=out[out.find(cab3)+len(cab3):]
					out=out[out.find(">")+1:]
					nc=out[:out.find("</FONT>")]
					
					out=out[out.find(cab3)+len(cab3):]
					out=out[out.find(">")+1:]
					fecha=out[:out.find("</FONT>")]
					
					materias.append({"nrc":nrc,"clave":clave,"materia":materia,"calificacion":calificacion,"aprobado":aprobado,"tipo":tipo,"nc":nc,"fecha":fecha})
					#print nrc,clave,materia,calificacion,tipo,nc,fecha
					'''
					out=out[out.find(cab):]
					print out[:out.find(cab2)]
					out=out[out.find(cab2)+len(cab2):]
					'''
			self.carreras[cont]["kardex"]=materias
			cont=cont+1
		if(not encuesta):
			self.__getActuales()
		#print self.carreras
	
	def __getActuales(self):
		cont=0
		encuesta=False
		for info in self.items:
			if(info == None):
				r=get("http://siiauescolar.siiau.udg.mx/wal/sgpregi.horario?pidmp="+self.pidm+"&majrp="+self.__majrp,headers=self.__headers,cookies=self.__COOKIES)
			else:
				#r=get("http://siiauescolar.siiau.udg.mx/wal/sgphist.kardex?pidmp=891060&majrp=INNI&cicloap=201420",cookies=self.__COOKIES)
				r=get("http://siiauescolar.siiau.udg.mx/wal/sgpregi.horario?pidmp="+self.pidm+"&majrp="+info["carrera"],headers=self.__headers,cookies=self.__COOKIES)
			out=r.text
			#print out
			if("Encuestas</b>" in out):
				encuesta=True
				#print("Favor de contestar todas las encuestas para poder continuar")
			else:
				#print out
				cab='<SELECT NAME="pCiclo"'
				if(cab in out):
					out=out[out.find(cab)+len(cab):]
					cab=" value='"
					out=out[out.find(cab)+len(cab):]
					ciclo=out[:out.find("'")]
					params={"pidmP":self.pidm,"cicloP":ciclo,"encaP":"0"}
					if(info!=None):
						params["majrP"]=info["carrera"]
					else:
						params["majrP"]=self.__majrp
					#print ciclo
					r=post("http://siiauescolar.siiau.udg.mx/wal/sfpcoal.horario",headers=self.__headers,data=params)
					out=r.text
					out=out[out.find("FECHA FIN"):]
					
					materias=[]
					
					cab='<TR bgcolor="#'
					cab2='<TR bgcolor="#FFFFFF">'
					cab3='<TR bgcolor="#e5e5e5">'
					cab4='<TD COLSPAN="5">'
					cab5='<TD>'
					while(cab2 in out or cab3 in out):
						out=out[out.find(cab):]
						out=out[out.find(">")+1:]
						if(out.find(cab4) != 1):
							out=out[out.find(cab5)+len(cab5):]
							nrc=out[:out.find("</TD>")]
							
							out=out[out.find(cab5)+len(cab5):]
							clave=out[:out.find("</TD>")]
							
							out=out[out.find(cab5)+len(cab5):]
							materia=out[:out.find("</TD>")]
							
							materias.append({"nrc":nrc,"clave":clave,"materia":materia})
							#print nrc,clave,materia
					self.carreras[cont]["materias_actuales"]=materias
				else:
					self.carreras[cont]["materias_actuales"]=[]
				cont=cont+1
		if(not encuesta):
			self.valido=True
						
			'''
			materias=[]
			cab='<TR bgcolor="'
			cab2="<FONT "
			print "Si entre aqui"
			print out
			while(cab in out):
				out=out[out.find(cab)+len(cab):]
				
				out=out[out.find(cab2)+len(cab2):]
				out=out[out.find(">")+1:]
				nrc=out[:out.find("</FONT>")]
				
				out=out[out.find(cab2)+len(cab2):]
				out=out[out.find(">")+1:]
				clave=out[:out.find("</FONT>")]
				
				out=out[out.find(cab2)+len(cab2):]
				out=out[out.find(">")+1:]
				materia=out[:out.find("</FONT>")]
				
				out=out[out.find(cab2)+len(cab2):]
				out=out[out.find(">")+1:]
				creditos=out[:out.find("</FONT>")]
				
				materias.append({"nrc":nrc,"clave":clave,"materia":materia,"creditos":creditos})
				print nrc,clave,materia,creditos
		self.carreras[cont]["materias_actuales"]=materias
		print self.carreras[cont]["materias_actuales"]
		cont=cont+1
		self.valido=True
		#print self.carreras[cont]
		#print "\n\n=====================================================\n\n"'''
	
	def __init__(self,codigo,nip):
		#print "Creando el objeto"
		self.codigo=""
		self.nip=""
		self.nombre=""
		self.items=[]
		self.carreras=[]
		valido=False
		#print "ehrkjerjkergjergjk"
		pidm=""
		self.codigo=codigo
		self.nip=nip
		#cmd="curl -c cookies.txt -i -A '"+self.__UA+"' -X POST -d 'p_codigo_c="+str(codigo)+"&p_clave_c="+str(nip)+"' siiauescolar.siiau.udg.mx/wus/gupprincipal.valida_inicio"
		params={"p_codigo_c":str(codigo),"p_clave_c":str(nip)}
		r=post("http://siiauescolar.siiau.udg.mx/wus/gupprincipal.valida_inicio",headers=self.__headers,data=params)
		out=r.text
		#out=getoutput(cmd)
		if('class="error"' not in out):
			#print "la clave y el nip son correctos"
			self.__COOKIES=r.cookies
			self.__getPidm(out)
			self.__getLink()
			#print self.carreras
			#getoutput("rm cookies.txt")
		else:
			self.valido=False
			#print "Los datos ingresados no son correctos"
			
class Profesor():
	
	__COOKIES=""
	
	__headers = {
		'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36',
	}
	
	pidm=""
	codigo=""
	nip=""
	nombre=""
	materias=[]
	
	valido=True
	
	def __getLink(self):
		#cmd="curl -L -b cookies.txt -i -A '"+self.__UA+"' -X GET siiauescolar.siiau.udg.mx/wus/gupmenug.menu_sistema?p_pidm_n="+str(self.pidm)
		r=get("http://siiauescolar.siiau.udg.mx/wus/gupmenug.menu_sistema?p_pidm_n="+str(self.pidm),headers=self.__headers,cookies=self.__COOKIES)
		out=r.text
		#out=getoutput(cmd)
		grado=""
		flag=True
		cab='<img src="/ows-img/closed.gif" alt="'
		cab2='<a href="'
		while(cab in out and flag):
			out=out[out.find(cab)+len(cab):]
			grado=out[:out.find('"')]
			out=out[out.find(cab2)+len(cab2):]
			link=out[:out.find('"')]
			#print link
			if(" " not in link):
				#print link
				flag=False
				self.__getCarreras(link)
		if(flag):
			self.items.append(None)
			self.__getInfoBasica();
	
	def __getPidm(self,text):
		cab='p_bienvenida_c" VALUE="'
		text=text[text.find(cab)+len(cab):]
		text=text[:text.find('"')]
		self.pidm=text
		#print text
		
	def __getInfoBasica(self):
		#print "aqui"
		r=get("http://siiauescolar.siiau.udg.mx/wpr/sipprac.lista_prof?pidmp="+self.pidm,headers=self.__headers,cookies=self.__COOKIES)
		out=r.text
		
		cab="<FONT "
		
		out=out[out.find("Nombre :"):]
		out=out[out.find(cab)+len(cab):]
		out=out[out.find(">")+1:]
		self.nombre=out[:out.find("</FONT>")]
		
		cab='<FONT COLOR="navy" FACE="arial" SIZE="2">'
		
		while(cab in out):
			out=out[out.find(cab)+len(cab):]
			ciclo=out[:out.find("</FONT>")]
			
			out=out[out.find(cab)+len(cab):]
			nrc=out[:out.find("</FONT>")]
			
			out=out[out.find(cab)+len(cab):]
			clave=out[:out.find("</FONT>")]
			
			out=out[out.find(cab)+len(cab):]
			nombre=out[:out.find("</FONT>")]
			
			self.materias.append({"ciclo":ciclo,"nrc":nrc,"clave":clave,"nombre":nombre})
		r=get("http://siiauescolar.siiau.udg.mx/wpr/silprac.asistencias_profesor",headers=self.__headers,cookies=self.__COOKIES)
		out=r.text
		cab='<TD style="font-family:arial;font-size:12;background-color:#ffffff;">'
		cab2='<A HREF='
		while(cab in out):
			out=out[out.find(cab)+len(cab):]
			ciclo=out[:out.find("</TD>")]
			
			out=out[out.find(cab)+len(cab):]
			nrc=out[:out.find("</TD>")]
			
			out=out[out.find(cab2)+len(cab2):]
			out=out[out.find(">")+1:]
			clave=out[:out.find("</A>")]
			
			out=out[out.find(cab)+len(cab):]
			nombre=out[:out.find("</TD>")]
			
			out=out[out.find("<TR>"):]
			
			self.materias.append({"ciclo":ciclo,"nrc":nrc,"clave":clave,"nombre":nombre})
			
		self.valido=True
		#print self.materias
		
	def __init__(self,codigo,nip):
		self.pidm=""
		self.nombre=""
		self.materias=[]
		#print "Creando el objeto"
		self.codigo=codigo
		self.nip=nip
		#cmd="curl -c cookies.txt -i -A '"+self.__UA+"' -X POST -d 'p_codigo_c="+str(codigo)+"&p_clave_c="+str(nip)+"' siiauescolar.siiau.udg.mx/wus/gupprincipal.valida_inicio"
		params={"p_codigo_c":str(codigo),"p_clave_c":str(nip)}
		r=post("http://siiauescolar.siiau.udg.mx/wus/gupprincipal.valida_inicio",headers=self.__headers,data=params)
		out=r.text
		#out=getoutput(cmd)
		if('class="error"' not in out):
			#print "la clave y el nip son correctos"
			self.__COOKIES=r.cookies
			self.__getPidm(out)
			self.__getInfoBasica()
			#print self.carreras
			#getoutput("rm cookies.txt")
		else:
			self.valido=False
			#print "Los datos ingresados no son correctos"