// When to Use Server Hooks

// Server hooks are useful for:
// Logging: Log requests, responses, or errors.
// Authentication: Validate requests before they reach API routes.
// Modifying Requests/Responses: Add custom headers or transform data.
// Error Handling: Customize error responses or log errors.
// Resource Management: Clean up resources when the server shuts down.

export default defineNitroPlugin((nitroApp) => {
  // Hook into the server lifecycle
  nitroApp.hooks.hook("nitro:init", (nitro) => {
    console.log("Nitro server is initializing!");
  });

  nitroApp.hooks.hook("request", (event) => {
    console.log("Request received:", event.node.req.url);
  });

  nitroApp.hooks.hook("error", (error, event) => {
    console.error("Error occurred:", error);
  });
});

// // 1. nitro:init
// // This hook is called when the Nitro server is being initialized. It allows you to modify the Nitro configuration or perform setup tasks before the server starts.
// export default defineNitroPlugin((nitroApp) => {
//   nitroApp.hooks.hook("nitro:init", (nitro) => {
//     console.log("Nitro server is initializing!");
//     // Modify nitro options or perform setup tasks
//   });
// });

// // 2. nitro:config
// // This hook is called when the Nitro configuration is being generated. You can use it to modify the Nitro configuration before the server starts.
// export default defineNitroPlugin((nitroApp) => {
//   nitroApp.hooks.hook("nitro:config", (config) => {
//     console.log("Nitro config is being generated!");
//     // Modify the Nitro config
//     config.storage = {
//       redis: {
//         driver: "redis",
//         /* Redis connection options */
//       },
//     };
//   });
// });

// 3. request
// This hook is called when a request is received by the server. You can use it to log requests, modify request data, or perform authentication checks.
// export default defineNitroPlugin((nitroApp) => {
//     nitroApp.hooks.hook('request', (event) => {
//       console.log('Request received:', event.node.req.url);
//       // Modify the request or perform checks
//     });
//   });

// 4. beforeResponse
// This hook is called before the server sends a response. You can use it to modify the response or add custom headers.
// export default defineNitroPlugin((nitroApp) => {
//     nitroApp.hooks.hook('beforeResponse', (event, response) => {
//       console.log('Sending response:', response);
//       // Modify the response or add headers
//       response.headers['X-Custom-Header'] = 'Hello from Nuxt!';
//     });
//   });

// 5. error
// This hook is called when an error occurs during request handling. You can use it to log errors or customize error responses.
// export default defineNitroPlugin((nitroApp) => {
// nitroApp.hooks.hook('error', (error, event) => {
//     console.error('Error occurred:', error);
//     // Customize the error response
//     event.node.res.statusCode = 500;
//     event.node.res.end('Something went wrong!');
// });
// });

// 6. close
// This hook is called when the Nitro server is shutting down. You can use it to clean up resources or perform final tasks.
// export default defineNitroPlugin((nitroApp) => {
//     nitroApp.hooks.hook('close', () => {
//       console.log('Nitro server is shutting down!');
//       // Clean up resources
//     });
//   });