const cron = require("node-cron");
const add_funds_module = require("../model/add_funds_module");
const { archiveOldBids } = require("../controllers/adminController");
const { archiveOldWalletTransactions } = require("../utils/walletArchiveService");
const wallet_trans_history_module = require("../model/wallet_trans_history_module");
const user_module = require("../model/user_module");
const admin_module = require("../model/admin_module");
const withdraw_fund_request_module = require("../model/withdraw_fund_request_module");


const {authenticate, checkStatus} = require("../services/dollarbazar.service");
const { getAuthTokens, checkPayoutStatus } = require("../services/dollarbazar.service");



// const winGoController = require("../controllers/winGoController");
// Import the archive function, not the schema


/**
 * Start the cron job
 * @param {string} schedule - Cron schedule expression (default: daily at 2 AM)
 */
// const startArchiveCronJob = (schedule = '0 2 * * *') => { // 




function startPayinStatusCron() {
  console.log("🚀 Pay-In Status Checker Cron Started...");

  // Run every 0 min, 20-min, 60/0  minutes
  // cron.schedule("*/20 * * * *", async () => {
  //   console.log("\n\n\n🔎 Checking pending Pay-In deposits...\n\n\n");

  //   try {
  //     const pending = await add_funds_module.find({ fund_status: 0, deposit_type: 1 });
  //     console.log("🚀 ~ startPayinStatusCron ~ pending.length:", pending.length);

  //     if (!pending.length) {
  //       console.log("No pending orders.");
  //       return;
  //     }

  //     for (const deposit of pending) {
  //       console.log("🚀 ~ startPayinStatusCron ~ deposit:", deposit)
  //       const orderId = deposit.tx_request_number;
        

  //       console.log("⏳ Checking order:", orderId);

  //       // Step 1: Authenticate again
  //       const auth = await authenticate(deposit.amount, orderId);
  //       console.log("🚀 ~ startPayinStatusCron ~ auth:", auth)

  //       // Step 2: Hit status API
  //       const statusResp = await checkStatus(auth.api_token, auth.id_token, orderId);
  //       console.log("🚀 ~ startPayinStatusCron ~ statusResp:", statusResp)

  //       if (!statusResp?.success) {
  //         console.log("❌ Status API failed:", orderId);
  //         continue;
  //       }

  //       const data = statusResp.data;
  //       const status = data.status;
  //       const utr = data.bankReference;

  //       console.log("📌 Gateway Status:", status);

  //       // SUCCESS
  //       if (status === "SUCCESS" && data.orderStatus === "PAID" && utr) {
  //         const user = await user_module.findById(deposit.userDB_id);

  //         user.wallet_balance += Number(deposit.amount);
  //         await user.save();

  //         // const mainAdmin = await admin_module.findOneAndUpdate({admin_type:0}, {$inc:{wallet_amount:-deposit.amount}})
  //         // console.log("🚀 ~ startPayinStatusCron ~ mainAdmin:", mainAdmin)

  //         const mainAdmin = await admin_module.findOneAndUpdate(
  //           { admin_type: 0 },                                   // find the main admin
  //           { $inc: { wallet_amount: -deposit.amount } }        // ← THIS IS THE KEY
  //         );

  //         deposit.fund_status = 1;
  //         deposit.bank_utr = utr;
  //         deposit.gateway_txn_id = data.transactionId;
  //         await deposit.save();

  //         await wallet_trans_history_module.create({
  //           userDB_id: user._id,
  //           amount: deposit.amount,
  //           transaction_type: 1,
  //           transaction_note: "Auto Deposit via Cron - DollarBazar",
  //           amount_status: 19,
  //           txn_ref: data.transactionId,
  //           tx_request_number: orderId
  //         });

  //         console.log("✅ SUCCESS Updated for:", orderId);
  //       }

  //       // FAILED cases
  //       else if (status === "FAIL") {
  //         deposit.fund_status = 2;
  //         deposit.gateway_txn_id = data.transactionId;
  //         await deposit.save();

  //         console.log("❌ FAILED Updated for:", orderId);
  //       }

  //       // ACTIVE/PENDING → do nothing
  //       else {
  //         console.log("⏳ Still Pending:", orderId);
  //       }
  //     }
  //   } catch (err) {
  //     console.error("Cron error:", err);
  //   }
  // });
}


