import { auth, config, method, route, swagger, validate } from "@noderun/hapi-router"
import { Req, Res, ReturnValue } from "#/global"
import path from "path"
import fs from "fs-extra"
import { baseDir, gFail, sourceDir } from "@/util"
import MarkdownIt from "markdown-it"

export default class Index {
    @auth("optional")
    async index(request: Req, h: Res): ReturnValue {

        const md = new MarkdownIt()
        var result = md.render(fs.readFileSync(path.resolve(baseDir, "./docs/index.md"), "utf-8"))

        const isRenderHtmx = Reflect.has(request.query, "htmx")
        if (isRenderHtmx) {
            return h.view("htmx/path/index.pug", { isLogin: request.auth.isAuthenticated, md: result })
        }
        return h.view("views/index.pug", { isLogin: request.auth.isAuthenticated, md: result })
    }

    @route("/about")
    @auth("try")
    async about(request: Req, h: Res) {
        const isRenderHtmx = Reflect.has(request.query, "htmx")
        if (!request.auth.isAuthenticated) {
            if (isRenderHtmx) {
                // https://github.com/hapijs/hapi/issues/4443
                // https://github.com/hapijs/hapi/issues/4212
                return h.response().header("HX-Redirect", `/login?next=${encodeURIComponent(request.path)}`)
            }
            return h.redirect(`/login?next=${encodeURIComponent(request.path)}`).takeover()
        }
        const md = new MarkdownIt()
        // console.log(path.resolve(baseDir, "./docs/a.md"))

        // var result = md.render(fs.readFileSync(path.resolve(baseDir, "./docs/a.md"), "utf-8"))
        const data = {
            // md: result,
        }
        if (isRenderHtmx) {
            return h.view("htmx/path/about.pug", data)
        }
        return h.view("views/about.pug", data)
    }

    @route("/color/del")
    @method("POST")
    @auth()
    async color_del(request: Req, h: Res) {
        const { id } = request.payload as any
        if (!id) {
            request.yar.flash("error", "未提供id")
            return h.redirect("/color")
        }
        try {
            const ColorModel = request.getModel("color")
            await ColorModel.destroy({ where: { id} })
            request.yar.flash("success", "删除成功")
        } catch (error) {
            loggerSite.error(error)
            request.yar.flash("error", "删除失败")
        }
        
        return h.redirect("/color")
    }

    @route("/color")
    @method("POST")
    @auth()
    async color_post(request: Req, h: Res) {
        const { name, value, desctibe } = request.payload as any

        if (!value) {
            request.yar.flash("error", "请输入颜色值")
            return h.redirect("/color")
        }

        try {
            const ColorModel = request.getModel("color")
            await ColorModel.create({ name, value, desctibe })
            request.yar.flash("success", "成功")
        } catch (error) {
            loggerSite.error(error)
            request.yar.flash("error", "插入颜色失败")
        }
        return h.redirect("/color")
    }

    @route("/color")
    async color_get(request: Req, h: Res) {
        const ColorModel = request.getModel("color")
        const colorList = await ColorModel.findAll({})
        // const colorList = await ColorModel.findAll({
        //     include: [
        //         { model: request.getModel("color_cate"), attributes: ['name'] }
        //     ]
        // })
        // console.log(colorList);
        
        // const ColorCateModel = request.getModel("color_cate")
        // console.log(await ColorCateModel.findAll({
        //     include: [request.getModel("color")]
        // }))

        const isRenderHtmx = Reflect.has(request.query, "htmx")
        if (isRenderHtmx) {
            return h.view(`htmx/path/color.pug`, { list: colorList })
        }
        return h.view(`views/color.pug`, { list: colorList })
    }

    @route("/docs/{path*}")
    @auth()
    async docs(req: Req, h: Res): ReturnValue {
        //   const {id} = req.auth.credentials
        //   try {
        //     req.cookieAuth.ttl(720 * 24 * 60 * 60 * 1000)
        //     req.cookieAuth.set({ id: id });
        //   } catch (error) {
        //       console.log(error);

        //   }
        if (req.params && req.params.path.endsWith(".md")) {
            //   console.log(path.resolve(baseDir, "docs/"+"*.md"));
            //   console.log(await glob("docs/"+"*.md"));
            const mdPath = path.resolve(baseDir, "docs/" + req.params.path)
            if (fs.existsSync(mdPath)) {
                const str = fs.readFileSync(mdPath, "utf8")
                console.log("---->", mdPath)

                return h.view("views/css.pug", {
                    content: str.toString(),
                })
            }
            // 解析文档
            return h.view("views/css.pug")
        }
        // 404页面
        return h.redirect("/404")
    }
    @route("/{path*}")
    async any(req: Req, h: Res): ReturnValue {
        if (req.path) {
            const filePath = path.resolve(baseDir, "template/views", "." + req.path + ".pug")
            if (fs.existsSync(filePath)) {
                const isRenderHtmx = Reflect.has(req.query, "htmx")
                if (isRenderHtmx) {
                    return h.view(`htmx/path${req.path}.pug`)
                }
                return h.view(`views${req.path}.pug`)
            }
        }
        console.log("404: ", req.raw.req.url)
        return h.redirect("/404?r=" + encodeURIComponent(req.raw.req.url))
    }
    @route("/404")
    @auth("try")
    async 404(request: Req, h: Res): ReturnValue {
        if (request.auth.isAuthenticated) {
            // 登录了
        } else {
            // 未登录
        }
        if (request.query?.r) {
            // 可重定向返回
        }
        return h.view("404.pug", {
            rollback: request.query?.r,
        })
    }
}