/*
 *   This file is a part of the SteamWar software.
 *
 *   Copyright (C) 2025 SteamWar.de-Serverteam
 *
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU Affero General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *   GNU Affero General Public License for more details.
 *
 *   You should have received a copy of the GNU Affero General Public License
 *   along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

package de.steamwar.sql

import de.steamwar.sql.internal.useDb
import org.jetbrains.exposed.v1.core.dao.id.IntIdTable
import org.jetbrains.exposed.v1.javatime.CurrentTimestamp
import org.jetbrains.exposed.v1.javatime.timestamp
import org.jetbrains.exposed.v1.jdbc.insert
import org.jetbrains.exposed.v1.jdbc.insertAndGetId
import java.io.File

object ExceptionTable : IntIdTable("Exception") {
    val time = timestamp("Time").defaultExpression(CurrentTimestamp)
    val server = text("Server")
    val message = text("Message")
    val stackTrace = text("StackTrace")
}

class SWException {
    companion object {
        val cwd = System.getProperty("user.dir")
        val serverName = File(cwd).name

        @JvmStatic
        fun init() =
            Unit

        @JvmStatic
        fun log(message: String, stacktrace: String) =
            useDb {
                ExceptionTable.insert {
                    it[ExceptionTable.server] = serverName
                    it[ExceptionTable.message] = generateMessage(message)
                    it[ExceptionTable.stackTrace] = stacktrace
                }

                Unit
            }

        @JvmStatic
        fun logGetId(message: String, stacktrace: String) =
            useDb {
                ExceptionTable.insertAndGetId {
                    it[ExceptionTable.server] = serverName
                    it[ExceptionTable.message] = generateMessage(message)
                    it[ExceptionTable.stackTrace] = stacktrace
                }.value
            }

        fun generateMessage(message: String): String {
            val msgBuilder = StringBuilder(message)
            SQLWrapper.impl.additionalExceptionMetadata(msgBuilder)
            msgBuilder.append("\nCWD: ").append(cwd)
            return msgBuilder.toString()
        }
    }
}