<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\JabatanInstansi;
use App\Instansi;
use App\User;

class JabatanInstansiController extends Controller
{
    // ================= CRUD UTAMA =================

    /**
     * Menampilkan daftar jabatan instansi
     */
   public function index(Request $request)
{
    $user  = auth()->user();
    $query = JabatanInstansi::with(['user', 'instansi'])->latest();

    // Filter berdasarkan instansi user (kalau Admin Instansi)
    if ($user->isAdminInstansi()) {
        $query->where('instansi_id', $user->instansi_id);
    }

    // Filter search
    if ($request->filled('search')) {
        $search = $request->search;
        $query->where(function ($q) use ($search) {
            $q->where('jabatan', 'like', "%{$search}%")
              ->orWhere('nama_unit', 'like', "%{$search}%");
        });
    }

    // Filter instansi (Super Admin only)
    if ($request->filled('instansi') && $user->isSuperAdmin()) {
        $query->where('instansi_id', $request->instansi);
    }

    // Filter unit
    if ($request->filled('unit')) {
        $query->where('nama_unit', 'like', "%{$request->unit}%");
    }

    $data = $query->paginate(10)->withQueryString();

    // Untuk dropdown filter di view
    $instansiList = $user->isSuperAdmin()
        ? \App\Instansi::orderBy('nama_instansi')->get()
        : collect();

    $unitList = JabatanInstansi::when($user->isAdminInstansi(), function ($q) use ($user) {
            $q->where('instansi_id', $user->instansi_id);
        })
        ->whereNotNull('nama_unit')
        ->select('nama_unit')
        ->distinct()
        ->orderBy('nama_unit')
        ->get();

    return view('jabatan_instansi.index', compact('data', 'instansiList', 'unitList'));
}

    /**
     * Menampilkan form tambah jabatan instansi
     */
    public function create()
    {
        $instansi = Instansi::pluck('nama_instansi', 'id');
        $users = User::pluck('name', 'id');
        $parent = JabatanInstansi::pluck('nama_unit', 'id');

        return view('jabatan_instansi.create', compact('instansi', 'users', 'parent'));
    }

    /**
     * Menyimpan data jabatan instansi baru
     */
    public function store(Request $request)
    {
        $request->validate([
            'instansi_id' => 'required|exists:instansis,id',
            'nama_unit'   => 'required|string|max:255',
            'jabatan'     => 'required|string|max:255',
            'user_id'     => 'nullable|exists:users,id',
        ]);

        JabatanInstansi::create($request->all());

        return redirect()->route('jabatan_instansi.index')
            ->with('success', 'Data jabatan berhasil ditambah');
    }

    /**
     * Menampilkan form edit jabatan instansi
     */
    public function edit($id) {
    $jabatan = JabatanInstansi::findOrFail($id);
    $instansi = Instansi::all(); // Untuk dropdown instansi
    $users = User::all(); // Untuk dropdown pejabat
    return view('jabatan_instansi.edit', compact('jabatan', 'instansi', 'users'));
}

    /**
     * Mengupdate data jabatan instansi
     */
    public function update(Request $request, $id)
    {
        $data = JabatanInstansi::findOrFail($id);

        $request->validate([
            'instansi_id' => 'required|exists:instansis,id',
            'nama_unit'   => 'required|string|max:255',
            'jabatan'     => 'required|string|max:255',
            'user_id'     => 'nullable|exists:users,id',
        ]);

        $data->update($request->all());

        return redirect()->route('jabatan_instansi.index')
            ->with('success', 'Data jabatan berhasil diupdate');
    }

    /**
     * Menghapus data jabatan instansi
     */
    public function destroy($id)
    {
        JabatanInstansi::destroy($id);
        
        return back()->with('success', 'Data berhasil dihapus');
    }

    // ================= API ENDPOINTS =================

    /**
     * Mendapatkan semua data jabatan berdasarkan instansi
     * Endpoint: /api/jabatan-by-instansi/{id}
     */
    public function byInstansi($id)
    {
        try {
            $data = JabatanInstansi::with('user')
                ->where('instansi_id', $id)
                ->whereNotNull('user_id')
                ->get()
                ->map(function ($j) {
                    return [
                        'id'         => $j->id,
                        'nama_unit'  => $j->nama_unit ?: '-',
                        'unit'       => $j->nama_unit ?: '-',
                        'jabatan'    => $j->jabatan,
                        'posisi'     => $j->jabatan,
                        'user_name'  => $j->user ? $j->user->name : 'Belum ada pejabat',
                        'user_id'    => $j->user_id
                    ];
                });

            return response()->json($data);
            
        } catch (\Exception $e) {
            return response()->json([
                'error' => 'Gagal mengambil data: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * Mendapatkan daftar jabatan UNIK berdasarkan instansi
     * Endpoint: /api/jabatan-unik/{instansiId}
     */
    public function getJabatanByInstansi($instansiId)
    {
        try {
            $jabatan = JabatanInstansi::where('instansi_id', $instansiId)
                ->whereNotNull('user_id')
                ->select('jabatan')
                ->distinct()
                ->pluck('jabatan');

            return response()->json($jabatan);
            
        } catch (\Exception $e) {
            return response()->json([
                'error' => 'Gagal mengambil data jabatan: ' . $e->getMessage()
            ], 500);
        }
    }

    /**
     * Mendapatkan daftar penanggung jawab berdasarkan instansi dan jabatan
     * Endpoint: /api/penanggungjawab/{instansiId}/{jabatan}
     */
    public function getPenanggungJawabByJabatan($instansiId, $jabatan)
{
    try {
        $data = JabatanInstansi::with('user')
            ->where('instansi_id', $instansiId)
            ->where('jabatan', $jabatan)
            ->whereNotNull('user_id')
            ->get()
            ->map(function ($j) {
                return [
                    'id'         => $j->id,
                    'user_name'  => $j->user ? $j->user->name : 'Belum ada pejabat',
                    'user_email' => $j->user ? $j->user->email : '',
                ];
            });

        return response()->json($data);
        
    } catch (\Exception $e) {
        return response()->json(['error' => $e->getMessage()], 500);
    }
}
}