# -*- coding: UTF-8 -*-
"""提供错误报告的基本操作及方法 顺便提供版本更新、安装库等功能"""

# 诸葛亮与八卦阵帮忙修改语法 日期：---2022年1月19日
# 统计：致命（三级）错误：0个；警告（二级）错误：1个；语法（一级）错误：72个
import os


def makeZip(sourceDir, outFilename, compression=8, exceptFile=None):
    import zipfile
    """使用compression指定的算法打包目录为zip文件\n
    默认算法为DEFLATED(8),可用算法如下：\n
    STORED = 0\n
    DEFLATED = 8\n
    BZIP2 = 12\n
    LZMA = 14\n
    """
    zipf = zipfile.ZipFile(outFilename, 'w', compression)
    pre_len = len(os.path.dirname(sourceDir))
    for parent, dirnames, filenames in os.walk(sourceDir):
        for filename in filenames:
            if filename == exceptFile:
                continue
            print(filename)
            pathfile = os.path.join(parent, filename)
            arcname = pathfile[pre_len:].strip(os.path.sep)  # 相对路径
            zipf.write(pathfile, arcname)

    zipf.close()
    del zipf, pre_len


# 以上函数节选并修改自 正在攀登的小蜗牛 的博客：https://blog.csdn.net/qq_21127151/article/details/107503942


class report:
    """发送报告以及相应的任务处理"""

    def __init__(self, senderName: str = 'Unknown', senderContact: str = 'None', describetion: str = ''):
        """:param senderName 发送者名称
        :param senderContact 发送者联系方式
        :param describetion 问题描述"""
        self.senderName = senderName
        self.senderContact = senderContact
        self.describetion = describetion
        if not self.senderName:
            self.senderName = 'Unknown'
        if not self.senderContact:
            self.senderContact = 'None'

    def emailReport(self):
        """使用E-mail方法发送当前的日志和临时文件等"""
        import smtplib
        from email.mime.text import MIMEText
        from email.mime.multipart import MIMEMultipart
        from email.header import Header
        from nmcsup.log import log
        log("发送错误报告")
        import os
        log("添加标题与正文")
        msg = MIMEMultipart()
        # 发送者与接收者显示名称
        msg["From"] = Header(self.senderName, 'utf-8')
        msg["To"] = Header("W-YI (QQ2647547478)", 'utf-8')
        # 标题
        msg["Subject"] = '音·创 - 来自 ' + self.senderName + ' 的错误报告'
        # 正文
        msg.attach(
            MIMEText("来自" + self.senderName + "( " + self.senderContact + " )的错误描述：\n" + self.describetion,
                     'utf-8'))
        log("添加完毕，正在生成压缩包...")
        makeZip("./", "Temps&Logs.zip", exceptFile="Temps&Logs.zip")
        attafile = MIMEText(str(open("Temps&Logs.zip", 'rb').read()), "base64", 'gb2312')
        attafile["Content-Type"] = 'application/octet-stream'
        attafile["Content-Disposition"] = 'attachmentfilename="BugReport_from_' + self.senderName + '.zip"'
        msg.attach(attafile)
        log("完毕，准备发送")
        try:
            smtp = smtplib.SMTP()
            smtp.connect("smtp.163.com")
            # smtp.login("RyounDevTeam@163.com","RyounDaiYi99")
            # SIQQKQQYCZRVIDFJ是授权密码
            smtp.login("RyounDevTeam@163.com", "SIQQKQQYCZRVIDFJ")
            smtp.sendmail("RyounDevTeam@163.com", ["RyounDevTeam@163.com", ], msg.as_string())
            log("错误汇报邮件已发送")
        except smtplib.SMTPException as e:
            log("错误汇报邮件发送失败：\n" + str(e))
        log("清空内存和临时文件")
        del msg, attafile
        os.remove("./Temps&Logs.zip")


class version:
    libraries = (
        'mido', 'amulet', 'amulet-core', 'amulet-nbt', 'piano_transcription_inference', 'pypinyin',
        'pyinstaller', 'py7zr','websockets', 'torch', 'requests', 'zhdate'
        )
    """当前所需库"""

    version = ('0.1.6', 'Delta',)
    """当前版本"""

    def __init__(self) -> None:

        self.libraries = version.libraries
        """当前所需库"""

        self.version = version.version
        """当前版本"""
        

    def installLibraries(self,index:str = 'https://pypi.tuna.tsinghua.edu.cn/simple'):
        """安装全部开发用库"""
        from sys import platform
        import os
        if platform == 'win32':
            import shutil
            try:
                shutil.rmtree(os.getenv('APPDATA') + '\\Musicreater\\')
            except FileNotFoundError:
                pass
            for i in self.libraries:
                print("安装库：" + i)
                os.system(f"python -m pip install {i} -i {index}")
        elif platform == 'linux':
            os.system("sudo apt-get install python3-pip")
            os.system("sudo apt-get install python3-tk")
            os.system("sudo apt-get install python3-tkinter")
            for i in self.libraries:
                print("安装库：" + i)
                os.system(f"sudo python3 -m pip install {i} -i {index}")
    

    def __call__(self):
        '''直接安装库，顺便返回一下当前版本'''
        self.installLibraries()
        return self.version
