#!/usr/bin/python
# -*- coding: utf-8 -*-
# @version        : 1.0
# @Creaet Time    : 2022/12/9 15:27 
# @File           : main.py
# @IDE            : PyCharm
# @desc           : 简要说明
import datetime
import os.path

from application.settings import BASE_DIR


class CreateApp:

    APPS_ROOT = os.path.join(BASE_DIR, "apps")
    SCRIPT_DIR = os.path.join(BASE_DIR, 'scripts', 'create_app')

    def __init__(self, path: str):
        """
        @params path: app 路径，根目录为apps，填写apps后面路径即可，例子：vadmin/auth
        """
        self.app_path = os.path.join(self.APPS_ROOT, path)
        self.path = path

    def run(self):
        """
        自动创建初始化 APP 结构，如何该路径已经存在，则不执行
        """
        if self.exist(self.app_path):
            print(f"{self.app_path} 已经存在，无法自动创建，请删除后，重新执行。")
            return False
        print("开始生成 App 目录：", self.path)
        path = []
        for item in self.path.split("/"):
            path.append(item)
            self.create_pag(os.path.join(self.APPS_ROOT, *path))
        self.create_pag(os.path.join(self.app_path, "models"))
        self.create_pag(os.path.join(self.app_path, "params"))
        self.create_pag(os.path.join(self.app_path, "schemas"))
        self.generate_file("views.py")
        self.generate_file("crud.py")
        print("App 目录生成结束", self.app_path)

    def create_pag(self, path: str) -> None:
        """
        创建 python 包

        @params path: 绝对路径
        """
        if self.exist(path):
            return
        os.makedirs(path)
        now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        params = {
            "create_datetime": now,
            "filename": "__init__.py",
            "desc": "初始化文件"
        }
        self.create_file(os.path.join(path, "__init__.py"), "init.py", **params)

    def generate_file(self, name: str) -> None:
        """
        创建文件
        """
        now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        params = {
            "create_datetime": now,
        }
        self.create_file(os.path.join(self.app_path, name), name, **params)

    def create_file(self, filepath: str, name: str, **kwargs):
        """
        创建文件
        """
        with open(filepath, "w", encoding="utf-8") as f:
            content = self.__get_template(name)
            f.write(content.format(**kwargs))

    @classmethod
    def exist(cls, path) -> bool:
        """
        判断路径是否已经存在
        """
        return os.path.exists(path)

    def __get_template(self, name: str) -> str:
        """
        获取模板内容
        """
        template = open(os.path.join(self.SCRIPT_DIR, "template", name), 'r')
        content = template.read()
        template.close()
        return content


if __name__ == '__main__':
    app = CreateApp("test/vv")
    app.run()

