<?php

namespace App\Http\Controllers;

use App\Models\Pengajar;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class ManajemenTenagaPendidikController extends Controller
{
    public function index()
    {
        $pengajars = Pengajar::ordered()->with('jurusan')->get();
        $jurusans = \App\Models\Jurusan::ordered()->get();
        return view('admin.tenaga-pendidik.index', compact('pengajars', 'jurusans'));
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'nama_pengajar' => 'required|string|max:255',
            'nip' => 'nullable|string|max:50',
            'jurusan_id' => 'required|exists:jurusans,id',
            'jabatan' => 'required|string|max:255',
            'foto_pengajar' => 'nullable|image|mimes:jpeg,png,jpg,gif,webp|max:5120',
            'status' => 'boolean',
            'urutan' => 'nullable|integer|min:0',
        ], [
            'nama_pengajar.required' => 'Nama pengajar harus diisi',
            'nama_pengajar.max' => 'Nama pengajar maksimal 255 karakter',
            'nip.max' => 'NIP maksimal 50 karakter',
            'jurusan_id.required' => 'Jurusan harus dipilih',
            'jurusan_id.exists' => 'Jurusan tidak valid',
            'jabatan.required' => 'Jabatan harus diisi',
            'jabatan.max' => 'Jabatan maksimal 255 karakter',
            'foto_pengajar.image' => 'File harus berupa gambar',
            'foto_pengajar.mimes' => 'Format gambar harus jpeg, png, jpg, gif, atau webp',
            'foto_pengajar.max' => 'Ukuran gambar maksimal 5MB',
            'urutan.integer' => 'Urutan harus berupa angka',
            'urutan.min' => 'Urutan minimal 0',
        ]);

        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'message' => 'Validasi gagal',
                'errors' => $validator->errors()
            ], 422);
        }

        try {
            $data = [
                'nama_pengajar' => $request->nama_pengajar,
                'nip' => $request->nip,
                'jurusan_id' => $request->jurusan_id,
                'jabatan' => $request->jabatan,
                'status' => $request->has('status') ? true : false,
                'urutan' => $request->urutan ?? 0,
            ];

            if ($request->hasFile('foto_pengajar')) {
                $file = $request->file('foto_pengajar');
                $fileName = time() . '_' . uniqid() . '.' . $file->getClientOriginalExtension();
                $file->move(storage_path('guru'), $fileName);
                $data['foto_pengajar'] = $fileName;
            }

            $pengajar = Pengajar::create($data);

            return response()->json([
                'success' => true,
                'message' => 'Tenaga pendidik berhasil ditambahkan!',
                'pengajar' => [
                    'id' => $pengajar->id,
                    'nama_pengajar' => $pengajar->nama_pengajar,
                    'nip' => $pengajar->nip,
                    'jurusan' => $pengajar->jurusan->nama_jurusan ?? '-',
                    'jabatan' => $pengajar->jabatan,
                    'jabatan_pendek' => $pengajar->jabatan_pendek,
                    'foto_pengajar_url' => $pengajar->foto_pengajar_url,
                    'status' => $pengajar->status,
                    'urutan' => $pengajar->urutan,
                    'created_at' => $pengajar->created_at->format('d M Y'),
                ]
            ]);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Terjadi kesalahan: ' . $e->getMessage()
            ], 500);
        }
    }

    public function show(Pengajar $pengajar)
    {
        return response()->json([
            'success' => true,
            'pengajar' => [
                'id' => $pengajar->id,
                'nama_pengajar' => $pengajar->nama_pengajar,
                'nip' => $pengajar->nip,
                'jurusan_id' => $pengajar->jurusan_id,
                'nama_jurusan' => $pengajar->jurusan->nama_jurusan ?? '-',
                'jabatan' => $pengajar->jabatan,
                'foto_pengajar_url' => $pengajar->foto_pengajar_url,
                'status' => $pengajar->status,
                'urutan' => $pengajar->urutan,
                'created_at' => $pengajar->created_at->format('d F Y'),
                'updated_at' => $pengajar->updated_at->format('d F Y'),
            ]
        ]);
    }

    public function update(Request $request, Pengajar $pengajar)
    {
        $validator = Validator::make($request->all(), [
            'nama_pengajar' => 'required|string|max:255',
            'nip' => 'nullable|string|max:50',
            'jurusan_id' => 'required|exists:jurusans,id',
            'jabatan' => 'required|string|max:255',
            'foto_pengajar' => 'nullable|image|mimes:jpeg,png,jpg,gif,webp|max:5120',
            'status' => 'boolean',
            'urutan' => 'nullable|integer|min:0',
        ], [
            'nama_pengajar.required' => 'Nama pengajar harus diisi',
            'nama_pengajar.max' => 'Nama pengajar maksimal 255 karakter',
            'nip.max' => 'NIP maksimal 50 karakter',
            'jurusan_id.required' => 'Jurusan harus dipilih',
            'jurusan_id.exists' => 'Jurusan tidak valid',
            'jabatan.required' => 'Jabatan harus diisi',
            'jabatan.max' => 'Jabatan maksimal 255 karakter',
            'foto_pengajar.image' => 'File harus berupa gambar',
            'foto_pengajar.mimes' => 'Format gambar harus jpeg, png, jpg, gif, atau webp',
            'foto_pengajar.max' => 'Ukuran gambar maksimal 5MB',
            'urutan.integer' => 'Urutan harus berupa angka',
            'urutan.min' => 'Urutan minimal 0',
        ]);

        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'message' => 'Validasi gagal',
                'errors' => $validator->errors()
            ], 422);
        }

        try {
            $data = [
                'nama_pengajar' => $request->nama_pengajar,
                'nip' => $request->nip,
                'jurusan_id' => $request->jurusan_id,
                'jabatan' => $request->jabatan,
                'status' => $request->has('status') ? true : false,
                'urutan' => $request->urutan ?? $pengajar->urutan,
            ];

            if ($request->hasFile('foto_pengajar')) {
                if ($pengajar->foto_pengajar && 
                    file_exists(storage_path('guru/' . $pengajar->foto_pengajar))) {
                    unlink(storage_path('guru/' . $pengajar->foto_pengajar));
                }

                $file = $request->file('foto_pengajar');
                $fileName = time() . '_' . uniqid() . '.' . $file->getClientOriginalExtension();
                $file->move(storage_path('guru'), $fileName);
                $data['foto_pengajar'] = $fileName;
            }

            $pengajar->update($data);

            return response()->json([
                'success' => true,
                'message' => 'Tenaga pendidik berhasil diperbarui!',
                'pengajar' => [
                    'id' => $pengajar->id,
                    'nama_pengajar' => $pengajar->nama_pengajar,
                    'nip' => $pengajar->nip,
                    'jurusan' => $pengajar->jurusan->nama_jurusan ?? '-',
                    'jabatan' => $pengajar->jabatan,
                    'jabatan_pendek' => $pengajar->jabatan_pendek,
                    'foto_pengajar_url' => $pengajar->foto_pengajar_url,
                    'status' => $pengajar->status,
                    'urutan' => $pengajar->urutan,
                    'updated_at' => $pengajar->updated_at->format('d M Y'),
                ]
            ]);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Terjadi kesalahan: ' . $e->getMessage()
            ], 500);
        }
    }

    public function destroy(Pengajar $pengajar)
    {
        try {
            if ($pengajar->foto_pengajar && 
                file_exists(storage_path('guru/' . $pengajar->foto_pengajar))) {
                unlink(storage_path('guru/' . $pengajar->foto_pengajar));
            }

            $pengajar->delete();

            return response()->json([
                'success' => true,
                'message' => 'Tenaga pendidik berhasil dihapus!'
            ]);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Terjadi kesalahan: ' . $e->getMessage()
            ], 500);
        }
    }

    public function updateStatus(Request $request, Pengajar $pengajar)
    {
        $validator = Validator::make($request->all(), [
            'status' => 'required|boolean',
        ]);

        if ($validator->fails()) {
            return response()->json([
                'success' => false,
                'message' => 'Validasi gagal'
            ], 422);
        }

        try {
            $pengajar->update([
                'status' => $request->status
            ]);

            return response()->json([
                'success' => true,
                'message' => 'Status tenaga pendidik berhasil diperbarui!',
                'pengajar' => [
                    'id' => $pengajar->id,
                    'status' => $pengajar->status,
                ]
            ]);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Terjadi kesalahan: ' . $e->getMessage()
            ], 500);
        }
    }
}