// =========================================================
//  ⭐ NEW: PAYOUT STATUS CRON (ADD THIS INSIDE SAME FILE)
// =========================================================
function startPayoutStatusCron() {
  console.log("🚀 Payout Status Checker Cron Started...");

  // Runs every 10 min.
  // cron.schedule("*/10 * * * *", async () => {
  //   console.log("🔎 Checking Pending Payout Withdrawals...");

  //   try {
  //     const pending = await withdraw_fund_request_module.find({
  //       fund_status: 0,
  //       payment_method: 7,
  //       withdraw_type: 1
  //     });

  //     console.log("🚀 Pending Payouts:", pending.length);

  //     if (!pending.length) return;

  //     for (const request of pending) {
  //       const orderId = request.tx_request_number;

  //       console.log(`⏳ Checking payout for: ${orderId}`);

  //       // Step 1 → Auth again
  //       const auth = await getAuthTokens(request.amount, orderId);

  //       // Step 2 → Check payout status
  //       const statusResp = await checkPayoutStatus(orderId, auth);
  //       console.log("📌 Payout Status Response:", statusResp);

  //       if (!statusResp?.success) continue;

  //       const data = statusResp.data;

  //       // SUCCESS
  //       if (data.status === "SUCCESS") {
  //         console.log(`✅ Payout SUCCESS: ${orderId}`);

  //         request.fund_status = 1;
  //         request.utr = data.bankRefId ?? "";
  //         request.gateway_txn_id = data.transactionId;
  //         request.remark = "Payout Successful via Cron";
  //         await request.save();

  //         await wallet_trans_history_module.updateOne(
  //           { tx_request_number: orderId },
  //           {
  //             $set: {
  //               status: "SUCCESS",
  //               utr: data.bankRefId,
  //               txn_ref: data.transactionId
  //             }
  //           }
  //         );

  //         continue;
  //       }

  //       // FAILED
  //       if (data.status === "FAIL") {
  //         console.log(`❌ Payout FAILED: ${orderId}`);

  //         request.fund_status = 2;
  //         request.remark = data.remark || "Payout Failed";
  //         request.gateway_txn_id = data.transactionId;
  //         await request.save();

  //         // Refund wallet
  //         const user = await user_module.findById(request.userDB_id);
  //         user.wallet_balance += Number(request.amount);
  //         await user.save();

  //         await wallet_trans_history_module.updateOne(
  //           { tx_request_number: orderId },
  //           {
  //             $set: {
  //               status: "FAILED",
  //               remark: "Payout Failed - Refund Added"
  //             }
  //           }
  //         );

  //         continue;
  //       }

  //       // STILL PENDING
  //       console.log(`⏳ Still Pending: ${orderId}`);
  //     }

  //   } catch (err) {
  //     console.error("❌ Payout Cron Error:", err);
  //   }
  // });
}





const startAllArchiveCronJobs = () => {
  console.log('----------------Initializing all archive cron jobs...----------------');

  // cron.schedule('1 * * * *', async () => {
  // Schedule for bid archive (run at 2 AM daily)
  cron.schedule('0 2 * * *', async () => {
    console.log('⏰ Running bid archive job...');
    try {
      const result = await archiveOldBids();
      console.log('✅ Bid archive result:', result.message);
    } catch (error) {
      console.error('❌ Bid archive job failed:', error);
    }
  });

  // Schedule for wallet archive (run at 2 AM daily)
  cron.schedule('0 2 * * *', async () => {
    console.log('⏰ Running wallet archive job...');
    try {
      const result = await archiveOldWalletTransactions();
      console.log('✅ Wallet archive result:', result.message);
    } catch (error) {
      console.error('❌ Wallet archive job failed:', error);
    }
  });

  console.log('✅ All archive cron jobs started successfully');
};









// const cronJobGame1p = (io) => {
//   // cron.schedule("*/30 * * * * *", async () => {
//   //   try {
//   //     const gameType = 30;
//   //     // const duration = 30 * 1000; // 30 sec

//   //     // calc start & end
//   //     // const startTime = new Date();
//   //     // const endTime = new Date(startTime.getTime() + duration);

//   //     // Update OR create one fixed doc
//   //     // const updatedGame = await countdownModule.findOneAndUpdate(
//   //     //   { type: `wingo${gameType}`, duration: gameType },
//   //     //   {
//   //     //     start_time: startTime,
//   //     //     end_time: endTime
//   //     //   },
//   //     //   { upsert: true, new: true }     // upsert → create if not exists
//   //     // );

