<?php

namespace App\Http\Controllers;

use App\Models\Kampus;
use App\Models\Prodi;
use App\Models\Mahasiswa;
use App\Models\Rap;
use App\Models\User;
use App\Models\FeeTracking;
use App\Helpers\TahunAjaranHelper;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class MahasiswaController extends Controller
{
    // LIST MAHASISWA
    public function index(Request $request)
    {
        $user = Auth::user();
        $roleName = $user->role->name;

        $query = Mahasiswa::with(['kampus', 'prodi', 'angsuran', 'rap'])
            ->where('validasi_status', 'valid');

        // RESTRIKSI UNTUK MARKETING: hanya lihat mahasiswa dari kampusnya sendiri
        if ($roleName == 'marketing') {
            $query->where('kampus_id', $user->kampus_id);
        }

        // Filter berdasarkan kampus (hanya untuk role yang bukan marketing)
        if ($request->kampus_id && $roleName != 'marketing') {
            $query->where('kampus_id', $request->kampus_id);
        }

        // Filter berdasarkan prodi
        if ($request->prodi_id) {
            $query->where('prodi_id', $request->prodi_id);
        }

        // Filter berdasarkan angkatan
        if ($request->angkatan) {
            $query->where('angkatan', $request->angkatan);
        }

        // Filter berdasarkan status rencana
        if ($request->status_rencana) {
            if ($request->status_rencana === 'belum_ada') {
                $query->doesntHave('angsuran');
            } else {
                $query->whereHas('angsuran', function ($q) use ($request) {
                    $q->where('status_rencana', $request->status_rencana);
                });
            }
        }

        // Filter pencarian
        if ($request->search) {
            $query->where(function ($q) use ($request) {
                $q->where('nim', 'like', '%' . $request->search . '%')
                    ->orWhere('nama', 'like', '%' . $request->search . '%')
                    ->orWhere('nik', 'like', '%' . $request->search . '%')
                    ->orWhere('no_wa', 'like', '%' . $request->search . '%')
                    ->orWhereHas('prodi', function ($prodiQuery) use ($request) {
                        $prodiQuery->where('nama', 'like', '%' . $request->search . '%');
                    })
                    ->orWhereHas('kampus', function ($kampusQuery) use ($request) {
                        $kampusQuery->where('nama', 'like', '%' . $request->search . '%');
                    });
            });
        }

        $mahasiswas = $query->latest()->paginate(10);

        // Data untuk filter
        if ($roleName == 'marketing') {
            // Marketing: hanya kampus sendiri
            $kampus = Kampus::where('id', $user->kampus_id)->get();
            // Prodi dari kampus marketing (tanpa filter request prodi_id untuk list)
            $prodi = Prodi::where('kampus_id', $user->kampus_id)->get();
        } else {
            // Admin: semua kampus
            $kampus = Kampus::all();

            // Prodi: jika ada filter kampus, tampilkan prodi dari kampus tersebut,否则 semua prodi
            if ($request->kampus_id) {
                $prodi = Prodi::where('kampus_id', $request->kampus_id)->get();
            } else {
                $prodi = Prodi::all();
            }
        }

        // Get unique angkatan years for filter
        $angkatanList = Mahasiswa::select('angkatan')
            ->distinct()
            ->orderBy('angkatan', 'desc')
            ->pluck('angkatan');

        return view('mahasiswa.index', compact('mahasiswas', 'kampus', 'prodi', 'angkatanList'));
    }

    // FORM PENDAFTARAN
    public function create()
    {
        $user = Auth::user();
        $roleName = $user->role->name;

        // Jika marketing, hanya tampilkan kampusnya sendiri
        if ($roleName == 'marketing') {
            $kampus = Kampus::where('id', $user->kampus_id)->get();
            $prodi = Prodi::where('kampus_id', $user->kampus_id)->get();
        } else {
            $kampus = Kampus::all();
            $prodi = Prodi::all();
        }

        $tahunAjaran = TahunAjaranHelper::getTahunAjaran();

        // Ambil daftar RAP yang AKTIF dan SUDAH DIVALIDASI
        $rapList = Rap::where('status', 'aktif')
            ->where('validasi_status', 'valid')
            ->orderBy('nama')
            ->get();

        // Ambil daftar user marketing untuk pilihan (hanya untuk telemarketing)
        $marketingList = User::whereHas('role', function ($q) {
            $q->where('name', 'marketing');
        })->orderBy('name')->get();

        return view('mahasiswa.create', compact('kampus', 'prodi', 'tahunAjaran', 'rapList', 'marketingList'));
    }

    // SIMPAN PENDAFTARAN
    public function store(Request $request)
    {
        $validated = $request->validate([
            // Data Akademik (Wajib)
            'nim' => 'required|unique:mahasiswa,nim',
            'nama' => 'required',
            'kampus_id' => 'required|exists:kampus,id',
            'prodi_id' => 'required|exists:prodi,id',
            'marketing_id' => 'nullable|exists:users,id',
            'angkatan' => 'required',
            'kelompok' => 'required|in:SMA,D3,S1',
            'status_masuk' => 'required|in:Baru,Pindahan',
            'tahun_ajaran' => 'required',
            'waktu_kuliah' => 'required|in:Reguler Pagi,Reguler Malam/Sore,Kelas Weekend,E-learning/Online',

            // Data Pribadi (Wajib)
            'tempat_lahir' => 'required',
            'tanggal_lahir' => 'required|date',
            'agama' => 'required|in:Islam,Kristen,Katolik,Hindu,Buddha,Konghucu',
            'jenis_kelamin' => 'required|in:Laki-laki,Perempuan',
            'nik' => 'required|unique:mahasiswa,nik',
            'alamat' => 'required',

            // Data Kontak (Wajib)
            'no_wa' => 'required',
            'no_darurat' => 'required',
            'email' => 'required|email',

            // Data Orang Tua (Wajib)
            'nama_ayah' => 'required',
            'nama_ibu' => 'required',

            // Informasi Tambahan (Wajib)
            'ukuran_jaket' => 'required|in:S,M,L,XL,XXL,XXXL',
            'sumber_informasi' => 'required|in:Facebook,Instagram,Tiktok,Teman/Keluarga,Brosur,Google,RAP (Recruitment Affiliate Program),BDC,Datang Langsung,Subdomain',
            'rap_id' => 'nullable|exists:rap,id',
        ]);

        // 🔧 PERBAIKAN: Jika sumber informasi BUKAN RAP, set rap_id = null
        if ($request->sumber_informasi !== 'RAP (Recruitment Affiliate Program)') {
            $validated['rap_id'] = null;
        } else {
            // Jika sumber informasi RAP, pastikan rap_id diisi
            if (empty($request->rap_id)) {
                return back()->withErrors(['rap_id' => 'Pilih nama RAP untuk sumber informasi RAP.'])->withInput();
            }

            // Validasi tambahan: pastikan RAP yang dipilih sudah divalidasi
            $rap = Rap::find($request->rap_id);
            if (!$rap || $rap->validasi_status !== 'valid') {
                return back()->withErrors(['rap_id' => 'RAP yang dipilih harus sudah divalidasi terlebih dahulu.'])->withInput();
            }
        }

        $mahasiswa = Mahasiswa::create($validated);

        // Fee tracking dengan parameter marketing_id
        $this->createFeeTracking($mahasiswa, Auth::user(), $request->marketing_id);

        // Update total mahasiswa untuk RAP
        if ($mahasiswa->sumber_informasi === 'RAP (Recruitment Affiliate Program)' && $mahasiswa->rap_id) {
            $this->updateRapTotalMahasiswa($mahasiswa->rap_id);
        }

        return redirect()->route('mahasiswa.index')
            ->with('success', 'Mahasiswa berhasil didaftarkan!');
    }

    // DETAIL
    public function show($id)
    {
        $m = Mahasiswa::with(['kampus', 'prodi', 'rap'])->findOrFail($id);
        return view('mahasiswa.show', compact('m'));
    }

    // FORM EDIT
    public function edit($id)
    {
        $user = Auth::user();
        $roleName = $user->role->name;

        $m = Mahasiswa::findOrFail($id);

        // Jika marketing, hanya bisa edit mahasiswa dari kampusnya sendiri
        if ($roleName == 'marketing' && $m->kampus_id != $user->kampus_id) {
            abort(403, 'Anda tidak memiliki akses untuk mengedit mahasiswa dari kampus lain.');
        }

        // Data kampus berdasarkan role
        if ($roleName == 'marketing') {
            $kampus = Kampus::where('id', $user->kampus_id)->get();
        } else {
            $kampus = Kampus::all();
        }

        // 🔧 PERBAIKAN: Ambil prodi hanya dari kampus mahasiswa yang sedang diedit
        // Agar tidak menampilkan semua prodi dari semua kampus
        if ($roleName == 'marketing') {
            $prodi = Prodi::where('kampus_id', $user->kampus_id)
                ->with('kampus')
                ->orderBy('jenjang')
                ->orderBy('nama')
                ->get();
        } else {
            // 🔧 HANYA ambil prodi dari kampus mahasiswa yang sedang diedit
            $prodi = Prodi::where('kampus_id', $m->kampus_id)
                ->with('kampus')
                ->orderBy('jenjang')
                ->orderBy('nama')
                ->get();
        }

        $tahunAjaran = TahunAjaranHelper::getTahunAjaran();

        // Ambil daftar RAP yang AKTIF dan SUDAH DIVALIDASI
        $rapList = Rap::where('status', 'aktif')
            ->where('validasi_status', 'valid')
            ->orderBy('nama')
            ->get();

        // Ambil daftar user marketing untuk pilihan
        $marketingList = User::whereHas('role', function ($q) {
            $q->where('name', 'marketing');
        })->orderBy('name')->get();

        // Cari marketing_id dari fee tracking yang sudah ada (role marketing)
        $existingFeeMarketing = FeeTracking::where('mahasiswa_id', $id)
            ->where('role', 'marketing')
            ->first();

        $selectedMarketingId = $existingFeeMarketing ? $existingFeeMarketing->user_id : null;

        return view('mahasiswa.edit', compact('m', 'kampus', 'prodi', 'tahunAjaran', 'rapList', 'marketingList', 'selectedMarketingId'));
    }

    // UPDATE DATA
    public function update(Request $request, $id)
    {
        $m = Mahasiswa::findOrFail($id);

        $oldRapId = $m->rap_id;
        $oldSumberInformasi = $m->sumber_informasi;

        $validated = $request->validate([
            // Data Akademik (Wajib)
            'nim' => 'required|unique:mahasiswa,nim,' . $id,
            'nama' => 'required',
            'kampus_id' => 'required|exists:kampus,id',
            'prodi_id' => 'required|exists:prodi,id',
            'marketing_id' => 'nullable|exists:users,id',
            'angkatan' => 'required',
            'kelompok' => 'required|in:SMA,D3,S1',
            'status_masuk' => 'required|in:Baru,Pindahan',
            'tahun_ajaran' => 'required',
            'waktu_kuliah' => 'required|in:Reguler Pagi,Reguler Malam/Sore,Kelas Weekend,E-learning/Online',

            // Data Pribadi (Wajib)
            'tempat_lahir' => 'required',
            'tanggal_lahir' => 'required|date',
            'agama' => 'required|in:Islam,Kristen,Katolik,Hindu,Buddha,Konghucu',
            'jenis_kelamin' => 'required|in:Laki-laki,Perempuan',
            'nik' => 'required|unique:mahasiswa,nik,' . $id,
            'alamat' => 'required',

            // Data Kontak (Wajib)
            'no_wa' => 'required',
            'no_darurat' => 'required',
            'email' => 'required|email',

            // Data Orang Tua (Wajib)
            'nama_ayah' => 'required',
            'nama_ibu' => 'required',

            // Informasi Tambahan (Wajib)
            'ukuran_jaket' => 'required|in:S,M,L,XL,XXL,XXXL',
            'sumber_informasi' => 'required|in:Facebook,Instagram,Tiktok,Teman/Keluarga,Brosur,Google,RAP (Recruitment Affiliate Program),BDC,Datang Langsung,Subdomain',
            'rap_id' => 'nullable|exists:rap,id',
        ]);

        // 🔧 PERBAIKAN: Jika sumber informasi BUKAN RAP, set rap_id = null
        if ($request->sumber_informasi !== 'RAP (Recruitment Affiliate Program)') {
            $validated['rap_id'] = null;
        } else {
            // Jika sumber informasi RAP, pastikan rap_id diisi
            if (empty($request->rap_id)) {
                return back()->withErrors(['rap_id' => 'Pilih nama RAP untuk sumber informasi RAP.'])->withInput();
            }

            // Validasi tambahan: pastikan RAP yang dipilih sudah divalidasi
            $rap = Rap::find($request->rap_id);
            if (!$rap || $rap->validasi_status !== 'valid') {
                return back()->withErrors(['rap_id' => 'RAP yang dipilih harus sudah divalidasi terlebih dahulu.'])->withInput();
            }
        }

        $m->update($validated);

        // Update fee tracking jika ada perubahan marketing
        $this->updateFeeTracking($m, Auth::user(), $request->marketing_id);

        // Update total mahasiswa untuk RAP
        // Hapus dari RAP lama jika sumber berubah ATAU rap_id berubah
        if ($oldSumberInformasi === 'RAP (Recruitment Affiliate Program)' && $oldRapId && $oldRapId != $m->rap_id) {
            $this->updateRapTotalMahasiswa($oldRapId);
        }

        // Tambah ke RAP baru
        if ($m->sumber_informasi === 'RAP (Recruitment Affiliate Program)' && $m->rap_id) {
            $this->updateRapTotalMahasiswa($m->rap_id);
        }

        return redirect()->route('mahasiswa.index')
            ->with('success', 'Data mahasiswa berhasil diperbarui!');
    }

    // HAPUS
    public function destroy($id)
    {
        $m = Mahasiswa::findOrFail($id);

        // Update total mahasiswa untuk RAP
        if ($m->sumber_informasi === 'RAP (Recruitment Affiliate Program)' && $m->rap_id) {
            $this->updateRapTotalMahasiswa($m->rap_id);
        }

        FeeTracking::where('mahasiswa_id', $id)->delete();

        $m->delete();

        return back()->with('success', 'Mahasiswa berhasil dihapus.');
    }

    // API GET PRODI BERDASARKAN KAMPUS
    public function getProdi(Kampus $kampus)
    {
        return $kampus->prodi()
            ->select('id', 'nama', 'jenjang')
            ->orderBy('jenjang')
            ->orderBy('nama')
            ->get();
    }

    /**
     * Update total mahasiswa untuk RAP
     */
    private function updateRapTotalMahasiswa($rapId)
    {
        $rap = Rap::find($rapId);
        if ($rap) {
            $totalMahasiswa = $rap->mahasiswa()->count();
            $rap->update([
                'total_mahasiswa_daftar' => $totalMahasiswa,
            ]);
        }
    }

    /**
     * Create fee tracking untuk marketing dan telemarketing (GLOBAL)
     */
    private function createFeeTracking($mahasiswa, $user, $marketingId = null)
    {
        $roleName = $user->role->name ?? '';

        if ($roleName == 'marketing') {
            // Marketing input: hanya marketing dapat fee
            $this->createSingleFeeTracking($mahasiswa, $user->id, 'marketing');

        } elseif ($roleName == 'telemarketing') {
            // Telemarketing input: telemarketing dapat fee
            $this->createSingleFeeTracking($mahasiswa, $user->id, 'telemarketing');

            // Marketing dipilih dari form atau default (ambil marketing pertama)
            if ($marketingId) {
                $marketingUser = User::find($marketingId);
            } else {
                // Jika tidak dipilih, ambil marketing pertama
                $marketingUser = User::whereHas('role', function ($q) {
                    $q->where('name', 'marketing');
                })->first();
            }

            if ($marketingUser) {
                $this->createSingleFeeTracking($mahasiswa, $marketingUser->id, 'marketing');
            }
        }
    }

    private function createSingleFeeTracking($mahasiswa, $userId, $role)
    {
        $exists = FeeTracking::where('mahasiswa_id', $mahasiswa->id)
            ->where('user_id', $userId)
            ->where('role', $role)
            ->exists();

        if ($exists) {
            return;
        }

        FeeTracking::create([
            'mahasiswa_id' => $mahasiswa->id,
            'user_id' => $userId,
            'role' => $role,
            'status' => 'pending',
        ]);
    }

    /**
     * Update fee tracking ketika data mahasiswa diubah
     */
    private function updateFeeTracking($mahasiswa, $user, $newMarketingId = null)
    {
        $roleName = $user->role->name ?? '';

        if ($roleName == 'marketing') {
            // Marketing yang edit: tidak perlu update fee tracking marketingnya
            // Karena fee marketing adalah untuk dirinya sendiri
            return;

        } elseif ($roleName == 'telemarketing') {
            // Telemarketing yang edit: bisa update marketing yang dipilih

            // Cari fee tracking marketing yang sudah ada
            $existingMarketingFee = FeeTracking::where('mahasiswa_id', $mahasiswa->id)
                ->where('role', 'marketing')
                ->first();

            if ($newMarketingId) {
                $newMarketingUser = User::find($newMarketingId);

                if ($existingMarketingFee) {
                    // Jika sudah ada fee marketing, update user_id-nya
                    if ($existingMarketingFee->user_id != $newMarketingId) {
                        $existingMarketingFee->update([
                            'user_id' => $newMarketingId,
                        ]);
                    }
                } else {
                    // Jika belum ada fee marketing, buat baru
                    if ($newMarketingUser) {
                        $this->createSingleFeeTracking($mahasiswa, $newMarketingId, 'marketing');
                    }
                }
            } else {
                // Jika tidak ada marketing dipilih, hapus fee marketing jika ada
                if ($existingMarketingFee) {
                    $existingMarketingFee->delete();
                }
            }
        }
    }

    public function getMarketingByKampus($kampusId)
    {
        $kampus = Kampus::find($kampusId);
        $kampusNama = $kampus ? $kampus->nama : '';

        $marketingList = User::whereHas('role', function ($q) {
            $q->where('name', 'marketing');
        })
            ->where('kampus_id', $kampusId)
            ->orderBy('name')
            ->get(['id', 'name']);

        return response()->json([
            'kampus_nama' => $kampusNama,
            'marketing_list' => $marketingList
        ]);
    }
}
