/**
 * wilayah.js — Dropdown Wilayah Indonesia Bertingkat
 * Provinsi → Kab/Kota → Kecamatan → Kelurahan
 * Dipanggil dari checkout.php
 */

const WilayahAPI = BASE_URL + '/wilayah.php';
const wCache = {};

async function wFetch(type, id = '') {
  const key = type + id;
  if (wCache[key]) return wCache[key];
  const url  = WilayahAPI + '?type=' + type + (id ? '&id=' + id : '');
  const resp = await fetch(url);
  const data = await resp.json();
  if (!Array.isArray(data)) throw new Error(data.error || 'Gagal load data wilayah');
  wCache[key] = data;
  return data;
}

function wPopulate(selEl, data, placeholder) {
  selEl.innerHTML = `<option value="">${placeholder}</option>`;
  data.forEach(d => {
    const o = document.createElement('option');
    o.value = d.id;
    o.text  = d.nama;
    selEl.appendChild(o);
  });
  selEl.disabled = false;
}

function wReset(...selIds) {
  selIds.forEach(id => {
    const el = document.getElementById(id);
    if (!el) return;
    el.innerHTML = `<option value="">— Pilih dulu di atas —</option>`;
    el.disabled  = true;
  });
}

// ── Init: load provinsi saat halaman siap ────────────────────
async function wilayahInit() {
  const selProv = document.getElementById('wProvinsi');
  if (!selProv) return;

  selProv.disabled = true;
  selProv.innerHTML = '<option value="">Memuat provinsi...</option>';

  try {
    const data = await wFetch('provinsi');
    wPopulate(selProv, data, '— Pilih Provinsi —');

    // Restore nilai sebelumnya (jika form error lalu re-render)
    const savedProv = selProv.dataset.value;
    if (savedProv) {
      selProv.value = savedProv;
      await wilayahOnProvinsi(savedProv, true);
    }
  } catch(e) {
    selProv.innerHTML = '<option value="">Gagal memuat provinsi</option>';
    console.error('wilayah init:', e);
  }
}

async function wilayahOnProvinsi(provId, restore = false) {
  wReset('wKabupaten','wKecamatan','wKelurahan');
  clearAlamatHidden('kab','kec','kel');

  if (!provId) return;

  const selProv = document.getElementById('wProvinsi');
  const provNama = selProv.options[selProv.selectedIndex]?.text || '';
  document.getElementById('hProvinsi').value     = provNama;
  document.getElementById('hProvinsiId').value   = provId;

  // Sync ke field ongkir jika ada
  syncProvinsiOngkir(provNama);

  const selKab = document.getElementById('wKabupaten');
  selKab.innerHTML = '<option value="">Memuat kabupaten/kota...</option>';

  try {
    const data = await wFetch('kabupaten', provId);
    wPopulate(selKab, data, '— Pilih Kab/Kota —');
    if (restore && selKab.dataset.value) {
      selKab.value = selKab.dataset.value;
      await wilayahOnKabupaten(selKab.dataset.value, true);
    }
  } catch(e) {
    selKab.innerHTML = '<option value="">Gagal memuat</option>';
  }
}

async function wilayahOnKabupaten(kabId, restore = false) {
  wReset('wKecamatan','wKelurahan');
  clearAlamatHidden('kec','kel');

  if (!kabId) return;

  const selKab = document.getElementById('wKabupaten');
  const kabNama = selKab.options[selKab.selectedIndex]?.text || '';
  document.getElementById('hKabupaten').value   = kabNama;
  document.getElementById('hKabupatenId').value = kabId;

  // Sync ke dropdown ongkir RajaOngkir
  syncKabupatenOngkir(kabId, kabNama);

  const selKec = document.getElementById('wKecamatan');
  selKec.innerHTML = '<option value="">Memuat kecamatan...</option>';

  try {
    const data = await wFetch('kecamatan', kabId);
    wPopulate(selKec, data, '— Pilih Kecamatan —');
    if (restore && selKec.dataset.value) {
      selKec.value = selKec.dataset.value;
      await wilayahOnKecamatan(selKec.dataset.value, true);
    }
  } catch(e) {
    selKec.innerHTML = '<option value="">Gagal memuat</option>';
  }
}

