import filePlugin from "./file-plugin"
import path from "path"
import { baseDir, sourceDir } from "@/util"
import { plugin as routePlugin } from "@noderun/hapi-router"
import { ServerRegisterPluginObject, Plugin, Server, Request, ResponseObject } from "@hapi/hapi"
import Hoek from "@hapi/hoek"
import HapiYar from "@hapi/yar"
import HapiCrumb from "@hapi/crumb"
import { Stream } from "stream"
import HapiPino from "hapi-pino"

const pino = require("pino")
const transport = pino.transport({
    targets: [
        // process.env.NODE_ENV !== 'production' ? {
        //     target: 'pino-pretty',
        //     options: {
        //         colorize: true,
        //         translateTime: 'HH:MM:ss.l mmmm dS yyyy "UTC"'
        //     },
        //     level: 'info' } : { target: 'pino/file', level: 'info' },
        {
            target: "pino-pretty",
            level: "trace",
            options: {
                destination: path.resolve(baseDir, "./log/pino.log"),
                colorize: true,
                translateTime: 'HH:MM:ss.l mmmm dS yyyy "UTC"',
                mkdir: true,
                // append: false
            },
        },
        // { target: 'pino/file', level: 'trace', options: {
        //     destination: path.resolve(baseDir, "./log/pino.log"),
        //     mkdir: true,
        //     // append: false
        // }}
    ],
})

export default [
    {
        plugin: HapiPino,
        options: {
            logPayload: true,
            logQueryParams: true,
            logPathParams: true,
            logRouteTags: true,
            // logRequestStart: true,
            instance: pino(transport),
            ignoreFunc: (options, request) => {
                return request.path.startsWith("/public") || request.path.startsWith("/404")
            },
            // stream: fs.createWriteStream(path.resolve(baseDir, "./log/pino.log"), { encoding: "utf-8" })
            // prettyPrint: process.env.NODE_ENV !== 'production',
            // Redact Authorization headers, see https://getpino.io/#/docs/redaction
            // redact: ['req.headers.cookie']
        },
    },
    {
        plugin: filePlugin as unknown as Plugin<any>,
    },
    {
        plugin: routePlugin as Plugin<any>,
        options: {
            auth: ["/api"],
            sourceDir: [
                //   {
                //     dir: path.resolve(sourceDir, "route/api"),
                //     prefix: "api"
                //   },
                {
                    dir: path.resolve(sourceDir, "route/htmx"),
                    prefix: "htmx",
                },
                {
                    dir: path.resolve(sourceDir, "route/views"),
                    prefix: "",
                },
            ],
            type: "session",
        },
    },
    {
        plugin: {
            name: "flash",
            version: "0.0.1",
            // https://github.com/hks-epod/paydash/blob/master/lib/flash.js
            register: function (server: Server, options) {
                server.ext("onPreResponse", async function (request: Request, h) {
                    // @ts-ignore
                    if (request.response.variety === "file") return h.continue // 返回文件时不处理
                    if (request.path.startsWith("/api") || request.path.startsWith("/htmx")) return h.continue
                    // 需要设置auth是try或者true才行
                    const isLogin = request.auth.isAuthenticated
                    // const { id } = request.auth.credentials;
                    // loggerSite.debug(`${isLogin?'当前登录ID:'+id:'未登录用户'}, 请求路径:${request.path}, 请求方法:${request.method}`)

                    // @ts-ignore
                    // console.log(isLogin, request.path, request.response.variety);
                    // let user;
                    // if(isLogin){
                    //   const { id } = request.auth.credentials;
                    //   const User = request.getModel("User")
                    //   user = <any>await User.findOne({ where: { id: id } });
                    //   user = user.toJSON();
                    //   delete user.password;
                    // }
                    // @ts-ignore
                    if (request.yar && request.yar.flash && request.response.variety === "view") {
                        var flash = request.yar.flash()
                        request.yar.set("_flash", {})
                        // @ts-ignore
                        request.response.source.context = Hoek.applyToDefaults(
                            {
                                flash: !!Object.keys(flash).length ? flash : false,
                                isLogin: isLogin,
                                user: isLogin ? request.auth.credentials : false,
                            },
                            // @ts-ignore
                            request.response.source.context,
                        )
                        // @ts-ignore
                    }
                    return h.continue
                })
            },
        } as Plugin<any>,
    },
    {
        plugin: HapiYar,
        options: {
            name: "yar",
            storeBlank: false,
            cookieOptions: {
                password: "dsRhw1Y5UZqB8SjfClbkrX9PF7yuDMV3JItcW0G4vgpaxONo6mzenHLQET2AiKyPUjjdgjo10amjfghy",
                path: "/",
                isSecure: false,
            },
        },
    },
    {
        plugin: HapiCrumb,
        options: {
            autoGenerate: true,
            logUnauthorized: true,
            skip: function (request, reply) {
                // 流的话直接通过,不需要验证,主要用于传递form-data数据时这里通不过
                if (request.payload instanceof Stream) {
                    return true
                }
                return false
            },
            cookieOptions: {
                path: "/",
                isSecure: false,
            },
        },
    },
] as unknown as ServerRegisterPluginObject<any>