import express, { Request, Response } from "express";
import yenv from "yenv";
import cors from "cors";
import helmet from "helmet";
import bodyParser from "body-parser"; // Import bodyParser
import { AppDataSource } from "./config/typeOrm";
import routes from "./route";
import swaggerUi from "swagger-ui-express";
import swaggerSpec from "./config/swagger";
// import { CronJob } from "cron";
// import { updateAmounts } from "./controller/user/transactionManagement/deposit";
const app = express();
const env = yenv("env.yaml", { env: "development" });
const path = require('path');

app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, './views'));

app.use(helmet({
  contentSecurityPolicy: {
    directives: {
      defaultSrc: ["'self'"],
      styleSrc: ["'self'", "'unsafe-inline'"],
      scriptSrc: ["'self'"],
      imgSrc: ["'self'", "data:", "https:"],
    },
  },
  hsts: {
    maxAge: 31536000,
    includeSubDomains: true,
    preload: true,
  },
}));

// Use bodyParser middleware
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());


const allowedOrigins = env.CORS_ORIGIN ? env.CORS_ORIGIN.split(',') : ['http://localhost:3000'];
app.use(cors({
  origin: function (origin, callback) {
  if (!origin) return callback(null, true);
  if (allowedOrigins.includes(origin)) {
    callback(null, true);
  } else {
    callback(new Error('Not allowed by CORS'));
  }
},
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With', 'X-CSRF-Token'],
  credentials: true,
}));

// Serve static files from uploads directory
app.use('/uploads', express.static(path.join(__dirname, '../public/uploads')));

app.use((req: Request, res: Response, next) => {next(); });

app.use("/auth/v1", routes); 
app.get("/", (req: Request, res: Response) => {
  res.send("welcome to server !!!");
});
// Serve Swagger UI
app.use("/swaggerapi", swaggerUi.serve, swaggerUi.setup(swaggerSpec));
AppDataSource.initialize()
  .then(() => {
    // const job = new CronJob("59 23 * * *", () => {
    //   const job = new CronJob("* * * * *", () => {
    //   updateAmounts();
    // });

    // job.start();
    console.log("🚀Data Source has been initialized! ✅");
  })
  .catch((err) => {
    // tslint:disable-next-line
    console.error("Error during Data Source initialization", err);
  });

app.listen(env.PORT || 4800, () => {
  // tslint:disable-next-line
  console.log("Hi Server is Running 🚀 at Port " + env.PORT);
});
