import express from "express";
import { createUser, deleteUserById, getUserByid, updateUser, } from "../controller/user/ userManagement/user";
import { login } from "../controller/user/ userManagement/login";
import { refreshAccessToken } from "../controller/auth/refresh";
import { logout, revokeAllUserTokens } from "../controller/auth/logout";
import { getCsrfToken } from "../controller/auth/csrfToken";
import { isAuthenticated } from "../config/auth";
import {
  loginLimiter,
  otpRequestLimiter,
  otpVerifyLimiter,
  transactionLimiter,
  fileUploadLimiter,
  registrationLimiter,
  tokenRefreshLimiter,
  adminOperationLimiter,
  readOperationLimiter,
} from "../middleware/rateLimits";
import { apiKeyAuth } from "../middleware/apiKeyAuth";
import { depositByUser, getUserTransactionById, updateAmountsBymenual, } from "../controller/user/transactionManagement/deposit";
import { withdrawByUser } from "../controller/user/transactionManagement/withdraw";
import { fileUpload, s3FileUpload } from "../utills/fileUpload";
import { changePassword, forgotPassword, verifyOTP } from "../controller/user/ userManagement/forgotPassword";
import { adminLogin } from "../controller/admin/login";
import { getAllUsers, getUserProfit, getUsersByYear } from "../controller/admin/user";
import { createSalesPerson, deleteSalespersonsById, getSalePersonById, salespersons, updateSalesPerson } from "../controller/admin/salesPersons";
import { getAllUserTransaction, getAllUserTransactionGraph } from "../controller/admin/totalTransaction";
import { getProfitdataWithGraph } from "../controller/admin/dashboard";
import { getUserGraph } from "../controller/user/transactionManagement/userGraph";
import { notifications, updateNotification } from "../controller/admin/notification";
import { investAmount, updateUserPortfolio } from "../controller/admin/invest";
import { depositAmountByUser } from "../controller/subscription/subscription";
import { transferMoney } from "../controller/wise/wise";
import { payProduct, successPage, cancelPage, withdrawToUser } from "../controller/paypal/paymentController";
import { getCountries, getStates, getCities } from '../controller/user/locationController';
import { getDailyLedger } from '../controller/admin/dailyLedger'
import { updateAmounts } from "../controller/user/transactionManagement/deposit";
import {
  getAllDisclaimers,
  createDisclaimer,
  updateDisclaimer,
  deleteDisclaimer
} from "../controller/menu/disclaimer";
import {
  getAllHowItWorksSteps,
  createHowItWorksStep,
  updateHowItWorksStep,
  deleteHowItWorksStep
} from "../controller/menu/howItWorksSteps";
import {
  getAllTestimonials,
  createTestimonial,
  updateTestimonial,
  deleteTestimonial
} from "../controller/menu/testimonials";
import {
  getAllEducationCourses,
  createEducationCourse,
  updateEducationCourse,
  deleteEducationCourse
} from "../controller/menu/educationCourses";
import {
  getAllReturnExpectations,
  createReturnExpectation,
  updateReturnExpectation,
  deleteReturnExpectation
} from "../controller/menu/returnExpectations";
import {
  getAllDemoVideos,
  createDemoVideo,
  updateDemoVideo,
  deleteDemoVideo
} from "../controller/menu/demoVideos";
import { getVerifiedTrackRecord } from "../controller/user/verifiedTrackRecord";
import {
  uploadFileToS3,
  uploadMultipleFilesToS3,
  deleteFileFromS3
} from "../controller/upload/fileUpload";

