@section('title', 'Import Tugas Akhir — ' . config('app.name'))
@section('header_title', 'Import Tugas Akhir')
@section('header_subtitle', 'Import data tugas akhir mahasiswa secara massal dari file Excel')
@section('header_icon', 'upload')

@section('nav')
    @include('admin.partials.nav')
@endsection

@section('breadcrumb')
    @include('admin.partials.breadcrumb', ['items' => [
        ['label' => 'Akademik'],
        ['label' => 'Tugas Akhir', 'route' => route('admin.akademik.tugas-akhir')],
        ['label' => 'Import'],
    ]])
@endsection

@section('page_actions')
    <a
        href="{{ route('admin.akademik.tugas-akhir') }}"
        class="inline-flex items-center gap-2 rounded-lg bg-white px-4 py-2 text-sm font-medium text-neutral-700 shadow-border transition hover:bg-neutral-50"
    >
        <i data-lucide="arrow-left" class="h-4 w-4" aria-hidden="true"></i>
        Kembali
    </a>
    <a
        href="{{ route('admin.akademik.tugas-akhir.template') }}"
        class="inline-flex items-center gap-2 rounded-lg bg-white px-4 py-2 text-sm font-medium text-neutral-700 shadow-border transition hover:bg-neutral-50"
    >
        <i data-lucide="download" class="h-4 w-4" aria-hidden="true"></i>
        Download Template
    </a>
@endsection

