<template>
  <section class="container-page py-10">
    <div class="mb-8">
      <h1 class="text-3xl font-extrabold">Jual Barang</h1>
      <p class="mt-2 text-slate-600">
        Posting barang ke marketplace dengan beberapa foto asli dari
        perangkatmu.
      </p>
    </div>

    <div class="grid gap-8 lg:grid-cols-[1fr_360px]">
      <form class="card grid gap-5 p-6" @submit.prevent="submitProduct">
        <p
          v-if="errorMessage"
          class="rounded-xl bg-red-50 px-4 py-3 text-sm font-semibold text-red-700"
        >
          {{ errorMessage }}
        </p>

        <div>
          <label class="label">Nama Barang</label>
          <input
            v-model="form.title"
            class="input mt-2"
            placeholder="Contoh: Laptop ThinkPad T480"
            required
          />
        </div>

        <div class="grid gap-5 sm:grid-cols-2">
          <div>
            <label class="label">Kategori</label>
            <select v-model="form.category" class="input mt-2" required>
              <option v-for="cat in realCategories" :key="cat" :value="cat">
                {{ cat }}
              </option>
            </select>
          </div>
          <div>
            <label class="label">Harga</label>
            <input
              v-model.number="form.price"
              type="number"
              class="input mt-2"
              placeholder="2500000"
              required
            />
          </div>
        </div>

        <div class="grid gap-5 sm:grid-cols-2">
          <div>
            <label class="label">Kondisi</label>
            <select v-model="form.condition" class="input mt-2">
              <option>Bekas Normal</option>
              <option>Bekas Mulus</option>
              <option>Bekas Minus</option>
              <option>Bekas Server Room</option>
            </select>
          </div>
          <div>
            <label class="label">Lokasi</label>
            <input
              v-model="form.location"
              class="input mt-2"
              placeholder="Yogyakarta"
              required
            />
          </div>
        </div>

        <div class="grid gap-5 sm:grid-cols-2">
          <div>
            <label class="label">Nama Penjual</label>
            <input
              v-model="form.seller"
              class="input mt-2"
              placeholder="Nama kamu"
              required
            />
          </div>
          <div>
            <label class="label">Nomor WhatsApp +62</label>
            <input
              v-model="form.whatsapp"
              class="input mt-2"
              placeholder="+6281234567890"
              required
            />
          </div>
        </div>

        <div>
          <label class="label">Foto Barang</label>
          <input
            ref="fileInput"
            type="file"
            accept="image/*"
            multiple
            class="input mt-2"
            @change="handleImageChange"
          />

          <div
            v-if="selectedImages.length"
            class="mt-3 flex items-center justify-between gap-3 rounded-xl bg-brand-50 px-4 py-3 text-sm font-bold text-brand-700"
          >
            <span>{{ selectedImages.length }} foto dipilih</span>
            <button type="button" class="text-red-700" @click="clearImages">
              Hapus semua
            </button>
          </div>

          <div
            v-if="previewUrls.length"
            class="mt-4 grid grid-cols-2 gap-3 sm:grid-cols-3"
          >
            <div
              v-for="(preview, index) in previewUrls"
              :key="preview.url"
              class="overflow-hidden rounded-xl border border-slate-200"
            >
              <img
                :src="preview.url"
                :alt="`Preview foto barang ${index + 1}`"
                class="aspect-[4/3] w-full object-cover"
              />
              <button
                type="button"
                class="w-full bg-red-50 px-3 py-2 text-xs font-bold text-red-700"
                @click="removeImage(index)"
              >
                Hapus foto
              </button>
            </div>
          </div>

          <p class="mt-2 text-xs text-slate-500">
            Maksimal 6 foto, 10 MB per foto. Kamu boleh pilih beberapa sekaligus
            atau tambah satu per satu.
          </p>
        </div>

        <div>
          <label class="label">Deskripsi</label>
          <textarea
            v-model="form.description"
            class="input mt-2 min-h-32"
            placeholder="Jelaskan kondisi barang..."
            required
          ></textarea>
        </div>

        <button class="btn-primary w-full" :disabled="loading">
          {{ loading ? 'Memposting...' : 'Posting Barang' }}
        </button>
      </form>

      <div class="card h-fit p-6">
        <h2 class="text-lg font-extrabold">Tips Isi Produk</h2>
        <ul class="mt-4 grid gap-3 text-sm leading-6 text-slate-600">
          <li>
            - Pakai judul yang jelas, misal "MikroTik RB941 Bekas Normal".
          </li>
          <li>- Jelaskan minus barang kalau ada.</li>
          <li>- Pakai nomor WhatsApp aktif.</li>
          <li>- Upload beberapa foto dari sisi yang berbeda.</li>
        </ul>
      </div>
    </div>
  </section>