// Import validation middleware
import {
  createUserValidation,
  loginValidation,
  refreshTokenValidation,
  logoutValidation,
  revokeAllTokensValidation,
  updateUserValidation,
  depositByUserValidation,
  withdrawByUserValidation,
  forgotPasswordValidation,
  verifyOTPValidation,
  changePasswordValidation
} from "../validation/userValidation";
import {
  adminLoginValidation,
  createSalesPersonValidation,
  updateSalesPersonValidation,
  updateNotificationValidation,
  investAmountValidation,
  updateDailyLedgerValidation,
  depositAmountByUserValidation
} from "../validation/adminValidation";
import {
  transferMoneyValidation,
  payValidation,
  withdrawValidation
} from "../validation/paymentValidation";
import {
  uploadFileToS3Validation,
  uploadMultipleFilesToS3Validation,
  deleteFileFromS3Validation
} from "../validation/uploadValidation";
import {
  createDisclaimerValidation,
  updateDisclaimerValidation,
  createHowItWorksStepValidation,
  updateHowItWorksStepValidation,
  createTestimonialValidation,
  updateTestimonialValidation,
  createEducationCourseValidation,
  updateEducationCourseValidation,
  createReturnExpectationValidation,
  updateReturnExpectationValidation,
  createDemoVideoValidation,
  updateDemoVideoValidation
} from "../validation/menuValidation";

const routes = express.Router();

// User Section Route
// create post

routes.post("/login", loginLimiter, loginValidation, login);
routes.post("/refresh", tokenRefreshLimiter, refreshTokenValidation, refreshAccessToken);
routes.post("/logout", loginLimiter, logoutValidation, logout);
routes.post("/createUser", registrationLimiter, createUserValidation, createUser);
routes.post("/revokeAllTokens", isAuthenticated, loginLimiter, revokeAllTokensValidation, revokeAllUserTokens);
routes.get("/csrf-token", isAuthenticated, readOperationLimiter, getCsrfToken);
routes.post("/updateUser", isAuthenticated, fileUpload.single("profileImg"), updateUserValidation, updateUser);
routes.post("/depositByUser", isAuthenticated, transactionLimiter, depositByUserValidation, depositByUser);
routes.post("/withdrawByUser", isAuthenticated, transactionLimiter, withdrawByUserValidation, withdrawByUser);
routes.post("/forgotPassword", otpRequestLimiter, forgotPasswordValidation, forgotPassword);
routes.post("/verifyOTP", otpVerifyLimiter, verifyOTPValidation, verifyOTP);
routes.post("/changePassword", loginLimiter, changePasswordValidation, changePassword);

// create get
routes.get("/getUserByid/:id", isAuthenticated, getUserByid);
routes.get("/salespersons", salespersons);
routes.get("/getUserTransactionById/:id", isAuthenticated, getUserTransactionById);
routes.get("/getUserGraph/:id", isAuthenticated, getUserGraph);
routes.get("/verified-track-record", getVerifiedTrackRecord);

// create delete
routes.delete("/deleteUserById/:uid", isAuthenticated, deleteUserById);

// Admin Section  Route
// create post
routes.post("/adminLogin", loginLimiter, adminLoginValidation, adminLogin);
routes.post("/createSalesPerson", isAuthenticated, createSalesPersonValidation, createSalesPerson);
routes.post("/updateSalesPerson", isAuthenticated, updateSalesPersonValidation, updateSalesPerson);
routes.post("/updateNotification", isAuthenticated, updateNotificationValidation, updateNotification);
routes.post("/investAmount", isAuthenticated, investAmountValidation, investAmount);
routes.post("/updateDailyLedger", isAuthenticated, updateDailyLedgerValidation, updateUserPortfolio);
routes.post("/depositAmountByUser", isAuthenticated, depositAmountByUserValidation, depositAmountByUser);

routes.post("/updateAmountsBymenual", apiKeyAuth, updateAmountsBymenual)

// get
routes.get("/getAllUsers", isAuthenticated, getAllUsers);
routes.get("/getDailyLedger", isAuthenticated, getDailyLedger);
routes.get("/salespersons",isAuthenticated, salespersons);
routes.get("/getAllUserTransaction", getAllUserTransaction);
routes.get("/getAllUserTransactionGraph", getAllUserTransactionGraph);
routes.get("/getSalePersonById/:id", isAuthenticated, getSalePersonById);
routes.get("/getUsersByYear", isAuthenticated, getUsersByYear);
routes.get("/getProfitdataWithGraph", isAuthenticated, getProfitdataWithGraph);
routes.get("/getUserProfit/:id", isAuthenticated, getUserProfit);
routes.get("/notifications", isAuthenticated, notifications);

