# -*- coding: UTF-8 -*-
import httplib, urllib
import RaspberryPi
from Db import Db_MySQL
import json
import time , os
import subprocess


class gestionnaireConnection :
    
    version_pyUpload = '2.1'
    
    def __init__(self):
        self.fbname = RaspberryPi.getFBName()
        self.serial = RaspberryPi.getSerial()
        self.mac = RaspberryPi.getHWAdrr()
        self.db = Db_MySQL()
        self.db.initCnx()
        
    def formateData(self, listePdmDateFrom):
        d = self.db.getData2send(listePdmDateFrom)
        return json.dumps(d)
    
    def remonterData(self , dataJSON): 
        r = self.send2WebServer({'Demande':'sendData' , 'dataJSON' : dataJSON })
        
    def getDefautParam(self):
        return {'Serial': self.serial, 'HWaddr': self.mac, 'FBname': self.fbname, 'IdConfig' : self.db.getIdConfig() }
    
    def getDefautHeaders(self):
        return {"Content-type": "application/x-www-form-urlencoded",
                "Accept": "text/plain" , "User-Agent": "F-Link %s, pyUpload v%s" % (self.fbname, self.version_pyUpload)}


    def send2WebServer(self, paramEnPlus={ 'Demande' : 'getPackage' }):    
        c = httplib.HTTPSConnection("tempsreel.histoconso.com")
                
        params = self.getDefautParam() 
        for p in paramEnPlus :
            params[p] = paramEnPlus[p]        
            
        c.request("POST", "/maintenance.php", urllib.urlencode(params) , self.getDefautHeaders())
        
        reponse = c.getresponse()
        contenu = reponse.read()
        c.close()        
        
        return (reponse.getheader('content-type') , contenu)

    def getPackage(self):
        contentType, contenu = self.send2WebServer()
        
        if 'application/force-download' in contentType :
            # C'est un fichier zip à traiter
            self.executePackageRecu(contenu)            
        else : 
            d = json.loads(contenu)
            
            if "lastData" in d :
                # Il faut remonter des données
                self.remonterData(self.formateData(d["lastData"]))
            
            if "config" in d :
                # Il faut changer la config
                self.db.appliquerConfig(d["config"])
                
        return None
    
    def executePackageRecu(self, contenu):
                
        tmpName = 'pyF.%s' % (long(round(time.time())))        
        tmpFile = '/tmp/%s.pak' % (tmpName)
        tmpDir = '/tmp/%s' % (tmpName)
        
        # On écrit le contenu dans un fichier pour pouvoir le dezipper...           
        with open (tmpFile, 'a') as f:
            f.write (contenu)
        p = subprocess.Popen([ "unzip" , tmpFile , "-d" , tmpDir ] , stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out, err = p.communicate()
        
        fileRunSh = '%s/run.sh' % tmpDir
        
        if os.path.exists(fileRunSh):
            p = subprocess.Popen([ "/bin/sh" , fileRunSh ] , stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            out, err = p.communicate()
            self.send2WebServer({'Demande':'sendReponse', 'Reponse':out , 'Erreurs' : err })
        
        # On nettois les fichiers temporaires
        subprocess.call(['rm -rf %s*' % (tmpDir) ] , shell=True)        
        
if __name__ == '__main__':
    gestionnaireConnection().getPackage()   
