<?php

namespace App\Http\Controllers\AdminKampus;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Inertia\Inertia;
use App\Models\Sejarah;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Illuminate\Validation\Rule;

class HistoryController extends Controller
{
    /**
     * Mengambil campus_id dari admin yang sedang login.
     */
    private function getCampusId()
    {
        return Auth::user()->campus_id; 
    }

    /**
     * Aturan validasi yang umum digunakan untuk Sejarah.
     * @param int|null $historyId ID data Sejarah (opsional, untuk Rule::unique jika diperlukan)
     * @return array
     */
    private function validationRules($historyId = null)
    {
        return [
            'title' => 'required|string|max:255',
            'subtitle' => 'nullable|string|max:255',
            
            // Konten Utama
            // Note: Gunakan 'paragraphs.*' => 'nullable|string' untuk memungkinkan array kosong/null
            // dan 'paragraphs' => 'required|array' untuk memastikan array ada.
            'paragraphs' => 'required|array', 
            'paragraphs.*' => 'nullable|string',
            
            // Gambar dan Kutipan
            'image_file' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', // Maksimal 2MB
            'pull_quote' => 'nullable|string|max:500',
            
            // Content Details (Nested Arrays)
            'content_details' => 'nullable|array',
            'content_details.milestones' => 'nullable|array',
            'content_details.milestones.*.year' => 'nullable|string|max:4',
            'content_details.milestones.*.title' => 'required_with:content_details.milestones.*.year|nullable|string|max:255',
            'content_details.extraParagraphs' => 'nullable|array',
            'content_details.extraParagraphs.*' => 'nullable|string',
            
            // Field untuk mode Edit/Update.
            'remove_image' => 'nullable|boolean', 
        ];
    }

// --------------------------------------------------------------------------
// 1. INDEX (READ)
// --------------------------------------------------------------------------

    /**
     * Menampilkan data Sejarah Kampus yang terkait dengan admin yang login.
     * Rute: GET /admin/kampus/sejarah
     */
    public function index()
    {
        $campusId = $this->getCampusId();

        // Cari data sejarah (singleton)
        $history = Sejarah::where('campus_id', $campusId)->first();

        // Siapkan URL publik untuk gambar
        if ($history && $history->image_url) {
            $history->image_url_public = Storage::url($history->image_url);
        }

        return Inertia::render('AdminCampus/Sejarah/Index', [
            'history' => $history, // Bisa null jika belum ada sejarah
        ]);
    }

// --------------------------------------------------------------------------
// 2. CREATE (MENAMPILKAN FORM BARU)
// --------------------------------------------------------------------------
    
    /**
     * Menampilkan formulir untuk membuat Sejarah.
     * Rute: GET /admin/kampus/sejarah/create
     */
    public function create()
    {
        $campusId = $this->getCampusId();
        
        // Cek apakah data sejarah sudah ada untuk kampus ini
        $historyExists = Sejarah::where('campus_id', $campusId)->exists();
        
        if ($historyExists) {
            // Jika sudah ada, redirect ke index untuk menampilkan data yang ada.
            return redirect()
                ->route('admin.kampus.sejarah.index')
                ->with('error', '⚠️ Data Sejarah Kampus sudah ada. Silakan edit data yang sudah tersedia.');
        }

        // Render form Create yang kosong
        return Inertia::render('AdminCampus/Sejarah/Create'); // Gunakan komponen yang sama untuk Create dan Edit
    }

// --------------------------------------------------------------------------
// 3. STORE (MENYIMPAN DATA BARU)
// --------------------------------------------------------------------------

