# coding utf-8
"""
这是Fishconsole Project的帮助模块，本地帮助文档的启动和检查更新都由它执行

----

"""
import requests
from lxml import html

etree = html.etree
from Fishconsole import logs
from Fishconsole import window
from Fishconsole import fcv
from Fishconsole import Fishsys

sys = fcv.f_debug()
sys = sys["updata"]
UPI = fcv.f_debug()
UPI = UPI["UPI"]


# 判断设备是否接入网络
# noinspection PyBroadException
def isConnected():
    import requests
    try:
        requests.get("https://pypi.org/project/Fishconsole/", timeout=15)
    except:
        print(logs.日志("》强制更新系统》官网连接失败"))
        return False
    print(logs.日志("》强制更新系统》官网连接成功"))
    return True


def 帮助():
    """
    FishConsole helps 主程序

    ----

    - 查看内置帮助文档，检测更新都是它在干

    - 如何启动，直接调用就可以了

    :return: <启动主程序>
    """

    # 强制更新系统helps端
    sys = fcv.f_debug()
    sys = sys["updata"]
    print(logs.颜色(
        "由于termux存在一些问题，所以easygui无法使用而且matplotlib中文辅助模块要使用jupyter notebook才可以使用，这里就不上相关教程了",
        色选="红色"))
    if sys:
        if isConnected():
            print(logs.日志(f"Fishconsole{fcv.version()} 检查更新开始。。。"))
            v = fcv.version()
            url = "https://pypi.org/project/Fishconsole/"
            res = requests.get(url).text
            res_html = etree.HTML(res)
            res_v = res_html.xpath("/html/body/main/div[2]/div/div[1]/h1/text()")[0]
            res_v = str(res_v[21:27])
            # 检查是否开启了强制更新系统
            if sys:
                # 开启了强制更新系统
                if res_v == v:
                    print(logs.日志(f"Fishconsole{fcv.version()} 检查更新结束,您的模块为最新版本", "绿色"))
                    print(logs.日志(f"Fishconsole{fcv.version()} 已解锁，您可以使用了", "绿色"))
                    # 尝试获取缓存中的值
                    config = Fishsys.缓存(2)
                    if config:
                        logs.系统日志("变量提取》这是Ture时执行的操作")
                        config["updata"] = False
                        Fishsys.缓存(1, config)
                        config["year"] = 2022
                        config["month"] = 5
                        config["day"] = 20
                    else:
                        logs.系统日志("变量提取》这是为false是执行的操作")
                        config = {"year": 2022, "month": 5, "day": 20, "updata": False}
                        Fishsys.缓存(1, config)
                else:
                    # 对比到版本号不同
                    print(logs.日志(f"Fishconsole{fcv.version()} 检查更新结束"))
                    # 尝试获取缓存中的值
                    config = Fishsys.缓存(2)
                    # 这是没有检查到值或者发现时执行的操作
                    print(logs.日志(f"检测到最新版本号发生了变化({res_v}>{v})，请重新运行本程序，我们将尝试自动安装最新版本", "红色"))
                    print(logs.日志(f"Fishconsole 模块已被禁用，解决方式为更新该模块", "红色"))
                    config["updata"] = True
                    logs.安全退出(f"Fishconsole》help》强制更新启动")
                    Fishsys.缓存(1, config)
        else:
            print(logs.日志(f"Fishconsole{fcv.version()} 检查更新结束"))
            print(logs.日志("你的设备无法访问互联网，请检查网络连接"))
    else:
        logs.日志(f"Fishconsole》f_debug》已取消强制更新", "绿色")
        # 尝试获取缓存中的值
        config = Fishsys.缓存(2)
        fupdata = config.get("updata")
        if fupdata:
            config["updata"] = False
            Fishsys.缓存(1, config)

    logs.输入(f"这是Fishconsole的开发文档，如果想查看，请按任意字符开始")
    if True:
        res = window.列表选择对话框(
            "我如何重新进入？\n"
            "导入helps包，然后键入helps.帮助()就可以回来了\n\n"
            "关于控制台输出模块的帮助文档会显示在命令行中，选中你想查看的内容，我们将会提供相应的窗口。\n\n"
            "为什么有的地方找不到? \n"
            "因为我没做哈欠。\n\n"
            "那些1，2的模式可以用int类型的嘛？\n"
            "可以，我做了类型转换，你随便造\n\n"
            "啊，pypi是真的不错，我本地写废了还可以去云端把历史版本下回来/比心/比心",
            f"Fishconsole {fcv.version()} 帮助文档",
            ["Matplotlib中文辅助模块", "easygui中文辅助模块", "logs控制台输出辅助模块", "Fishsys模块"])
        logs.系统日志(f"用户请求启动{res}")
        if res is None:
            logs.安全退出("用户取消了操作")
        if res is not None:
            for a in res:
                if a == "logs控制台输出辅助模块":
                    logs.分割线("这是logs模块的", f"Fishconsole{fcv.version()} 帮助文档", "红色")
                    print(
                        "你是不是不知道怎么用的？那就让我来告诉你吧!!\n"
                        "这个函数是一个输出工具的集合，是由鱼鱼有几斤整理的\n"
                        "我整理了这几个项目\n"
                        f"{logs.颜色('这是logs模块当中的', 色选='火粉')}\n"
                        "---------------------\n"
                        "1：‘分割线’，它的作用就是弄出一个分割线，将无关的输出和自己想看到的分割线分割开来，这样就可以在一定层度上降低对头发的消耗啦\n"
                        "2：‘日志’，它的作用就是在前面加一个时间戳，主要是好看和装逼用的，但是用的好的话还是很可以的\n"
                        "3：‘颜色’，更改输出的颜色，目前支持的有：\n"
                        f"{logs.颜色('紫色', 色选='紫色')}，{logs.颜色('红色', 色选='红色')}，{logs.颜色('黄色', 色选='黄色')}，{logs.颜色('蓝色', 色选='蓝色')}，{logs.颜色('绿色', 色选='绿色')}，{logs.颜色('青色', 色选='青色')}\n"
                        f' {logs.颜色("青背", 色选="青背")}{logs.颜色("紫背", 色选="紫背")}{logs.颜色("绿背", 色选="绿背")}{logs.颜色("蓝背", 色选="蓝背")}{logs.颜色("黄背", 色选="黄背")}{logs.颜色("红背", 色选="红背")}\n'
                        " (注意哦,分割线和日志都是可以和颜色叠加使用的)\n\n"
                        "4:‘input输入加强’，原版的input支持输出提示文字，但是默认为空且不好识别，我就针对这种情况对它进行重写了一次，这一次，辨识度绝对高/dogedoge/手臂\n"
                        "5: ‘变量查看’，查看变量的名字，内容，类型 "
                        "\n---------------------\n"
                        "‘分割线’的语法是:\n"
                        "logs.分割线(标题,文本,颜色选择)\n"
                        "‘日志’的语法是:\n"
                        "logs.日志(显示文字,颜色选择)\n"
                        "‘颜色’的语法是:\n"
                        "logs.颜色(输出显示文字,颜色选择)\n"
                        "‘input输入加强’的语法是：\n"
                        "logs.输入(输出显示文字,颜色选择)\n"
                        "‘变量查看’’的语法是：\n"
                        "logs.变量查看（变量名: str, 变量, 色选: str = '红色'）\n\n"
                        "ps.推荐一个写法（全局参数），语法是\n"
                        "全局参数='红色'\n"
                        "a = 输入('a', 全局参数)\n"
                        "a = 输入('a', 全局参数)\n"
                        "a = 输入('a', 全局参数)\n"
                        "全局参数='蓝色'\n"
                        "a = 输入('a', 全局参数)\n"
                        "a = 输入('a', 全局参数)\n"
                        "a = 输入('a', 全局参数)\n"
                        "这种写法极快的提升了编写的效率，也达到了Fishconsole logs模块的初衷（我们拒绝让一个庞大的工程变得难以调试）"

                        "\n---------------------"
                    )

                if a == "easygui中文辅助模块":
                    window.弹窗(""
                              "这个东西其实是就是 easygui 的中文《辅助》模块[笑],对于英语不好的人来说这个做法确实是有一点卖相的，但是想深入\n研究，还得去看它爸爸tkinter专门的教程，当然我可能也会持续完善这个的\n"
                              "---------------------\n"
                              "‘弹窗’，这是最基本的弹窗，就是弹出一个窗口，你点击按钮以后获得返回值\n"
                              "‘选择对话框’，就是弹出一个对话框，它可以有很多个选项，而且可以插入图片（这就很棒了），当然点击以后也会有返回值\n"
                              "‘列表选择对话框’，当选项多到离谱的时候，就可以使用列表选择对话框，你可以复选，也可以单选，不能插入图片，但是可以有几乎无限的选项\n"
                              "‘输入框’，就是可以存储你输入数据的窗口，他返回的内容就是你输入的内容 ，没填返回的就是None，\n"
                              "‘密码框’，就是在输入框的基础上对最后一个框使用了隐藏处理，返回的内容也是完整的（废话）\n"
                              "‘文件选择，文件保存’，故名思意，你们懂哈（我是懒虫）\n"
                              "-----------------------\n"
                              "弹窗的示例'\n\n"
                              "弹窗(1,2,3)\n"
                              "选择对话框的示例\n\n"
                              "print(选择对话框(1,2,选项=['ab','cd','ef'],图片地址='h.PNG'))\n"
                              "列表对话框的示例\n\n"
                              "print(列表选择对话框(1,2,选项=['ab','cd']))\n"
                              "输入框的示例\n\n"
                              "print(输入框('显示文字',['内容1','内容2'],'标题'))\n"
                              "密码框的示例\n\n"
                              "print(密码框('显示文字',['内容1','内容2'],'标题'))\n"
                              '文件选择的示例\n\n'
                              "print(文件选择())\n"
                              '文件保存的示例\n\n'
                              "print(文件保存())\n",

                              "easygui中文辅助模块", "ok")

                if a == "Matplotlib中文辅助模块":
                    res = (window.选择对话框(
                        "模块名字叫huitu（是不是很蠢哈哈）\n\n"
                        "它呢，现在有这几个功能\n"
                        "单线折线图\n"
                        "双线折线图\n"
                        "基于单线折线图的子图\n"
                        "柱形图\n"
                        "子图\n"
                        "--------------------------\n"
                        "对于单线折线图，我预设了 特别多的参数，因此，如果你追求简单的话，你只需要输入这几个内容(x,y轴的数据源和范围)，\n"
                        "示例\n"
                        " huitu.单线折线图(\n"
                        "    x轴范围=(0, 10),\n"
                        "    y轴范围=(0, 10),\n"
                        "    x轴数据源=[0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 10],\n"
                        "    y轴数据源=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n"
                        " )\n"
                        "--------------------------\n"
                        "双线折线图非常好理解，就是有两根折线图组成的图撒，所以呐，我直接就上代码把\n"
                        " huitu.双线折线图(\n"
                        "    x轴范围=(0, 10),\n"
                        "    y轴范围=(0, 10),\n"
                        "    xa轴范围=(0, 10),\n"
                        "    ya轴范围=(0, 10),\n"
                        "    x轴数据源=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n"
                        "    y轴数据源=[0, 1, 2, 3, 4, 10, 10, 11, 11, 11, 11],\n"
                        "    xa轴数据源=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n"
                        "    ya轴数据源=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n"
                        " )\n"
                        "--------------------------\n"
                        "然后就是子图，这个捏就有点府杂了\n"
                        "首先，他有一个模式，这个模式的用处就是告诉它你需要让他提供多少个图，这样你才可以将你输入的数据呈现在子图上面，最少是两个，最多是4个\n"
                        "然后其他的就和双线折线图基本上是一个玩法（嘻嘻，我又搞了一大堆预设变量）\n"
                        "上代码巴(这个代码启动的是4个子图)\n\n"
                        " huitu.子图(模式=4,\n"
                        "         x轴数据源=[1, 2, 3, 4, 5],\n"
                        "         y轴数据源=[1, 2, 3, 4, 5],\n"
                        "         xa轴数据源=[1, 2, 3, 4, 5],\n"
                        "         ya轴数据源=[1, 2, 3, 4, 5],\n"
                        "         xb轴数据源=[1, 2, 3, 4, 5],\n"
                        "         yb轴数据源=[1, 2, 3, 4, 5],\n"
                        "         xc轴数据源=[1, 2, 3, 4, 5],\n"
                        "         yc轴数据源=[1, 2, 3, 4, 5],\n"
                        "         )\n"
                        "---------------------------\n"
                        "然后就是柱形图，这个柱形图呢也很简单,它只需要每根柱子的名字和数据源，就行了\n"
                        "上代码\n\n"
                        " huitu.柱形图(\n"
                        "      ['haha','haa','aha'],\n"
                        "       [1,2,3],\n"
                        " )\n"
                        "--------------------------\n"
                        "最后就是饼图了，这个更简单\n"
                        "它只需要一个数据源就行了，上代码\n\n"
                        "huitu.饼图([1,2,3])\n"
                        "----------------------------\n"
                        "你学费了嘛？/dogedoge/咖啡"
                        , "matplotlib中文辅助模块", ["啊对对对", "走，高级教程"]))
                    if res == "走，高级教程":
                        window.弹窗(
                            "欢迎进入高级教程，在这里，我将会告诉你Fishconsole window模块中所有的预设选项和修改后造成的影响\n"
                            "如果我告诉你了你还不懂的话，那就自己去runoob"
                            "去把matplotlib在回来看这个教程吧\n\n\n\n"
                            "------------------------------\n"
                            "关于单线折线图，我预设的变量有这些\n\n"
                            "x,y轴范围\n"
                            "x,y轴数据源\n"
                            "x，y轴的名字='x','y'\n\n"
                            "线的样式='-'\n"
                            "线的颜色='b'\n"
                            "线的宽度=2\n"
                            "画布长=6\n"
                            "画布宽=6\n"
                            "标题=None\n"
                            "绘图标记=None\n\n"
                            "网格线=False\n"
                            "网格线的样式='-'\n"
                            "网格线的方向='both'\n"
                            "网格线rgb='#000'\n"
                            "网格线的宽度=0.5\n"
                            "修改的方式就是追加变量名，因为变量是中文的，所以你应该一看就懂了\n\n示例\n"
                            "huitu.单线折线图(\n"
                            "    x轴范围=(0, 10),\n"
                            "    y轴范围=(0, 10),\n"
                            "    x轴数据源=[0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 10],\n"
                            "    y轴数据源=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n"
                            "    网格线=True\n"
                            ")\n\n\n"
                            "---------------------------------\n"
                            "对于双线折线图，我设置的预置变量和单线折线图差不了多少\n\n"

                            "x轴范围, \n"
                            "x轴数据源,\n"
                            "y轴范围,\n"
                            "y轴数据源,\n"
                            "xa轴范围, \n"
                            "xa轴数据源,\n"
                            "ya轴范围, \n"
                            "ya轴数据源,\n"
                            "y轴名 = 'y', \n"
                            "x轴名 = 'x',\n"
                            "ya轴名 = 'ya',\n"
                            "xa轴名 = 'xa', \n\n"
                            "线的样式 = '-',\n"
                            "线的宽度 = 2,\n"
                            "画布长 = 6, \n"
                            "画布宽 = 6, \n"
                            "标题 = None,\n"
                            "绘图标记 = None,\n\n"
                            "网格线 = False,\n"
                            "网格线方向 = 'both',\n"
                            "网格线样式 = '-', \n"
                            "网格线RGB = '#000',\n"
                            "网格线宽度 = 0.5\n"
                            "-------------------------------------\n"
                            "然后就是子图(这个超级多，但是你简化一下就会发现，这些其实都特别少，重复的特别多)\n\n"
                            "模式,\n\n\n"
                            "总标题 = None,\n"
                            "子图a标题 = None,\n"
                            "子图b标题 = None, \n"
                            "子图c标题 = None, \n"
                            "子图d标题 = None, \n\n\n"
                            "x轴数据源 = None, \n"
                            "y轴数据源 = None, \n"
                            "xa轴数据源 = None,\n"
                            "ya轴数据源 = None, \n"
                            "xb轴数据源 = None, \n"
                            "yb轴数据源 = None, \n"
                            "xc轴数据源 = None, \n"
                            "yc轴数据源 = None, \n\n\n"
                            "绘图标记 = None,\n"
                            "网格线方向 = 'both',\n"
                            "网格线样式 = '-', \n"
                            "网格线RGB = '#000'\n"
                            "网格线宽度 = 0.5, \n"
                            "网格线 = False, \n\n\n"
                            "x轴名 = 'x',\n"
                            "y轴名 = 'y',\n"
                            "xa轴名 = 'xa',\n"
                            "ya轴名 = 'ya',\n"
                            "xb轴名 = 'xb',\n"
                            "yb轴名 = 'yb',\n"
                            "xc轴名 = 'xc',\n"
                            "yc轴名 = 'yc',\n"
                            "-----------------------------------\n"
                            "然后是柱形图，柱形图的预置变量相对来说要少很多\n"
                            "x轴名数组,\n"
                            "y轴数据组,\n"
                            "背景数组=None,\n"
                            "模式='竖',\n"
                            "宽度=0.5,\n"
                            "高度=0.1,\n"
                            "标题=None,\n"
                            "网格线=False,\n"
                            "网格线方向='both',\n"
                            "网格线样式='-',\n"
                            "网格线RGB='#000',\n"
                            "网格线宽度=0.5\n"
                            "----------------------------------\n"
                            "最后就是饼图了,因为饼图这个图很特殊，所以他的变量是所有当中变量最少的\n\n\n"
                            "数据组, \n"
                            "数据组标签=None,\n"
                            "数据组颜色=None, \n"
                            "总标题=None, \n"
                            "百分比=False\n"
                            "---------------------------------\n"
                            "然后。。。然后就没了，哈欠。。。"
                            , "matplotlib中文辅助模块 - 高级教程", "ok")

                if a == "Fishsys模块":
                    res = window.列表选择对话框("这是Fishconsole的功能模块（之前是tool，但是后来功能增强了）", "Fishsys模块", [
                        "密码模块",
                        "网易云音乐模块",
                        "排名模块",
                        "文件存在性检测模块",
                        "缓存模块",
                        "文本转Unicode模块",
                        "强制类型检测",
                        "讯飞云控",
                        "官网存活性检测",
                    ])
                    logs.系统日志(f"用户请求启动{res}")
                    if res is None:
                        logs.安全退出("用户取消了操作")
                    # noinspection PyAssignmentToLoopOrWithParameter
                    for a in res:
                        if a == "官网存活性检测":
                            window.弹窗(
                                "其实就是一爬虫，看官网存不存在，也可以用来检测联网没有\n"
                                "-----------------------------\n\n"
                                "语法就是\n"
                                "Fishsys.官网存活性检测(官网地址)\n\n"
                                "有返回Ture，没有返回False"
                                , "官网存活性检测", "ok")
                        if a == "讯飞云控":
                            window.弹窗(
                                "我记忆中对云控最字面的理解就是云端控制，也就是从服务器中下载需要的数据\n\n"
                                "这时，就要白嫖服务器了，这里选择讯飞（感谢Coolapk@寒鸽的FusionApp让我在初一时第一次体验了更新弹窗的实现方式）\n"
                                "-----------------------------\n\n"
                                "语法就是\n"
                                "Fishsys.讯飞云控(fid)\n\n"
                                "讯飞语记fid（如何获得？使用检查，找到相关的json数据就可以拿走fid）"
                                , "讯飞云控", "ok")
                        if a == "密码模块":
                            window.弹窗(
                                "这个加密其实特别简单，就是把一个字换成另一个字让你看不懂就行了，嗯，他的值是返回过来的\n"
                                "本来这个玩具的完全体是有gui的，但是为了顺应模块的需要，我又把它砍了，这就做了一些很无语的调整\n"
                                "嗯，就这样把\n"
                                "------------------------\n"
                                "加密示例：\n"
                                "Fishsys.密码(1，原文，密码（默认为字符串类型的空）)\n\n"
                                "解密示例：\n"
                                "Fishsys.密码(2，原文，密码（默认为字符串类型的空）)\n\n"
                                , "password加密模块", "ok")
                        if a == "网易云音乐模块":
                            window.弹窗(
                                "这个模块其实就是一个爬虫，爬的网易云的歌单里面的歌，最多只能爬一首歌单的前10首，vip的只能爬前几秒，下就下在根目录（我在搞事情哈哈）\n"
                                "-----------------------------\n\n"
                                "示例语法\n"
                                "Fishsys.网易云音乐(['歌单链接1'，'歌单链接2'])"
                                , "网易云音乐模块", "ok")
                        if a == "排名模块":
                            window.弹窗(
                                "这个东西呢，就是对你输入的数据排个序，然后再按照你指定的那个序号来返回\n"
                                "-----------------------------\n\n"
                                "语法就是\n"
                                "Fishsys.排名(数据源,第几个)"
                                , "排名模块", "ok")
                        if a == "文件存在性检测模块":
                            window.弹窗(
                                "就是找文件，他返回的是布尔值，有呢就是False，没有就是Ture，虽然没什么鸟用，但是总有人要用/dogedoge/咖啡\n"
                                "-----------------------------\n\n"
                                "语法就是\n"
                                "Fishsys.文件存在性检测(文件名)"
                                , "文件存在性检测模块", "ok")
                        if a == "缓存模块":
                            window.弹窗(
                                "一个工程如果大起来了的话，为了可以更好的运行，就免不了使用配置文件，但是，按照普通的读取方式就是读写一个文件的话，一堆文件就会把我们搞的惊慌失措，所以我整了个这个玩意儿，它相当于是暂时帮我们解决了这个问题，现在是用列表存的，以后可能会改成字典，这要取决于我自己的体验，如果体验实在难以接受，我tm。。。"
                                "\n-----------------------------\n\n"
                                "语法就是\n\n"
                                "Fishsys.缓存(模式, '字典（请注意，字符串用单引号括起来，千万不要用双引号，否则将过不了加密',缓存文件的名字)\n\n"
                                "模式有两种\n\n1:写\n覆写模式就是创建缓存文件，你需要两个模式和缓存一起使用\n\n2：读\n你只需要两个参数（模式，文件名），他会返回给你一个列表\n但如果你在之前没有创建文件，那么我们将会返回一个布尔值（False）\n\n"
                                "当然，不可能我们在任何时候都会把所有的缓存文件放在一起，所以我允许指定文件的名字\n"
                                "但是每次都在后面指定文件的名字的话就有点废手了，为了避免这种情况，我们可以在开头就指定好文件的名字，这样就可以了\n\n"
                                "示例语法\n"
                                "Filename='1.txt'\n"
                                "a = 缓存(2, '{'a':123,'b':456}',Filename)"
                                , "缓存模块", "ok")
                        if a == "文本转Unicode模块":
                            window.弹窗(
                                "这个东西，就是先转unicode，然后再用字符串返回给你\n\n他也可以转回byte然后返回byte的内容，其实也就是密码2.0的一个辅助模块罢了，但是呢，由于一些十分令人笑哭的原因，我把它独立了出来\n"
                                "-----------------------------\n\n"
                                "语法就是\n"
                                "Fishsys.文本转Unicode(模式，原文)\n"
                                "模式有两种，模式1：为文本转unicode\n模式2：为str类型的unicode转文字\n"
                                , "文本转unicode", "ok")
                        if a == "强制类型检测":
                            window.弹窗(
                                "这个东西的用处还是挺多的，就是在防止乱给参数的情况"
                                "\n-----------------------------\n\n"
                                "语法就是\n"
                                "Fishsys.强制类型检测(任意变量，预期类型)\n"
                                "如果传入的变量类型符合预期的变量类型，就返回Ture，否则返回False。\n\n"
                                "其实也就那样了\n"
                                , "强制类型检测", "ok")
