require('dotenv').config({ path: `.env.${process.env.NODE_ENV}` })
const express = require('express')
const bodyParser = require('body-parser')
const cors = require('cors');
const { validatedRequest } = require('./utils/middleware/validatedRequest');
const { Pinecone } = require('./utils/pinecone');
const { reqBody } = require('./utils/http');
const { systemEndpoints } = require('./endpoints/system');
const { workspaceEndpoints } = require('./endpoints/workspaces');
const { chatEndpoints } = require('./endpoints/chat');
const app = express();

app.use(cors({ origin: true }));
app.use(validatedRequest);
app.use(bodyParser.text());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));

systemEndpoints(app);
workspaceEndpoints(app);
chatEndpoints(app);

app.post('/v/:command', async (request, response) => {
  const { command } = request.params
  if (!Object.getOwnPropertyNames(Pinecone).includes(command)) {
    response.status(500).json({ message: 'invalid interface command', commands: Object.getOwnPropertyNames(Pinecone.prototype) });
    return
  }

  try {
    const body = reqBody(request);
    const resBody = await Pinecone[command](body)
    response.status(200).json({ ...resBody });
  } catch (e) {
    // console.error(e)
    console.error(JSON.stringify(e))
    response.status(500).json({ error: e.message });
  }
  return;
})


app.all('*', function (_, response) {
  response.sendStatus(404);
});

app.listen(process.env.SERVER_PORT || 5000, () => {
  console.log(`Example app listening on port ${process.env.SERVER_PORT || 5000}`)
})
  .on("error", function (err) {
    process.once("SIGUSR2", function () {
      process.kill(process.pid, "SIGUSR2");
    });
    process.on("SIGINT", function () {
      process.kill(process.pid, "SIGINT");
    });
  });