import os
import stat
from datetime import datetime
import paramiko


def sftp_backup(source, sftp_host, sftp_port, sftp_user, sftp_pass, remote_root_dir):
    transport = paramiko.Transport((sftp_host, sftp_port))
    transport.connect(username=sftp_user, password=sftp_pass)
    sftp = paramiko.SFTPClient.from_transport(transport)
    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"{remote_root_dir}/{source_folder_name}"

    def remote_mkdir_safe(path):
        """Crée un répertoire distant s'il n'existe pas déjà (équivalent du 550 ignoré en FTP)."""
        try:
            sftp.mkdir(path)
        except IOError:
            # Existe déjà (ou erreur de permission), on continue
            pass

    # Créer le répertoire distant racine et le sous-répertoire s'ils n'existent pas
    remote_mkdir_safe(remote_root_dir)
    remote_mkdir_safe(remote_target_dir)

    for root, dirs, files in os.walk(source):
        relative_path = os.path.relpath(root, source).replace("\\", "/")
        remote_current_dir = remote_target_dir if relative_path == "." else f"{remote_target_dir}/{relative_path}"

        for dir_name in dirs:
            remote_dir_path = f"{remote_current_dir}/{dir_name}" if relative_path != "." else f"{remote_target_dir}/{dir_name}"
            remote_mkdir_safe(remote_dir_path)

        for file_name in files:
            local_file_path = os.path.join(root, file_name)
            remote_file_path = f"{remote_current_dir}/{file_name}" if relative_path != "." else f"{remote_target_dir}/{file_name}"

            local_mod_time = datetime.fromtimestamp(os.path.getmtime(local_file_path))

            try:
                remote_attrs = sftp.stat(remote_file_path)
                remote_mod_time = datetime.fromtimestamp(remote_attrs.st_mtime)

                if local_mod_time > remote_mod_time:
                    sftp.put(local_file_path, remote_file_path)
                    log += f"Updated: {remote_file_path}\n"
                    print(f"Updated: {remote_file_path}")
            except FileNotFoundError:
                # Le fichier n'existe pas encore sur le serveur, on le transfère
                sftp.put(local_file_path, remote_file_path)
                log += f"Uploaded: {remote_file_path}\n"
                print(f"Uploaded: {remote_file_path}")

    sftp.close()
    transport.close()
    return log


# Paramètres de connexion SFTP
sftp_host = "ftp.cluster110.hosting.ovh.net"
sftp_port = 22
sftp_user = "mathweb"
sftp_pass = os.environ.get("OVH_SFTP_PASS", "")  # à définir via variable d'environnement
remote_root_dir = "backup"

if not sftp_pass:
    raise SystemExit(
        "Mot de passe manquant : définissez la variable d'environnement OVH_SFTP_PASS "
        "avant de lancer ce script (ex: setx OVH_SFTP_PASS \"votre_mot_de_passe\")."
    )

# Dossiers locaux à sauvegarder
sources = ["C:/Users/STEPHANE/Documents", "C:/texmf"]

# Lancer le backup
log = ''
for source in sources:
    log += sftp_backup(source, sftp_host, sftp_port, sftp_user, sftp_pass, remote_root_dir)

os.makedirs("logs", exist_ok=True)
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)