/**
 * RestoHub Central - Google Apps Script Backend (Code.gs)
 * Handles JSON API requests for multi-branch Resto & POS system
 */

function doGet(e) {
  return ResponseHandler({ status: "success", message: "RestoHub Central API Server Running" });
}

function doPost(e) {
  const lock = LockService.getScriptLock();
  try {
    lock.waitLock(10000); // 10 second timeout pengaman (Mencegah tabrakan data kasir)
    
    if (!e || !e.postData || !e.postData.contents) {
      return ResponseHandler({ status: "error", message: "Payload kosong" });
    }

    const payload = JSON.parse(e.postData.contents);
    const action = payload.action;

    if (action === "login") {
      return handleLogin(payload);
    } else if (action === "getInitialData") {
      return handleGetInitialData();
    } else if (action === "processTransaction") {
      return handleProcessTransaction(payload);
    } else if (action === "saveMenu") {
      return handleSaveMenu(payload);
    } else if (action === "updateStock") {
      return handleUpdateStock(payload);
    } else {
      return ResponseHandler({ status: "error", message: "Aksi tidak dikenal" });
    }

  } catch (err) {
    return ResponseHandler({ status: "error", message: err.toString() });
  } finally {
    lock.releaseLock();
  }
}

// Jalankan fungsi ini SATU KALI di awal untuk membuat struktur tabel Database otomatis
function setupAwal() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  // 1. Users Sheet
  let sheetUsers = ss.getSheetByName("Users");
  if (!sheetUsers) {
    sheetUsers = ss.insertSheet("Users");
    sheetUsers.appendRow(["Username", "Password", "Role", "BranchCode", "FullName"]);
    sheetUsers.appendRow(["admin", "123", "HQ", "HQ", "Admin Office HQ"]);
    sheetUsers.appendRow(["kasir_kuta", "123", "CABANG", "KT01", "Kasir Budi (Kuta)"]);
    sheetUsers.appendRow(["kasir_ubud", "123", "CABANG", "UB02", "Kasir Siti (Ubud)"]);
    formatSheetHeader(sheetUsers);
  }

  // 2. Branches Sheet
  let sheetBranches = ss.getSheetByName("Branches");
  if (!sheetBranches) {
    sheetBranches = ss.insertSheet("Branches");
    sheetBranches.appendRow(["BranchCode", "Name", "Address", "CashierUser"]);
    sheetBranches.appendRow(["HQ", "Kantor Pusat (HQ)", "Jl. Sudirman No. 1, Jakarta", "admin"]);
    sheetBranches.appendRow(["KT01", "Cabang Kuta", "Jl. Sunset Road No. 88, Kuta, Bali", "kasir_kuta"]);
    sheetBranches.appendRow(["UB02", "Cabang Ubud", "Jl. Raya Ubud No. 12, Gianyar, Bali", "kasir_ubud"]);
    formatSheetHeader(sheetBranches);
  }

  // 3. Menu Sheet
  let sheetMenu = ss.getSheetByName("Menu");
  if (!sheetMenu) {
    sheetMenu = ss.insertSheet("Menu");
    sheetMenu.appendRow(["MenuID", "Name", "Category", "Price", "Status", "ImageURL"]);
    sheetMenu.appendRow(["M-01", "Nasi Goreng Special RestoHub", "Makanan", 35000, "Aktif", "https://images.unsplash.com/photo-1603133872878-684f208fb84b?w=300"]);
    sheetMenu.appendRow(["M-02", "Ayam Bakar Madu Sambal Matah", "Makanan", 42000, "Aktif", "https://images.unsplash.com/photo-1598515214211-89d3c73ae83b?w=300"]);
    sheetMenu.appendRow(["M-03", "Es Kopi Susu Aren Gula Merah", "Minuman", 22000, "Aktif", "https://images.unsplash.com/photo-1517701604599-bb29b565090c?w=300"]);
    formatSheetHeader(sheetMenu);
  }

  // 4. Stock Sheet
  let sheetStock = ss.getSheetByName("Stock");
  if (!sheetStock) {
    sheetStock = ss.insertSheet("Stock");
    sheetStock.appendRow(["StockID", "BranchCode", "MenuID", "MenuName", "StockQty", "MinStock"]);
    sheetStock.appendRow(["S-01", "KT01", "M-01", "Nasi Goreng Special RestoHub", 50, 10]);
    sheetStock.appendRow(["S-02", "KT01", "M-02", "Ayam Bakar Madu Sambal Matah", 5, 5]);
    sheetStock.appendRow(["S-03", "KT01", "M-03", "Es Kopi Susu Aren Gula Merah", 100, 20]);
    sheetStock.appendRow(["S-04", "UB02", "M-01", "Nasi Goreng Special RestoHub", 30, 10]);
    formatSheetHeader(sheetStock);
  }

  // 5. Transactions Sheet
  let sheetTrx = ss.getSheetByName("Transactions");
  if (!sheetTrx) {
    sheetTrx = ss.insertSheet("Transactions");
    sheetTrx.appendRow(["TrxID", "BranchCode", "BranchName", "Cashier", "Date", "CustomerName", "PaymentMethod", "Total", "Tax", "Discount", "GrandTotal"]);
    formatSheetHeader(sheetTrx);
  }
}