async function wilayahOnKecamatan(kecId, restore = false) {
  wReset('wKelurahan');
  clearAlamatHidden('kel');

  if (!kecId) return;

  const selKec = document.getElementById('wKecamatan');
  const kecNama = selKec.options[selKec.selectedIndex]?.text || '';
  document.getElementById('hKecamatan').value   = kecNama;
  document.getElementById('hKecamatanId').value = kecId;

  const selKel = document.getElementById('wKelurahan');
  selKel.innerHTML = '<option value="">Memuat kelurahan...</option>';

  try {
    const data = await wFetch('kelurahan', kecId);
    wPopulate(selKel, data, '— Pilih Kelurahan/Desa —');
    if (restore && selKel.dataset.value) {
      selKel.value = selKel.dataset.value;
      wilayahOnKelurahan(selKel.dataset.value);
    }
  } catch(e) {
    selKel.innerHTML = '<option value="">Gagal memuat</option>';
  }
}

function wilayahOnKelurahan(kelId) {
  if (!kelId) return;
  const selKel = document.getElementById('wKelurahan');
  const kelNama = selKel.options[selKel.selectedIndex]?.text || '';
  document.getElementById('hKelurahan').value   = kelNama;
  document.getElementById('hKelurahanId').value = kelId;
}

function clearAlamatHidden(...parts) {
  const map = {
    kab: ['hKabupaten','hKabupatenId'],
    kec: ['hKecamatan','hKecamatanId'],
    kel: ['hKelurahan','hKelurahanId'],
  };
  parts.forEach(p => {
    (map[p] || []).forEach(id => {
      const el = document.getElementById(id);
      if (el) el.value = '';
    });
  });
}

// ── Sync dengan dropdown RajaOngkir ──────────────────────────
// Setelah pilih kabupaten wilayah, otomatis pilih di dropdown ongkir
function syncProvinsiOngkir(provNama) {
  const selProvOngkir = document.getElementById('iProvinsi');
  if (!selProvOngkir) return;
  Array.from(selProvOngkir.options).forEach(opt => {
    if (opt.text.toLowerCase() === provNama.toLowerCase()) {
      selProvOngkir.value = opt.value;
      muatKota(opt.value); // trigger load kota ongkir
    }
  });
}

function syncKabupatenOngkir(kabId, kabNama) {
  // Tunggu kota ongkir selesai load lalu pilih yang cocok
  const trySync = (attempt = 0) => {
    const selKotaOngkir = document.getElementById('iKota');
    if (!selKotaOngkir || selKotaOngkir.disabled) {
      if (attempt < 20) setTimeout(() => trySync(attempt + 1), 300);
      return;
    }
    const kabClean = kabNama.replace(/^(Kabupaten|Kota|Kab\.)\s*/i, '').toLowerCase();
    Array.from(selKotaOngkir.options).forEach(opt => {
      const optClean = opt.text.replace(/^(Kabupaten|Kota|Kab\.)\s*/i, '').toLowerCase();
      if (optClean.includes(kabClean) || kabClean.includes(optClean)) {
        selKotaOngkir.value = opt.value;
        // Update hKotaId jika ada
        const hKotaId = document.getElementById('hKotaId');
        const hKotaNama = document.getElementById('hKotaNama');
        if (hKotaId) hKotaId.value = opt.value;
        if (hKotaNama) hKotaNama.value = opt.dataset?.nama || opt.text;
        // Enable tombol cek ongkir
        const btnCek = document.getElementById('btnCekOngkir');
        if (btnCek) btnCek.disabled = false;
      }
    });
  };
  trySync();
}

document.addEventListener('DOMContentLoaded', wilayahInit);