<div>
    <div class="mb-6 rounded-2xl bg-white p-6 shadow-border">
        <h2 class="mb-2 text-sm font-semibold text-neutral-900">Cara import</h2>
        <ol class="list-inside list-decimal space-y-1 text-sm text-neutral-600">
            <li>Download template Excel lewat tombol "Download Template" di atas.</li>
            <li>Isi data mengikuti kolom pada baris pertama template — kolom bertanda <span class="font-semibold">*</span> wajib diisi.</li>
            <li>NIM harus sudah terdaftar sebagai mahasiswa, dan Kode Semester harus sudah ada di sistem.</li>
            <li>Satu mahasiswa hanya boleh punya satu data tugas akhir per semester. Kalau baris di Excel cocok dengan data yang sudah ada (NIM + Kode Semester sama), data itu akan <span class="font-semibold">diperbarui</span>, bukan dibuat baru atau dilewati.</li>
            <li>Saat memperbarui data yang sudah ada: Judul tetap wajib diisi, tapi kolom opsional (Status, Judul (English), Topik, Topik (English), Deskripsi, Is Proposal, File) yang dikosongkan akan <span class="font-semibold">mempertahankan nilai lama</span> — bukan menghapusnya. Isi kolom itu hanya kalau memang ingin mengubah nilainya.</li>
            <li>Import ini untuk mengisi data historis/hasil migrasi, jadi <span class="font-semibold">tidak</span> mensyaratkan KRS Tugas Akhir yang disetujui seperti pengajuan mandiri mahasiswa.</li>
            <li>Status opsional (default "submitted" untuk data baru kalau kosong) — nilai yang diterima: draft, submitted, approved, rejected, returned.</li>
            <li>Judul (English), Topik, Topik (English), dan Deskripsi semuanya opsional. Is Proposal opsional (true/false, default true untuk data baru kalau kosong).</li>
            <li>Kode Dosen Pembimbing dan Kode Dosen Penguji opsional — isi dengan kode dosen yang sudah ada di sistem, pisahkan dengan koma kalau lebih dari satu (mis. <span class="font-mono">DSN001, DSN002</span>). Kalau salah satu kode tidak ditemukan, seluruh baris tugas akhir itu gagal diimport, bukan cuma pembimbingnya. Kalau kolom ini dikosongkan pada data yang sudah ada, pembimbing/penguji yang sudah tercatat tidak diubah; kalau diisi, daftarnya menggantikan (sinkron) daftar yang lama.</li>
            <li>Kolom File opsional dan <span class="font-semibold">bukan</span> upload berkas — isi dengan path relatif berkas di storage server (mis. <span class="font-mono">tugas-akhir/nama_file.pdf</span>). Path disimpan apa adanya tanpa dicek ke storage, jadi berkasnya boleh menyusul diunggah belakangan.</li>
            <li>Kolom Kode Semester Ujian Sidang opsional — isi kalau baris ini juga ingin sekaligus membuat/memperbarui data ujian sidang untuk tugas akhir tersebut. Kosongkan kalau baris ini hanya untuk data tugas akhir saja (data ujian sidang tidak disentuh sama sekali).</li>
            <li>Kalau Kode Semester Ujian Sidang diisi: Tanggal Ujian Mulai, Tanggal Ujian Selesai, dan Status Ujian Sidang (default "draft" untuk data baru) semuanya opsional — pada data ujian sidang yang sudah ada, kolom yang dikosongkan juga mempertahankan nilai lama, sama seperti aturan data tugas akhir di atas.</li>
            <li>Kode Dosen Penguji Sidang opsional — isi dengan kode dosen, pisahkan koma kalau lebih dari satu. <span class="font-semibold">Kalau penguji sidang belum ditentukan, cukup kosongkan kolom ini</span> — ujian sidang tetap terimport tanpa penguji, bukan error. Kalau diisi tapi salah satu kode tidak ditemukan, seluruh baris (termasuk data tugas akhirnya) gagal diimport. Kode yang <span class="font-semibold">duplikat</span> dalam satu kolom juga dianggap error (tidak disaring diam-diam, beda dari Kode Dosen Pembimbing/Penguji tugas akhir).</li>
            <li>Nilai dan Catatan Penguji Sidang opsional, ditulis sebagai daftar yang <span class="font-semibold">sejajar urutan</span> dengan Kode Dosen Penguji Sidang — item pertama berlaku untuk dosen pertama, dst. Nilai dipisah koma (mis. <span class="font-mono">85, 78</span>, angka 0–999.99), Catatan dipisah karakter <span class="font-mono">|</span> (mis. <span class="font-mono">Baik|Perlu revisi</span>) — <span class="font-semibold">bukan koma</span>, supaya teks catatan boleh mengandung koma. Kosongkan slot suatu dosen kalau dia belum dinilai/dicatat (mis. <span class="font-mono">85, , 90</span>).</li>
            <li>Kode Dosen Ketua Sidang opsional — satu kode saja, harus salah satu dari Kode Dosen Penguji Sidang di baris yang sama; dosen itu ditandai sebagai ketua penguji, dosen penguji lain otomatis ditandai bukan ketua.</li>
            <li>Nilai, Catatan, dan Kode Dosen Ketua Sidang mengikuti aturan <span class="font-semibold">mempertahankan nilai lama per dosen</span> saat memperbarui data yang sudah ada: slot yang dikosongkan tidak mengubah nilai/catatan dosen itu, dan kolom Kode Dosen Ketua Sidang yang dikosongkan tidak mengubah status ketua siapa pun.</li>
            <li>Kolom yang dikosongkan pada Kode Dosen Penguji Sidang (baris sudah ada) tidak mengubah penguji yang sudah tercatat; kalau diisi, daftarnya disinkronkan (dosen lama yang tidak ada di daftar baru dihapus).</li>
            <li>Upload file (.xlsx atau .xls, maks 10MB) lalu klik "Proses Import".</li>
        </ol>
    </div>

    <div class="rounded-2xl bg-white p-6 shadow-border">
        <form wire:submit="import" class="space-y-4">
            <div>
                <label class="mb-1.5 block text-sm font-medium text-neutral-700">File Excel</label>
                <input
                    type="file"
                    wire:model="file"
                    accept=".xlsx,.xls"
                    class="w-full rounded-lg px-3 py-2.5 text-sm outline-none focus:border-neutral-900 focus:ring-2 focus:ring-neutral-900/10 @error('file') ring-2 ring-red-500 @enderror shadow-border"
                />
                @error('file') <p class="mt-1.5 text-sm text-red-600">{{ $message }}</p> @enderror
                <div wire:loading wire:target="file" class="mt-1.5 text-sm text-neutral-500">Mengunggah file...</div>
            </div>

            <div class="flex items-center gap-3">
                <button
                    type="submit"
                    wire:loading.attr="disabled"
                    wire:target="import"
                    class="inline-flex items-center gap-2 rounded-lg bg-neutral-900 px-4 py-2.5 text-sm font-medium text-white shadow-sm transition hover:bg-neutral-800 disabled:cursor-not-allowed disabled:opacity-60"
                >
                    <i data-lucide="upload" class="h-4 w-4" aria-hidden="true"></i>
                    <span wire:loading.remove wire:target="import">Proses Import</span>
                    <span wire:loading wire:target="import">Memproses...</span>
                </button>
            </div>
        </form>
    </div>

    @if ($result)
        <div class="mt-6 rounded-2xl bg-white p-6 shadow-border">
            <h2 class="mb-4 text-sm font-semibold text-neutral-900">Hasil Import</h2>

            <div class="mb-4 grid grid-cols-1 gap-4 sm:grid-cols-3">
                <div class="rounded-lg bg-emerald-50 px-4 py-3">
                    <p class="text-xs font-semibold uppercase text-emerald-700">Tugas Akhir Berhasil (Baru)</p>
                    <p class="mt-1 text-2xl font-semibold text-emerald-700">{{ $result['success_count'] }}</p>
                </div>
                <div class="rounded-lg bg-sky-50 px-4 py-3">
                    <p class="text-xs font-semibold uppercase text-sky-700">Tugas Akhir Diperbarui</p>
                    <p class="mt-1 text-2xl font-semibold text-sky-700">{{ $result['updated_count'] }}</p>
                </div>
                <div class="rounded-lg bg-amber-50 px-4 py-3">
                    <p class="text-xs font-semibold uppercase text-amber-700">Error</p>
                    <p class="mt-1 text-2xl font-semibold text-amber-700">{{ count($result['errors']) }}</p>
                </div>
                <div class="rounded-lg bg-violet-50 px-4 py-3">
                    <p class="text-xs font-semibold uppercase text-violet-700">Ujian Sidang Berhasil (Baru)</p>
                    <p class="mt-1 text-2xl font-semibold text-violet-700">{{ $result['ujian_sidang_success_count'] }}</p>
                </div>
                <div class="rounded-lg bg-indigo-50 px-4 py-3">
                    <p class="text-xs font-semibold uppercase text-indigo-700">Ujian Sidang Diperbarui</p>
                    <p class="mt-1 text-2xl font-semibold text-indigo-700">{{ $result['ujian_sidang_updated_count'] }}</p>
                </div>
            </div>

            @if ($result['errors'] !== [])
                <div
                    class="rounded-lg border border-amber-100 bg-amber-50 px-4 py-3 text-sm text-amber-800"
                    x-data="{
                        copied: false,
                        copyLog() {
                            const text = @js(implode(PHP_EOL, $result['errors']));
                            const done = () => { this.copied = true; setTimeout(() => this.copied = false, 2000); };
                            if (navigator.clipboard && window.isSecureContext) {
                                navigator.clipboard.writeText(text).then(done);
                                return;
                            }
                            const el = document.createElement('textarea');
                            el.value = text;
                            el.style.position = 'fixed';
                            el.style.opacity = '0';
                            document.body.appendChild(el);
                            el.select();
                            document.execCommand('copy');
                            document.body.removeChild(el);
                            done();
                        },
                    }"
                >
                    <div class="flex items-center justify-between gap-3">
                        <p class="font-semibold">Peringatan ({{ count($result['errors']) }} baris):</p>
                        <button
                            type="button"
                            @click="copyLog()"
                            class="inline-flex shrink-0 items-center gap-1.5 rounded-lg border border-amber-200 bg-white px-2.5 py-1 text-xs font-medium text-amber-800 transition hover:bg-amber-100"
                        >
                            <i data-lucide="clipboard-copy" class="h-3.5 w-3.5" aria-hidden="true"></i>
                            <span x-text="copied ? 'Tersalin!' : 'Salin Log'"></span>
                        </button>
                    </div>
                    <ul class="mt-2 max-h-80 list-inside list-disc space-y-0.5 overflow-y-auto">
                        @foreach ($result['errors'] as $err)
                            <li>{{ $err }}</li>
                        @endforeach
                    </ul>
                </div>
            @endif
        </div>
    @endif
</div>
