import dotenv from "dotenv";
import path from "path";

dotenv.config({
    path: path.resolve(process.cwd(), ".env"),
})

import "./config/firebase.ts";
import express from "express";
import cors from "cors";
import { checkDbConnection } from "./config/db.ts";
import "./crons/cron.ts";
import authRoutes from './routes/auth.route.ts';
import userRoutes from './routes/user.route.ts';
import examsRoutes from './routes/exams.route.ts';
import staffsRoutes from './routes/staffs.route.ts';
import studentsRoutes from './routes/students.route.ts';
import questionBankRoutes from './routes/questionBank.route.ts';
import practiceTestRoutes from './routes/practiceTest.route.ts';
import testsRoutes from './routes/tests.route.ts';
import supportRoutes from './routes/support.route.ts';
import feedbackRoutes from './routes/feedback.route.ts';
import reportsRoutes from './routes/reports.route.ts';
import paymentsRoutes from './routes/payments.route.ts';
import subscriptionPlanRoutes from './routes/subscriptionPlan.route.ts';
import quotesRoutes from './routes/quotes.route.ts';
import subjectsRoutes from './routes/subjects.route.ts';
import syllabusRoutes from './routes/syllabus.route.ts';
import notificationRoutes from './routes/notification.route.ts';
import oldQuestionRoutes from './routes/oldQuestion.route.ts';
import oldQuestionPaperRoutes from './routes/oldQuestionPaper.route.ts';
import dashboardRoutes from './routes/dashboard.route.ts';
import rolesRoutes from './routes/roles.route.ts';
import referenceSequenceRoutes from './routes/referenceSequence.route.ts';
import { errorHandler } from "./middleware/errorHandler.middleware.ts";
import mockTestRoutes from "./routes/mockTest.route.ts";
import leaderboardRoutes from "./routes/leaderboard.route.ts";
import publicContactRoutes from "./routes/publicContact.route.ts";
import subscriptionRequestRoutes from "./routes/subscriptionRequest.route.ts"
import notesLinksRoutes from "./routes/notesLinks.route.ts"
import languageRoutes from "./routes/language.route.ts"
import sharedResourceRoutes from "./routes/sharedResource.route.ts"
import termsAndConditionsRoutes from "./routes/termsCondition.route.ts"
import privacyPolicyRoutes from "./routes/privacyPolicy.route.ts"

export async function createServer() {
    await checkDbConnection();

    const app = express();
    app.use(cors());
    app.use(express.json({
        verify: (req: any, res, buf) => {
            req.rawBody = buf;
        }
    }));
    app.use(express.urlencoded({ extended: true }));

    app.use('/api/health', (req, res) => {
        res.status(200).json({ message: 'API working fine...!' });
    });
    app.use('/api/auth', authRoutes);
    app.use('/api/users', userRoutes);
    app.use("/api/exams", examsRoutes);
    app.use("/api/staffs", staffsRoutes);
    app.use("/api/students", studentsRoutes);
    app.use("/api/question-bank", questionBankRoutes);
    app.use("/api/notes-links", notesLinksRoutes);
    app.use("/api/languages", languageRoutes);
    app.use("/api/practice-test", practiceTestRoutes);
    app.use("/api/tests", testsRoutes);
    app.use("/api/support", supportRoutes);
    app.use("/api/feedback", feedbackRoutes);
    app.use("/api/reports", reportsRoutes);
    app.use("/api/payments", paymentsRoutes);
    app.use("/api/subscription-plans", subscriptionPlanRoutes);
    app.use("/api/subscription-requests", subscriptionRequestRoutes);
    app.use("/api/quotes", quotesRoutes);
    app.use("/api/subjects", subjectsRoutes);
    app.use("/api/syllabus", syllabusRoutes);
    app.use("/api/notifications", notificationRoutes);
    app.use("/api/old-questions", oldQuestionRoutes);
    app.use("/api/old-question-papers", oldQuestionPaperRoutes);
    app.use("/api/dashboard", dashboardRoutes);
    app.use("/api/roles", rolesRoutes);
    app.use("/api/reference-sequences", referenceSequenceRoutes);
    app.use("/api/mock-test", mockTestRoutes);
    app.use("/api/leaderboard", leaderboardRoutes);
    app.use("/api/public-contact", publicContactRoutes);
    app.use("/api/shared-resources", sharedResourceRoutes);
    app.use("/api/terms-conditions", termsAndConditionsRoutes);
    app.use("/api/privacy-policy", privacyPolicyRoutes);
    app.use(
        "/uploads",
        express.static(path.join(process.cwd(), "uploads"), {
            setHeaders: (res, filePath) => {
                res.setHeader("Access-Control-Allow-Origin", "*");
                res.setHeader("Content-Disposition", "inline");
                res.setHeader("Content-Disposition", "attachment");
            },
        })
    );
    app.use(errorHandler);

    // startSampleCron();

    return app;
}
