_program_init();

const express = require('express');
const app = express();

const ip = "0.0.0.0";
const port = process.env.SERVER_PORT;

const cookieParser = require('cookie-parser');

app.use(express.json()); // json 요청 처리
app.use(cookieParser());
//#region root path
/*
4xx: 클라이언트 오류
    400 Bad Request: 잘못된 요청으로 서버가 요청을 처리할 수 없음을 나타냅니다.
    401 Unauthorized: 인증이 필요한 리소스에 인증되지 않은 접근을 시도했음을 나타냅니다.
    403 Forbidden: 요청이 서버에서 거부되었으며, 클라이언트에 권한이 없음을 의미합니다.
    404 Not Found: 요청한 리소스를 찾을 수 없음을 나타냅니다.
    405 Method Not Allowed: HTTP 메서드가 허용되지 않은 경우 사용됩니다.
*/
/*
5xx: 서버 오류
    500 Internal Server Error: 서버에서 요청을 처리하는 중에 문제가 발생했음을 나타냅니다.
    502 Bad Gateway: 서버가 잘못된 응답을 수신했을 때 사용됩니다.
    503 Service Unavailable: 서버가 일시적으로 과부하 상태이거나 유지 보수 중일 때 사용됩니다.
    504 Gateway Timeout: 서버가 게이트웨이 또는 프록시로서 응답 시간을 초과했음을 나타냅니다.
*/
app.use((req, res, next) => {
    console.log(`[REQ - ${req.method}] url : ${req.url}`)
    next();
})
app.get('/', (req, res) => {
    res.sendFile(__dirname + '/index.html')
})
//#endregion

//#region auth path
const authRoutes = require('./src/routes/authRoutes');
app.use('/auth', authRoutes.ar);
//#endregion

app.listen(port, ip, (error) => {
    global.clog.info(`서버가 'http://${ip}:${port}' 에서 실행 중입니다.`);
})

function _program_init() {
    let gtp = require('./src/utils/Global_TP');
    global._GTP = new gtp();
    global.clog = require('./src/utils/consoleLogger').log
    global.clog.info("program!!");
    global.crouter = require('./src/utils/routeHelper').ROUTER;

    const UAC = require('./src/models/userAuthController');
    const PGSQL = require('./src/models/postgre_SQL');
    global._SPM = {
        uac: new UAC(),
        db: {
            pgSql: new PGSQL()
        }
    }

    const dotenv = require('dotenv');
    dotenv.config();
    const envr = process.env.NODE_ENV || 'dev';
    dotenv.config({ path: `.env.${envr}` });

    //#region 개발 모드 or 프로덕션 모드
    global.clog.info(`[${process.env.NODE_ENV} Mode] ---------------------------`)
    //#endregion

    //#region user config set
    global._SPM.uac.Set_Config({
        secret_key: process.env.JWT_SECRET,
        cookie_name: process.env.JWT_COOKIE_NAME,
        exp_time_minute: process.env.AUTH_EXP_TIME_MINUTE,
        session_max_per_user: process.env.AUTH_MAX_SESSION_PER_USER
    })
    global._SPM.db.pgSql.Set_Config({
        HOST: process.env.DB_HOST,
        ID: process.env.DB_ID,
        PW: process.env.DB_PW,
        PORT: process.env.DB_PORT,
        DATABASE: process.env.DB_DATABASE,
        CONNECT_TIMEOUT: process.env.DB_CONNECT_TIMEOUT,
        RECONNECT_MAX_COUNT: process.env.DB_RECONNECT_MAX_COUNT
    })
    //#endregion

    //#region postgresql connect
    global._SPM.db.pgSql.Connect(function() {
        // connected after
    });
    //#endregion
}