import { Logger } from "log4js"
import { Server } from "@hapi/hapi"
import { Request, ResponseToolkit, Lifecycle } from "@hapi/hapi"
import { TUserModel } from "@/models/user"
import { TColorModel } from "@/models/color"
import { TColorCateModel } from "@/models/color_cate"
import yar from "@hapi/yar"
import { TAttachmentModel } from "@/models/Attachment"

declare global {
    var server: Server
    var logger: Logger
    var loggerSite: Logger
    var loggerSQL: Logger
}

interface Models {
    user: TUserModel
    color: TColorModel
    color_cate: TColorCateModel
    attachment: TAttachmentModel
}

declare module "sequelize" {
    namespace Model {
        export let associate: (models: Models) => void
    }
}

declare module "@hapi/hapi" {
    interface Request {
        getModel<T extends keyof Models, M extends Models[T]>(name: T): M
        yar: yar.Yar
    }
    interface Server {
        yar: yar.ServerYar
    }
    interface ResponseToolkit { }
}

export declare type Req = Request
export declare type Res = ResponseToolkit
export declare type ReturnValue = Promise<Lifecycle.ReturnValue>