// create delete
routes.delete("/deleteSalespersonsById/:id", isAuthenticated, deleteSalespersonsById);

// wise integration
routes.post("/transferMoney", isAuthenticated, transactionLimiter, transferMoneyValidation, transferMoney);

// paypal integration
routes.post('/pay', isAuthenticated, transactionLimiter, payValidation, payProduct);
routes.post('/withdraw', isAuthenticated, transactionLimiter, withdrawValidation, withdrawToUser);
routes.get('/success', successPage);
routes.get('/cancel', cancelPage);

// Routes for cascading dropdown
routes.get('/countries', getCountries); 
routes.get('/states/:countryid', getStates); 
routes.get('/cities/:stateId', getCities);

// S3 File Upload Routes
routes.post('/upload/s3', isAuthenticated, fileUploadLimiter, s3FileUpload.single('file'), uploadFileToS3Validation, uploadFileToS3);
routes.post('/upload/s3/multiple', isAuthenticated, fileUploadLimiter, s3FileUpload.array('files', 10), uploadMultipleFilesToS3Validation, uploadMultipleFilesToS3);
routes.delete('/upload/s3', isAuthenticated, fileUploadLimiter, deleteFileFromS3Validation, deleteFileFromS3);

// Menu Section Routes
// Disclaimer Routes
routes.get('/disclaimers', getAllDisclaimers);
routes.post('/disclaimers', isAuthenticated, createDisclaimerValidation, createDisclaimer);
routes.put('/disclaimers/:id', isAuthenticated, updateDisclaimerValidation, updateDisclaimer);
routes.delete('/disclaimers/:id', isAuthenticated, deleteDisclaimer);

// How It Works Steps Routes
routes.get('/how-it-works-steps', getAllHowItWorksSteps);
routes.post('/how-it-works-steps', isAuthenticated, createHowItWorksStepValidation, createHowItWorksStep);
routes.put('/how-it-works-steps/:id', isAuthenticated, updateHowItWorksStepValidation, updateHowItWorksStep);
routes.delete('/how-it-works-steps/:id', isAuthenticated, deleteHowItWorksStep);

// Testimonials Routes
routes.get('/testimonials', getAllTestimonials);
routes.post('/testimonials', isAuthenticated, createTestimonialValidation, createTestimonial);
routes.put('/testimonials/:id', isAuthenticated, updateTestimonialValidation, updateTestimonial);
routes.delete('/testimonials/:id', isAuthenticated, deleteTestimonial);

// Education Courses Routes
routes.get('/education-courses', getAllEducationCourses);
routes.post('/education-courses', isAuthenticated, createEducationCourseValidation, createEducationCourse);
routes.put('/education-courses/:id', isAuthenticated, updateEducationCourseValidation, updateEducationCourse);
routes.delete('/education-courses/:id', isAuthenticated, deleteEducationCourse);

// Return Expectations Routes
routes.get('/return-expectations', getAllReturnExpectations);
routes.post('/return-expectations', isAuthenticated, createReturnExpectationValidation, createReturnExpectation);
routes.put('/return-expectations/:id', isAuthenticated, updateReturnExpectationValidation, updateReturnExpectation);
routes.delete('/return-expectations/:id', isAuthenticated, deleteReturnExpectation);

// Demo Videos Routes
routes.get('/demo-videos', isAuthenticated, getAllDemoVideos);
routes.post('/demo-videos', isAuthenticated, createDemoVideoValidation, createDemoVideo);
routes.put('/demo-videos/:id', isAuthenticated, updateDemoVideoValidation, updateDemoVideo);
routes.delete('/demo-videos/:id', isAuthenticated, deleteDemoVideo);

// Cron job with curl
routes.post('/trigger-cron', apiKeyAuth, adminOperationLimiter, async (req, res) => {
    try {
        const result = await updateAmounts();
        res.status(200).json({ message: 'Cron triggered successfully!', data: result });
    } catch (error) {
        res.status(500).json({
            message: 'Failed to trigger update.',
            error: error
        });
    }
  });

export default routes;