//   //     //  console.log(`[${new Date().toISOString()}] Updated ${gameType} → Period ${updatedGame.period}`);




//   //     // Get the latest game record
//   //     const result = await winGoModule
//   //       .findOne({ game: gameType })
//   //       .sort({ createdAt: -1 })
//   //       .lean();

//   //       if (result?.length > 0 && result?.status == 1) {

//   //         console.log(`[${new Date().toISOString()}] No Game active → updating status`);
//   //         await winGoModule.findByIdAndUpdate(result._id, {status: 0}, {new: true});
//   //         // await winGoModule.findByIdAndUpdate(result._id, { status: 0 });

//   //       } else {
//   //         console.log(`[${new Date().toISOString()}] active game → creating new`);
//   //       }

//   //     // Run game logic
//   //     await wingo(io, gameType);
//   //   } catch (error) {
//   //     console.error(`[${new Date().toISOString()}] Error in cronJobGame1p:`, error);
//   //   }
//   // });

//   // cron.schedule("0 * * * * *", async () => {
//   //   try {
//   //     const gameType = 1;
//   //     // Get the latest game record
//   //     const result = await winGoModule
//   //       .findOne({ game: `wingo1${gameType}` })
//   //       .sort({ createdAt: -1 })
//   //       .lean();

//   //       if (result?.length > 0 && result?.status == 1) {

//   //           console.log(`[${new Date().toISOString()}] No Game active → updating status`);
//   //           await winGoModule.findByIdAndUpdate(result._id, {status: 0}, {new: true});
//   //           // await winGoModule.findByIdAndUpdate(result._id, { status: 0 });

//   //       } else {
//   //           console.log(`[${new Date().toISOString()}] active game → creating new`);
//   //       }

//   //     // Run game logic
//   //     await wingo(io, gameType);
//   //   } catch (error) {
//   //     console.error(`[${new Date().toISOString()}] Error in cronJobGame1p:`, error);
//   //   }
//   // });
// };

// async function wingo(io, gameType) {
//   try {
//     // Add new game
//     await winGoController.addWinGo({ gameType, io });
//     startCountdown(io, gameType);
   
//   } catch (error) {
//     console.error(`[${new Date().toISOString()}] Error in wingo30:`, error);
//   }
// }

// async function startCountdown(io, gameType) {
//   let countdown ;

//   if(gameType == 1) {
//     countdown = 60;
//   }
//   else if(gameType == 3) {
//     countdown = 180;
//   }
//   else if(gameType == 5) {
//     countdown = 300;
//   }
//   else if(gameType == 5) {
//     countdown = 300;
//   }
//   else if(gameType == 10) {
//     countdown = 600;
//   }
//   else{
//     countdown = 30;
//   }

//   const intervalId = setInterval(() => {
//     countdown--;

//     io.to(`wingo${gameType}`).emit("countdown", {
//       gameType,
//       timeLeft: countdown,
//     });

//     if (countdown <= 1 ) {
//       clearInterval(intervalId);
//       console.log(`Countdown finished for game ${gameType}`);
//     }
//   }, 1000);
// }




module.exports = {
  // cronJobGame1p,
  startPayinStatusCron,
  startPayoutStatusCron,
  startAllArchiveCronJobs
};



























// const cron = require('node-cron');

// const winGoController = require('../controllers/winGoController');

// const winGoModule = require('../model/winGo_module');



// const cronJobGame1p = (io, socket) => {
  
//         cron.schedule('*/30 * * * * *', async () => {


//         const result = await winGoModule.find({game: 'wingo30'}).sort({createdAt: -1}).limit(1);
            
//         if (result.length > 0 && result[0].status == 1) {
//             console.log("yes")
//             await winGoModule.findByIdAndUpdate(result[0]._id, {status: 0}, {new: true});
//             await wingo30();
//         }else{
//             console.log("no")
//             await wingo30();
           
//         }

//         async function wingo30() {    
            
            
//             await winGoController.addWinGo({gameType: 30, io});

//             // await winGoController.handlingWinGo1P(30);
//             await handlingWinGo1P({gameType: 30 });
//             const [winGo1] = await connection.execute('SELECT * FROM `wingo` WHERE `game` = "wingo30" ORDER BY `id` DESC LIMIT 2 ', []);
//             const data = winGo1;
//             io.emit('data-server', { data: data });
//         }
//     });
// }


// module.exports = {
//     cronJobGame1p
// };