</template>

<script setup>
import { reactive, computed, ref } from 'vue';
import { useRouter } from 'vue-router';
import { categories } from '../data/products';
import { createProduct, getCurrentUser } from '../utils';

const router = useRouter();
const realCategories = computed(() =>
  categories.filter((cat) => cat !== 'Semua')
);
const fileInput = ref(null);
const MAX_IMAGES = 6;
const MAX_IMAGE_SIZE_MB = 10;
const MAX_IMAGE_SIZE = MAX_IMAGE_SIZE_MB * 1024 * 1024;

const form = reactive({
  title: '',
  category: 'Laptop',
  price: '',
  condition: 'Bekas Normal',
  location: '',
  seller: '',
  whatsapp: '',
  description: '',
});
const selectedImages = ref([]);
const previewUrls = ref([]);
const loading = ref(false);
const errorMessage = ref('');

const currentUser = getCurrentUser();
if (currentUser) {
  form.seller = currentUser.name || '';
  form.whatsapp = currentUser.whatsapp || '';
}

function imageKey(file) {
  return `${file.name}-${file.size}-${file.lastModified}`;
}

function rebuildPreviews() {
  previewUrls.value.forEach((preview) => URL.revokeObjectURL(preview.url));
  previewUrls.value = selectedImages.value.map((file) => ({
    key: imageKey(file),
    url: URL.createObjectURL(file),
  }));
}

function handleImageChange(event) {
  const incomingFiles = Array.from(event.target.files || []);
  const oversizedFile = incomingFiles.find(
    (file) => file.size > MAX_IMAGE_SIZE
  );

  if (oversizedFile) {
    errorMessage.value = `Foto "${oversizedFile.name}" lebih dari ${MAX_IMAGE_SIZE_MB} MB. Pilih foto yang lebih kecil.`;
    event.target.value = '';
    return;
  }

  const merged = [...selectedImages.value];
  incomingFiles.forEach((file) => {
    if (
      !merged.some((item) => imageKey(item) === imageKey(file)) &&
      merged.length < MAX_IMAGES
    ) {
      merged.push(file);
    }
  });

  selectedImages.value = merged;
  rebuildPreviews();
  errorMessage.value = '';
  event.target.value = '';
}

function removeImage(index) {
  selectedImages.value = selectedImages.value.filter(
    (_, itemIndex) => itemIndex !== index
  );
  rebuildPreviews();
}

function clearImages() {
  selectedImages.value = [];
  rebuildPreviews();
  if (fileInput.value) fileInput.value.value = '';
}

async function submitProduct() {
  if (!selectedImages.value.length) {
    errorMessage.value = 'Minimal 1 foto barang wajib diupload.';
    return;
  }

  loading.value = true;
  errorMessage.value = '';

  const payload = new FormData();
  Object.entries(form).forEach(([key, value]) => {
    payload.append(key, value);
  });
  selectedImages.value.forEach((image) => {
    payload.append('images', image);
  });

  try {
    await createProduct(payload);
    router.push('/dashboard');
  } catch (error) {
    errorMessage.value = error.message;
  } finally {
    loading.value = false;
  }
}
</script>
