const pool = require("../config");

const InsertNotificationErrorDb = async () => {
  const insertQuery = `
    INSERT INTO notification_error (
      error_code_id,
      is_active,
      is_delivered,
      is_read,
      is_send,
      message_error_issue
    )
    SELECT
      b.error_code_id,
      1 AS is_active,
      1 AS is_delivered,
      0 AS is_read,
      1 AS is_send,
      CONCAT(
        COALESCE(b.error_code_description, '-'),
        ' pada ',
        COALESCE(d.plant_sub_section_name, '-'),
        '. Pengecekan potensi kerusakan dibutuhkan'
      ) AS message_error_issue
    FROM brand_code b

    CROSS JOIN m_plant_sub_section d

    LEFT JOIN notification_error ne
      ON ne.error_code_id = b.error_code_id
      AND ne.deleted_at IS NULL

    WHERE b.deleted_at IS NULL
      AND d.deleted_at IS NULL
      AND ne.notification_error_id IS NULL
  `;

  await pool.query(insertQuery);
};



const getAllNotificationDb = async (searchParams = {}) => {
  let queryParams = [];

  // Tambahkan data baru jika belum ada
  await InsertNotificationErrorDb();

  if (searchParams.limit) {
    const page = Number(searchParams.page ?? 1) - 1;
    queryParams = [Number(searchParams.limit ?? 10), page];
  }

  // Build dynamic WHERE OR
  const { whereOrConditions, whereParamOr } = pool.buildStringOrIlike(
    [
      "b.error_code",
      "b.error_code_name",
      "c.solution_name",
      "COALESCE(a.is_send, 0)",
      "COALESCE(a.is_delivered, 0)",
      "COALESCE(a.is_read, 0)",
      "COALESCE(a.is_active, 0)"
    ],
    searchParams.criteria,
    queryParams
  );
  if (whereParamOr) queryParams = whereParamOr;

  // Build dynamic WHERE AND
  const { whereConditions, whereParamAnd } = pool.buildFilterQuery(
    [
      { column: "COALESCE(a.is_send, 0)", param: searchParams.is_send, type: "int" },
      { column: "COALESCE(a.is_delivered, 0)", param: searchParams.is_delivered, type: "int" },
      { column: "COALESCE(a.is_read, 0)", param: searchParams.is_read, type: "int" },
      { column: "COALESCE(a.is_active, 0)", param: searchParams.is_active, type: "int" },
    ],
    queryParams
  );
  if (whereParamAnd) queryParams = whereParamAnd;


  const queryText = `
    SELECT
      COUNT(*) OVER() AS total_data,

      a.*,
      b.error_code,
      b.error_code_name,

      c.solution_name,
      c.type_solution,
      c.path_solution,

      d.plant_sub_section_name,
      e.device_location

    FROM notification_error a
    LEFT JOIN brand_code b
      ON a.error_code_id = b.error_code_id
      AND b.deleted_at IS NULL

    LEFT JOIN brand_code_solution c
      ON b.error_code_id = c.error_code_id
      AND c.deleted_at IS NULL

    CROSS JOIN m_plant_sub_section d

    CROSS JOIN m_device e

    WHERE a.deleted_at IS NULL
      ${
        whereConditions.length > 0
          ? ` AND ${whereConditions.join(" AND ")}`
          : ""
      }
      ${whereOrConditions ? ` ${whereOrConditions}` : ""}

    ORDER BY a.notification_error_id DESC

    ${searchParams.limit ? `OFFSET $2 * $1 ROWS FETCH NEXT $1 ROWS ONLY` : ""}
  `;

  const result = await pool.query(queryText, queryParams);

  const total =
    result?.recordset?.length > 0
      ? parseInt(result.recordset[0].total_data, 10)
      : 0;

  return { data: result.recordset, total };
};

module.exports = {
  getAllNotificationDb,
};
