# Author: Acer Zhang
# Datetime: 2021/6/3 
# Copyright belongs to the author.
# Please indicate the source for reprinting.
import os

from qpt.kernel.qlog import Logging, change_none_color
from qpt.executor import CreateExecutableModule

import click

# 终端运行不采用颜色方案
change_none_color()


@click.command()
@click.option("-f",
              "--folder",
              type=str,
              prompt="[项目文件夹]请输入待打包的文件夹路径",
              help='[项目文件夹]待打包的文件夹路径，该目录也应当为整个项目的根目录或工作目录，否则可能会导致出现找不到模块等Python基础报错。',
              required=True)
@click.option("-p",
              "--py",
              type=str,
              prompt="[主程序文件]请输入待打包的主要Py脚本文件路径",
              help="[主程序文件]待打包的主要Py脚本文件所在的路径，例如要yyy/xxx.py中xxx.py是需要打包的主要Python文件，那么该处填写xxx.py即可。",
              required=True)
@click.option("-s", "--save", type=str, prompt="[输出目录]请输入打包后文件保存的路径", help='[输出目录]打包后文件保存的路径。', required=True)
@click.option("-r",
              "--require",
              type=str,
              default="auto",
              prompt="[Python依赖]请输入requirements.txt文件路径，若无该文件可直接按下[回车键]自动生成该文件",
              help="[Python依赖]自动检测软件包依赖，填写auto后将会自动查找待打包的文件夹路径中所有py文件的import使用情况，最终生成requirements文件\n"
                   "当然，也可传入requirements.txt文件路径，这样即可指定依赖列表进行安装。")
@click.option("-h",
              "--hidden",
              default=False,
              type=bool,
              help="[终端窗口]是否隐藏全部终端窗口，若输入true或判定为真则隐藏全部Terminal窗口（适用于使用了PyQT、TK等桌面级可视化程序），"
                   "输入false或判定为否则不隐藏（适用于Console & 终端程序）。")
@click.option("-i",
              "--icon",
              default=None,
              type=str,
              help="[自定义图标文件]传入自定义图标文件路径，为EXE设置属于你的图标样式，支持将exe文件设置为ico/JPG/PNG等格式的自定义图标。")
def cli(folder,
        py,
        save,
        require,
        hidden,
        icon):
    Logging.info("-----------------------------QPT--------------------------------")
    Logging.info("当前执行模式为命令式执行，仅提供QPT基础功能，高阶操作可在GitHub参考最新文档")
    Logging.info("            https://github.com/GT-ZhangAcer/QPT")
    Logging.info("-----------------------------QPT--------------------------------")
    Logging.info(f"[--folder]待打包的文件夹路径为\t{os.path.abspath(folder)}")
    Logging.info(f"[--py]待打包的主Python文件路径为\t{os.path.abspath(py)}")
    Logging.info(f"[--save]打包后文件保存路径为\t{os.path.abspath(save)}")
    if require.lower() == "auto":
        Logging.info(f"[--require]使用自动化依赖查找Module：AutoRequirementsPackage")
    else:
        Logging.info(f"[--require]使依赖列表文件路径为：{os.path.abspath(require)}")
    if hidden:
        Logging.info("[--hidden]当前打包模式为：隐藏全部的Terminal窗口")
    else:
        Logging.info("[--hidden]当前打包模式为：显示Terminal窗口（就是用户打开后的那个黑色框框，可通过指定 -h True 命令来隐藏）")
    if icon:
        Logging.info(f"f[--icon]生成exe将自定义图标为该文件样式{os.path.abspath(icon)}")
    Logging.info("QPT使用命令可输入：qpt --help 获取")
    module = CreateExecutableModule(work_dir=folder,
                                    launcher_py_path=py,
                                    save_path=save,
                                    requirements_file=require,
                                    hidden_terminal=hidden,
                                    icon=icon)
    module.make()


if __name__ == '__main__':
    cli()
