import os
import shutil
import paramiko
import argparse
import Contant
from LoggerUtils import Logger, initLogger
import configparser
import requests
import time

# python3 sftp.py --local="/mnt/tmp_srt_file" --logDir="./logs"
# python3 sftp.py --local="/mnt/test_file" --logDir="./logs"
if __name__ == "__main__":
    # 读取参数
    parser = argparse.ArgumentParser(description="")
    parser.add_argument("--local", type=str, default="")
    parser.add_argument('--logDir', type=str, default='')
    args = parser.parse_args()
    Contant.logDir = args.logDir
    initLogger()

    # 读取配置文件
    config = configparser.ConfigParser()
    config.read('sftp_config.ini')

    # 获取SFTP配置信息
    hostname = config.get('sftp_config', 'hostname')
    port = config.getint('sftp_config', 'port')
    username = config.get('sftp_config', 'username')
    password = config.get('sftp_config', 'password')

    Logger.info("host:{},port:{},username:{},password:{}".format(
        hostname, port, username, password))

    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    sftp_client = None  # 设置默认值
    ssh_client.connect(hostname, port, username, password)
    # 创建SFTP客户端
    sftp_client = ssh_client.open_sftp()
    Logger.info("SFTP客户端已经建立:{}".format(sftp_client))

    remote_root = "/Inbound/YouTube Captions"
    local_root = args.local
    Logger.info("remote_root:{},local_root:{}".format(remote_root, local_root))

    names = os.listdir(local_root)
    for name in names:
        # sftp创建文件夹
        try:
            sftp_client.chdir(remote_root + "/" + name)
        except BaseException:
            sftp_client.mkdir(remote_root + "/" + name)
            sftp_client.chdir(remote_root + "/" + name)

        # 遍历本地临时文件夹
        srtList = os.listdir(local_root + "/" + name)
        for srt in srtList:
            # 获取远程文件路径以及本地文件路径
            remotePath = remote_root + "/" + name + "/" + srt
            localPath = local_root + "/" + name + "/" + srt
            # 如果远程文件存在,则进行删除
            try:
                sftp_client.stat(remotePath)
                # 如果文件存在,删除它
                sftp_client.remove(remotePath)
                Logger.info("Remote file '{}' deleted.".format(remotePath))
            except FileNotFoundError:
                Logger.info("Remote file '{}' not found.".format(remotePath))
            # 上传本地文件
            try:
                # 判断远程地址长度,过长需要截取一部分
                if len(remotePath) > 120:
                    remotePath = remotePath[:-20] + ".srt"
                # 判断本地文件是否存在,存在则上传
                if os.path.exists(localPath):
                    Logger.info("本地文件 '{}' 存在,开始上传.".format(localPath))
                    sftp_client.put(localPath, remotePath, confirm=False)
                    os.remove(localPath)
                else:
                    Logger.info("本地文件 '{}' 不存在,无法上传.".format(localPath))
            except Exception as e:
                Logger.info("上传失败 '{}' 文件名长度{}".format(
                    remotePath, len(remotePath)))
                Logger.error(e)
                sftp_client.close()
                sftp_client = ssh_client.open_sftp()
    # 发送钉钉消息
    webhook = "https://oapi.dingtalk.com/robot/send?access_token=c8c8d7d42c4eecd449dd303025ef968f647d1d8e8694e3fabc0ab5770d646dcb"
    jsonData = {
        "msgtype": "text",
        "text": {
            "content": "[Youtube]sftp finished"
        }
    }
    requests.post(webhook, json=jsonData)
    Logger.info("sftp发送钉钉消息成功...")