    /**
     * Menyimpan data Sejarah baru (hanya jika belum ada).
     * Rute: POST /admin/kampus/sejarah
     */
    public function store(Request $request)
    {
        $campusId = $this->getCampusId();
        
        // Cek lagi untuk mencegah duplikat
        if (Sejarah::where('campus_id', $campusId)->exists()) {
            return redirect()
                ->route('admin.kampus.sejarah.index')
                ->with('error', '❌ Gagal menyimpan. Data Sejarah Kampus sudah ada. Gunakan fungsi Edit.');
        }
        
        // 1. Validasi
        $rules = $this->validationRules();
        unset($rules['remove_image']); // Hapus rule 'remove_image' karena tidak relevan di mode create
        $validatedData = $request->validate($rules);
        
        try {
            $data = $validatedData;
            $data['campus_id'] = $campusId;
            $imagePath = null;
            
            // --- LOGIKA PENANGANAN FILE GAMBAR (HANYA SIMPAN BARU) ---
            if ($request->hasFile('image_file')) {
                // Simpan gambar baru
                $imagePath = $request->file('image_file')->store('history_images', 'public');
                Log::info("Gambar baru sejarah kampus {$campusId} disimpan: {$imagePath}.");
            }
            
            $data['image_url'] = $imagePath; 

            // Hapus field file agar tidak disimpan ke model
            unset($data['image_file']);
            // --- AKHIR LOGIKA PENANGANAN FILE GAMBAR ---
            
            // 2. Membersihkan array (Menghapus elemen kosong)
            $data['paragraphs'] = array_values(array_filter($data['paragraphs'] ?? [], fn($p) => trim($p) !== ''));
            
            $contentDetails = $data['content_details'] ?? [];
            // Filter milestones: hanya yang punya year ATAU title
            $contentDetails['milestones'] = array_values(array_filter($contentDetails['milestones'] ?? [], fn($m) => !empty($m['year']) || !empty($m['title'])));
            $contentDetails['extraParagraphs'] = array_values(array_filter($contentDetails['extraParagraphs'] ?? [], fn($p) => trim($p) !== ''));
            $data['content_details'] = $contentDetails;

            // 3. Buat data baru
            Sejarah::create($data);
            
            Log::info("Sejarah Kampus ID: {$campusId} berhasil ditambahkan.");

            // 4. Redirect ke Index dengan flash message success
            return redirect()
                ->route('admin.kampus.sejarah.index')
                ->with('success', "✅ Sejarah kampus berhasil ditambahkan.");

        } catch (\Exception $e) {
            Log::error("Gagal menyimpan Sejarah Kampus ID: {$campusId}. Error: " . $e->getMessage()); 
            
            return redirect()
                ->back()
                ->withInput()
                ->with('error', '❌ Gagal menyimpan data sejarah. Terjadi kesalahan saat memproses data.');
        }
    }

// --------------------------------------------------------------------------
// 4. EDIT (MENAMPILKAN FORM DENGAN DATA LAMA)
// --------------------------------------------------------------------------

    /**
     * Menampilkan formulir untuk mengedit data Sejarah.
     * Rute: GET /admin/kampus/sejarah/{sejarah}/edit (sejarah di sini bisa diabaikan/diganti menjadi 'edit' jika rute singleton)
     */
    public function edit()
    {
        $campusId = $this->getCampusId();
        
        // Cari data sejarah
        $history = Sejarah::where('campus_id', $campusId)->first();
        
        if (!$history) {
            // Jika data belum ada, arahkan ke halaman create
            return redirect()
                ->route('admin.kampus.sejarah.create')
                ->with('error', 'Data Sejarah Kampus belum ada. Silakan buat data baru.');
        }

        // Siapkan URL publik untuk gambar
        if ($history->image_url) {
            $history->image_url_public = Storage::url($history->image_url);
        }

        // Render form Edit dengan data yang sudah ada
        return Inertia::render('AdminCampus/Sejarah/Edit', [
            'history' => $history,
        ]);
    }

// --------------------------------------------------------------------------
// 5. UPDATE (MENYIMPAN PERUBAHAN)
// --------------------------------------------------------------------------

