import { pool } from "./db";
import { duplicateTemplate } from "./actions/duplicateTemplate";
import { newWordpress } from "./actions/newWordpress";
import { deployToPrd } from "./actions/deployToPrd";
import { permissionsEnable } from "./actions/permissionsEnable";
import { permissionsDisable } from "./actions/permissionsDisable";
import { resetPermissions } from "./actions/resetPermissions";
import { newFtpUser } from "./actions/newFtpUser";
import { backupAllDatabases } from "./actions/backupAllDatabases";

async function sleep(ms: number) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function run() {
  console.log("Runner started");

  while (true) {
    try {
      const [rows]: any = await pool.query(
        "SELECT * FROM jobs WHERE status = 'pending' ORDER BY id ASC LIMIT 1"
      );

      if (rows.length === 0) {
        await sleep(2000);
        continue;
      }

      const job = rows[0];
      const payload =
        typeof job.payload === "string"
          ? JSON.parse(job.payload)
          : job.payload;


      await pool.query(
        "UPDATE jobs SET status = 'running', started_at = NOW() WHERE id = ?",
        [job.id]
      );

      try {
        if (job.type === "duplicate-template") {
          await duplicateTemplate(job.id, payload);
        } else if (job.type === "new-wordpress") {
          await newWordpress(job.id, payload);
        } else if (job.type === "deploy-to-prod") {
          await deployToPrd(job.id, payload);
        } else if (job.type === "permissions-enable") {
          await permissionsEnable(job.id, payload);
        } else if (job.type === "permissions-disable") {
          await permissionsDisable(job.id, payload);
        } else if (job.type === "reset-permissions") {
          await resetPermissions(job.id, payload);
        } else if (job.type === "new-ftp-user") {
          await newFtpUser(job.id, payload);
        } else if (job.type === "backup-all-databases") {
          await backupAllDatabases(job.id, payload);
        } else {
          throw new Error("Unknown job type: " + job.type);
        }

        await pool.query(
          "UPDATE jobs SET status = 'success', finished_at = NOW() WHERE id = ?",
          [job.id]
        );
      } catch (err: any) {
        await pool.query(
          "UPDATE jobs SET status = 'error', error_message = ?, finished_at = NOW() WHERE id = ?",
          [String(err), job.id]
        );
      }
    } catch (err) {
      console.error("Runner loop error", err);
      await sleep(5000);
    }
  }
}

run();