function formatSheetHeader(sheet) {
  const range = sheet.getRange(1, 1, 1, sheet.getLastColumn());
  range.setFontWeight("bold");
  range.setBackground("#f59e0b");
  range.setFontColor("#ffffff");
  sheet.setFrozenRows(1);
}

function handleLogin(payload) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Users");
  const data = sheet.getDataRange().getValues();

  for (let i = 1; i < data.length; i++) {
    const username = String(data[i][0]).trim();
    const password = String(data[i][1]).trim();
    
    if (username === String(payload.username).trim() && password === String(payload.password).trim()) {
      return ResponseHandler({
        status: "success",
        user: {
          username: username,
          role: data[i][2],
          branchCode: data[i][3],
          name: data[i][4]
        }
      });
    }
  }
  return ResponseHandler({ status: "error", message: "Username atau password salah!" });
}

function handleGetInitialData() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  
  const branches = getSheetDataFormatted(ss.getSheetByName("Branches"));
  const menu = getSheetDataFormatted(ss.getSheetByName("Menu"));
  const stock = getSheetDataFormatted(ss.getSheetByName("Stock"));
  const transactions = getSheetDataFormatted(ss.getSheetByName("Transactions"));

  return ResponseHandler({
    status: "success",
    data: { branches, menu, stock, transactions }
  });
}

function handleProcessTransaction(payload) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Transactions");
  const trx = payload.transaction;

  // Catat riwayat transaksi ke sheet
  sheet.appendRow([
    trx.id,
    trx.branchCode,
    trx.branchName,
    trx.cashier,
    trx.date,
    trx.customerName,
    trx.paymentMethod,
    trx.total,
    trx.tax,
    trx.discount,
    trx.grandTotal
  ]);

  // Update potong stok otomatis berdasarkan item yang dibeli
  const sheetStock = ss.getSheetByName("Stock");
  const stockData = sheetStock.getDataRange().getValues();
  
  trx.items.forEach(item => {
    for (let i = 1; i < stockData.length; i++) {
      if (String(stockData[i][1]) === trx.branchCode && String(stockData[i][2]) === item.id) {
        let currentQty = parseInt(stockData[i][4]) || 0;
        let newQty = Math.max(0, currentQty - item.qty);
        sheetStock.getRange(i + 1, 5).setValue(newQty); // Update kolom StockQty
        break; // Lanjut ke item berikutnya
      }
    }
  });

  return ResponseHandler({ status: "success", message: "Transaksi berhasil dicatat & Stok diperbarui" });
}

function handleSaveMenu(payload) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Menu");
  const m = payload.menu;

  sheet.appendRow([m.id, m.name, m.category, m.price, m.status, m.image]);
  return ResponseHandler({ status: "success", message: "Menu berhasil disimpan" });
}

function handleUpdateStock(payload) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Stock");
  const data = sheet.getDataRange().getValues();

  for (let i = 1; i < data.length; i++) {
    if (String(data[i][0]) === String(payload.stockId)) {
      sheet.getRange(i + 1, 5).setValue(payload.newQty);
      return ResponseHandler({ status: "success", message: "Stok berhasil diperbarui" });
    }
  }
  return ResponseHandler({ status: "error", message: "ID Stok tidak ditemukan" });
}

function getSheetDataFormatted(sheet) {
  if (!sheet) return [];
  const values = sheet.getDataRange().getValues();
  if (values.length <= 1) return [];
  
  const headers = values[0];
  const result = [];
  for (let i = 1; i < values.length; i++) {
    let obj = {};
    for (let j = 0; j < headers.length; j++) {
      obj[headers[j]] = values[i][j];
    }
    result.push(obj);
  }
  return result;
}

function ResponseHandler(obj) {
  return ContentService.createTextOutput(JSON.stringify(obj))
    .setMimeType(ContentService.MimeType.JSON);
}

/* PLACEHOLDER: FUNGSI CRUD BARU */