import os
import ftplib
from datetime import datetime

def ftp_backup(source, ftp_server, ftp_user, ftp_pass, ftp_remote_dir):
    ftp = ftplib.FTP(ftp_server)
    ftp.login(user=ftp_user, passwd=ftp_pass)
    ftp.set_pasv(True)  # Forcer le mode passif
    ftp.cwd('/')
    log = ''

    # Déterminer le sous-dossier distant basé sur le dernier dossier de la source
    source_folder_name = os.path.basename(os.path.normpath(source))
    remote_target_dir = f"{ftp_remote_dir}/{source_folder_name}"

    # Créer le répertoire distant racine s'il n'existe pas
    try:
        ftp.mkd(ftp_remote_dir)
    except Exception as e:
        if not str(e).startswith('550'):
            raise

    # Créer le sous-répertoire distant s'il n'existe pas
    try:
        ftp.mkd(remote_target_dir)
    except Exception as e:
        if not str(e).startswith('550'):
            raise

    ftp.cwd(remote_target_dir)

    for root, dirs, files in os.walk(source):
        relative_path = os.path.relpath(root, source).replace("\\", "/")
        for dir in dirs:
            dir_path = os.path.join(relative_path, dir).replace("\\", "/")
            try:
                ftp.mkd(dir_path)
            except Exception as e:
                if str(e).startswith('550'):
                    pass
                else:
                    raise
        for file in files:
            file_path = os.path.join(root, file).replace("\\", "/")
            relative_file_path = os.path.join(relative_path, file).replace("\\", "/")

            # Vérifier si le fichier existe déjà sur le serveur FTP
            try:
                remote_file_time = ftp.sendcmd('MDTM ' + relative_file_path)
                remote_mod_time = datetime.strptime(remote_file_time[4:], "%Y%m%d%H%M%S")
                local_mod_time = datetime.fromtimestamp(os.path.getmtime(file_path))

                if local_mod_time > remote_mod_time:
                    with open(file_path, 'rb') as f:
                        ftp.storbinary("STOR {}".format(relative_file_path), f)
                    log += f"Updated: {relative_file_path}\n"
                    print(f"Updated: {relative_file_path}")
            except ftplib.error_perm:
                # Le fichier n'existe pas sur le serveur FTP, donc on le transfère
                with open(file_path, 'rb') as f:
                    ftp.storbinary("STOR {}".format(relative_file_path), f)
                log += f"Uploaded: {relative_file_path}\n"
                print(f"Uploaded: {relative_file_path}")
    
    ftp.quit()
    return log

# Paramètres de connexion FTP
ftp_server = "ftp.cluster010.ovh.net"
ftp_user = "mathweb"
ftp_pass = "Guillaume73"
ftp_remote_dir = "backup"

# Dossiers locaux à sauvegarder
sources = [ "C:/Users/STEPHANE/Documents", "C:/texmf" ]

# Lancer le backup
log = ''

for source in sources:
    log += ftp_backup(source, ftp_server, ftp_user, ftp_pass, ftp_remote_dir)
    
date = datetime.now().strftime("%Y%m%d")
nom_fichier = f"logs/{date}-log.txt"
with open(nom_fichier, 'w', encoding='utf-8') as file:
    file.write(log)
