const express = require("express");
const passport = require("passport");
const session = require("express-session");
var cors = require("cors");
const logger = require("morgan");
const path = require("path");
const app = express();
const multer = require("multer");
const { v4: uuidv4 } = require("uuid");
const bodyParser = require("body-parser");

const userRoutes = require("./routes/User.Routes");
const serviceRoutes = require("./routes/Services.Route");
const appointmentRoutes = require("./routes/Appointment.Route");
const stylistRoutes = require("./routes/Stylists");
const notificationRoutes = require("./routes/Notification");
const leaveRoutes = require("./routes/Leave");
const adminRoutes = require("./routes/Admin");

app.use(cors());
app.use(logger("dev"));
const connectDB = require("./config/db");
app.use("/media", express.static(__dirname + "/media"));

const fileStorage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "media");
  },
  filename: function (req, file, cb) {
    let extension = file.originalname.split(".").pop();
    cb(null, uuidv4() + "." + extension);
  },
});

const fileFilter = (req, file, cb) => {
  if (file.fieldname === "profilePhoto" || file.fieldname === "banner") {
    if (file.mimetype.includes("image/")) {
      cb(null, true);
    } else {
      cb(null, false);
    }
  } else if (file.fieldname === "serviceIcon") {
    if (file.mimetype.includes("image/")) {
      cb(null, true);
    } else {
      cb(null, false);
    }
  } else if (
    file.fieldname === "serviceIcon" ||
    file.fieldname === "additionalImages"
  ) {
    if (
      file.mimetype.includes("image/") ||
      file.mimetype.includes("audio/") ||
      file.mimetype.includes("video/")
    ) {
      cb(null, true);
    } else {
      cb(null, false);
    }
  } else {
    cb(null, false);
  }
};

app.use(
  multer({
    storage: fileStorage,
    fileFilter: fileFilter,
  }).fields([
    {
      name: "serviceIcon",
      maxCount: 1,
    },
    {
      name: "profilePhoto",
      maxCount: 1,
    },
    {
      name: "banner",
      maxCount: 1,
    },
  ])
);
app.use(bodyParser.json({ limit: "50mb" }));
app.use(express.urlencoded({ limit: "50mb", extended: false }));
app.use(express.json({ limit: "50mb" }));
require("dotenv").config();
app.use(
  session({
    secret: "rustiks",
    resave: false,
    saveUninitialized: false,
  })
);

app.use(passport.initialize());
app.use(passport.session());
require("./config/Passport")(passport);
connectDB();

app.use("/api/user", userRoutes);
app.use("/api/services", serviceRoutes);
app.use("/api/appointment", appointmentRoutes);
app.use("/api/stylist", stylistRoutes);
app.use("/api/notification", notificationRoutes);
app.use("/api/leave", leaveRoutes);
app.use("/api/admin", adminRoutes);

const PORT = process.env.PORT || 5031;

app.get("/uploads/images/:name", (req, res) => {
  res.sendFile(path.join(__dirname, `./uploads/images/${req.params.name}`));
});

app.listen(PORT, () => {
  console.log(`Server is listening to PORT ${PORT}`);
});