    /**
     * Memperbarui data Sejarah yang sudah ada.
     * Rute: PUT/PATCH /admin/kampus/sejarah/{sejarah} (sejarah di sini bisa diabaikan jika rute singleton)
     */
    public function update(Request $request)
    {
        $campusId = $this->getCampusId();
        
        // Cari data sejarah yang akan di-update
        $history = Sejarah::where('campus_id', $campusId)->first();
        
        if (!$history) {
            return redirect()
                ->route('admin.kampus.sejarah.index')
                ->with('error', 'Data Sejarah Kampus tidak ditemukan.');
        }

        // 1. Validasi
        $validatedData = $request->validate($this->validationRules($history->id));
        
        try {
            $data = $validatedData;
            $oldImagePath = $history->image_url;
            $newImagePath = null;

            // --- LOGIKA PENANGANAN FILE GAMBAR (Update) ---
            $shouldRemoveOldImage = false;

            // Kasus 1: Ada file baru
            if ($request->hasFile('image_file')) {
                // Simpan gambar baru
                $newImagePath = $request->file('image_file')->store('history_images', 'public');
                $shouldRemoveOldImage = true; // Hapus gambar lama
                Log::info("Gambar sejarah kampus {$campusId} di-update. Gambar baru: {$newImagePath}.");
            } 
            
            // Kasus 2: Gambar lama diminta dihapus
            else if (isset($data['remove_image']) && $data['remove_image']) {
                $shouldRemoveOldImage = true;
                $newImagePath = null; // Pastikan image_url di DB menjadi NULL
            } 
            
            // Kasus 3: Tidak ada file baru & tidak ada permintaan hapus, simpan path lama
            else {
                $newImagePath = $oldImagePath; 
            }

            // Hapus gambar lama dari storage jika diperlukan
            if ($shouldRemoveOldImage && $oldImagePath && Storage::disk('public')->exists($oldImagePath)) {
                Storage::disk('public')->delete($oldImagePath);
                Log::info("Gambar sejarah kampus {$campusId} lama ({$oldImagePath}) dihapus dari storage.");
            }
            
            $data['image_url'] = $newImagePath; 

            // Hapus field yang tidak ada di model
            unset($data['image_file']);
            unset($data['remove_image']);
            // --- AKHIR LOGIKA PENANGANAN FILE GAMBAR ---
            
            // 2. Membersihkan array (Menghapus elemen kosong)
            $data['paragraphs'] = array_values(array_filter($data['paragraphs'] ?? [], fn($p) => trim($p) !== ''));
            
            $contentDetails = $data['content_details'] ?? [];
            // Filter milestones
            $contentDetails['milestones'] = array_values(array_filter($contentDetails['milestones'] ?? [], fn($m) => !empty($m['year']) || !empty($m['title'])));
            $contentDetails['extraParagraphs'] = array_values(array_filter($contentDetails['extraParagraphs'] ?? [], fn($p) => trim($p) !== ''));
            $data['content_details'] = $contentDetails;

            // 3. Update data
            $history->update($data);
            
            Log::info("Sejarah Kampus ID: {$campusId} berhasil diperbarui.");

            // 4. Redirect ke Index dengan flash message success
            return redirect()
                ->route('admin.kampus.sejarah.index')
                ->with('success', "✨ Sejarah kampus berhasil diperbarui.");

        } catch (\Exception $e) {
            Log::error("Gagal memperbarui Sejarah Kampus ID: {$campusId}. Error: " . $e->getMessage()); 
            
            return redirect()
                ->back()
                ->withInput()
                ->with('error', '❌ Gagal memperbarui data sejarah. Terjadi kesalahan saat memproses data.');
        }
    }

// --------------------------------------------------------------------------
// 6. DESTROY (DELETE)
// --------------------------------------------------------------------------

    /**
     * Menghapus data Sejarah.
     * Rute: DELETE /admin/kampus/sejarah
     */
    public function destroy()
    {
        $campusId = $this->getCampusId();
        
        try {
            // Cari data sejarah yang terkait dengan kampus
            $history = Sejarah::where('campus_id', $campusId)->firstOrFail();
            
            // Hapus file gambar terkait dari storage (jika ada)
            if ($history->image_url && Storage::disk('public')->exists($history->image_url)) {
                Storage::disk('public')->delete($history->image_url);
                Log::info("File gambar sejarah kampus {$campusId} ({$history->image_url}) berhasil dihapus dari storage.");
            }
            
            // Hapus record dari database
            $history->delete();

            Log::info("Sejarah Kampus ID: {$campusId} berhasil dihapus.");

            return redirect()
                ->route('admin.kampus.sejarah.index')
                ->with('success', '🗑️ Sejarah kampus berhasil dihapus.');

        } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
             return redirect()
                ->route('admin.kampus.sejarah.index')
                ->with('error', 'Data sejarah kampus tidak ditemukan.');
        } catch (\Exception $e) {
            Log::error("Gagal menghapus Sejarah Kampus ID: {$campusId}. Error: " . $e->getMessage());

            return redirect()
                ->back()
                ->with('error', '❌ Gagal menghapus sejarah kampus. Terjadi kesalahan.');
        }
    }
}