<?php

namespace App\Http\Controllers\api;

use App\Http\Controllers\Controller;
use App\Events\HelloEvent;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Storage;

class GuruMobileController extends Controller
{
    public function tampilKelasGuru(Request $request)
    {
        $id_guru = $request->input('id_guru');

        $kelas = DB::table('kelas')
            ->select('kelas.*')
            ->join('mengajar', 'mengajar.id_kelas', '=', 'kelas.id_kelas')
            ->where('mengajar.id_guru', $id_guru)
            ->get();

        return response()->json($kelas);
    }

    public function tampilMataPelajaranGuru(Request $request)
    {
        $id_guru = $request->input('id_guru');

        $mataPelajaranguru = DB::table('mata_pelajaran')
            ->select('mata_pelajaran.id_mapel', 'mata_pelajaran.nama_mapel', 'kelas.nama_kelas', 'kelas.id_kelas')
            ->join('mengajar as mengajar_mapel', 'mengajar_mapel.id_mapel', '=', 'mata_pelajaran.id_mapel')
            ->join('kelas', 'kelas.id_kelas', '=', 'mengajar_mapel.id_kelas')
            ->where('mengajar_mapel.id_guru', $id_guru)
            ->get();

        return response()->json($mataPelajaranguru);
    }



    public function tampilTugasDetailMateriGuru(Request $request)
    {
        $id_materi = $request->input('id_materi');

        $tugas = DB::table('tugas')
            ->select('tugas.id_tugas', 'materi.judul_materi', 'tugas.tenggat_waktu', 'tugas.keterangan')
            ->join('materi', 'materi.id_materi', '=', 'tugas.id_materi')
            ->where('tugas.id_materi', $id_materi)
            ->orderBy('tugas.id_tugas', 'desc')
            ->get();


        return response()->json($tugas);
    }

    public function tambahTugasGuru(Request $request)
    {
        // Validasi input
        $validated = $request->validate([
            'id_materi' => 'required|integer',
            'tenggat_waktu' => 'required|date_format:Y-m-d',
            'keterangan' => 'required|string',
            'file' => 'nullable|string', // file bisa null
            'message' => 'nullable|string',
        ]);

        $id_materi = $validated['id_materi'];
        $tenggat_waktu = $validated['tenggat_waktu'];
        $keterangan = $validated['keterangan'];
        $fileBase64 = $validated['file'] ?? null;

        try {
            // Cek apakah sudah ada tugas dengan id_materi yang sama
            $existingTugas = DB::table('tugas')
                ->where('id_materi', $id_materi)
                ->first();

            if ($existingTugas) {
                return response()->json(['message' => 'Tugas untuk materi ini sudah ada'], 400);
            }

            $fileName = null;

            // Jika file disertakan, proses file
            if ($fileBase64) {
                // Decode base64 file
                $fileData = base64_decode($fileBase64);

                // Generate nama file dengan format idMateri_tanggalWaktu.pdf
                $fileName = $id_materi . '_' . now()->format('YmdHis') . '.pdf';
                $targetPath = public_path('storage/tugas/') . $fileName;

                // Simpan file ke storage
                file_put_contents($targetPath, $fileData);
            }

            // Tambah tugas baru
            DB::table('tugas')->insert([
                'id_materi' => $id_materi,
                'tenggat_waktu' => $tenggat_waktu,
                'keterangan' => $keterangan,
                'file_path' => $fileName, // bisa bernilai null jika file tidak disertakan
            ]);

            $title = "Tugas Baru";
            $message = "Tugas baru telah ditambahkan ";

            broadcast(new HelloEvent($title, $message))->toOthers();

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


public function editTugasGuru(Request $request)
{
    // Validasi input
    $validated = $request->validate([
        'id_tugas' => 'required|integer',
        'tenggat_waktu' => 'required|date_format:Y-m-d',
        'keterangan' => 'required|string',
        'file' => 'nullable|string' // Tambahkan validasi untuk file (Base64 encoded string)
    ]);

    $id_tugas = $validated['id_tugas'];
    $tenggat_waktu = $validated['tenggat_waktu'];
    $keterangan = $validated['keterangan'];
    $fileBase64 = $validated['file'] ?? null; // Ambil file jika ada

    try {
        // Update tugas berdasarkan id_tugas
        $updateData = [
            'tenggat_waktu' => $tenggat_waktu,
            'keterangan' => $keterangan,
        ];

        if ($fileBase64) {
            // Decode file dari Base64 ke binary
            $binaryFile = base64_decode($fileBase64);

            // Generate nama file dengan format idTugas_tanggalWaktu.pdf
            $filename = $id_tugas . '_' . now()->format('YmdHis') . '.pdf';
            $targetPath = public_path('storage/tugas/') . $filename;
            file_put_contents($targetPath, $binaryFile);

            // Tambahkan nama file ke data yang akan diupdate
            $updateData['file_path'] = 'storage/tugas/' . $filename;
        }

        $updated = DB::table('tugas')
            ->where('id_tugas', $id_tugas)
            ->update($updateData);

        if ($updated) {
            return response()->json(['message' => 'Tugas berhasil diupdate']);
        } else {
            return response()->json(['message' => 'Tidak ada perubahan yang dilakukan'], 200);
        }
    } catch (\Exception $e) {
        return response()->json(['message' => 'Terjadi kesalahan: ' . $e->getMessage()], 500);
    }
}



    public function tampilPengumpulanTugasGuru(Request $request)
    {
        // Validasi input
        $validated = $request->validate([
            'id_guru' => 'required|integer',
        ]);

        $id_guru = $validated['id_guru'];

        try {
            $pengumpulanTugas = DB::table('pengumpulan_tugas')
                ->join('tugas', 'pengumpulan_tugas.id_tugas', '=', 'tugas.id_tugas')
                ->join('materi', 'tugas.id_materi', '=', 'materi.id_materi')
                ->join('mata_pelajaran', 'materi.id_mapel', '=', 'mata_pelajaran.id_mapel')
                ->join('mengajar', function ($join) use ($id_guru) {
                    $join->on('mengajar.id_mapel', '=', 'mata_pelajaran.id_mapel')
                        ->where('mengajar.id_guru', '=', $id_guru);
                })
                ->join('siswa', 'pengumpulan_tugas.id_siswa', '=', 'siswa.nisn') // Join ke tabel siswa
                ->select(
                    'pengumpulan_tugas.*',
                    'siswa.nama_siswa', // Menambahkan nama_siswa ke dalam hasil query
                    'materi.judul_materi'
                )
                ->get();

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

    public function editNilaiTugasGuru(Request $request)
    {
        // Validasi input
        $validated = $request->validate([
            'id_pengumpulan' => 'required|integer|exists:pengumpulan_tugas,id_pengumpulan',
            'nilai' => 'required|integer|min:0|max:100', // asumsi nilai antara 0 dan 100
        ]);

        $id_pengumpulan = $validated['id_pengumpulan'];
        $nilai = $validated['nilai'];

        try {
            // Cari pengumpulan tugas berdasarkan id_pengumpulan
            $pengumpulanTugas = DB::table('pengumpulan_tugas')
                ->where('id_pengumpulan', $id_pengumpulan)
                ->first();

            // Cek apakah pengumpulan tugas ditemukan
            if (!$pengumpulanTugas) {
                return response()->json(['message' => 'Pengumpulan tugas tidak ditemukan.'], 404);
            }

            // Update nilai
            DB::table('pengumpulan_tugas')
                ->where('id_pengumpulan', $id_pengumpulan)
                ->update(['nilai' => $nilai]);

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

    // public function downloadTugas(Request $request)
    // {


    //     // Validasi request
    //     $request->validate([
    //         'id_pengumpulan' => 'required|string', // Pastikan 'file_name' sesuai dengan nama field yang digunakan di Android
    //     ]);

    //     $id_pengumpulan = $request->input('id_pengumpulan');


    //     $fileName = DB::table('pengumpulan_tugas')
    //         ->where('id_pengumpulan', $id_pengumpulan)
    //         ->value('lampiran_tugas');

    //     // Dapatkan path lengkap ke file
    //     $filePath = public_path('documents/' . $fileName);

    //     // Periksa apakah file ada
    //     if (file_exists($filePath)) {
    //         // Jika ada, kirimkan file sebagai respons
    //         return response()->download($filePath, $fileName);
    //     } else {
    //         // Jika tidak, kirimkan respons file tidak ditemukan
    //         return response()->json(['message' => 'File tidak ditemukan'], 404);
    //     }
    // }


    public function downloadTugas(Request $request)
    {
        // Validasi request
        $request->validate([
            'id_pengumpulan' => 'required|string', // Pastikan 'file_name' sesuai dengan nama field yang digunakan di Android
        ]);

        $id_pengumpulan = $request->input('id_pengumpulan');

        // Dapatkan nama file dari database
        $fileName = DB::table('pengumpulan_tugas')
            ->where('id_pengumpulan', $id_pengumpulan)
            ->value('lampiran_tugas');

        if ($fileName) {
            // Dapatkan URL lengkap ke file
            $fileUrl = Storage::url($fileName);

            // Tambahkan header "ngrok-skip-browser-warning"
            return response()->json([
                'fileUrl' => asset($fileUrl),
            ]);
        } else {
            // Jika tidak ada data materi yang ditemukan
            return response()->json(['message' => 'Materi tidak ditemukan'], 404);
        }
    }


    public function tampilTugasGuru(Request $request)
    {
        $id_guru = $request->input('id_guru');

        $tugas = DB::table('tugas')
            ->select('tugas.id_tugas', 'materi.judul_materi', 'tugas.tenggat_waktu', 'tugas.keterangan')
            ->join('materi', 'materi.id_materi', '=', 'tugas.id_materi')
            ->join('mata_pelajaran', 'mata_pelajaran.id_mapel', '=', 'materi.id_mapel')
            ->join('kelas', 'kelas.id_kelas', '=', 'mata_pelajaran.id_kelas')
            ->join('mengajar', 'mengajar.id_mapel', '=', 'mata_pelajaran.id_mapel')
            ->where('mengajar.id_guru', $id_guru)
            ->orderBy('tugas.id_tugas', 'desc')
            ->get();

        return response()->json($tugas);
    }

    public function updatePasswordGuru(Request $request)
    {
        $nip = $request->input('nip');
        $oldPassword = $request->input('old_password');
        $newPassword = $request->input('new_password');

        $user = DB::table('guru')->where('nip', $nip)->first();

        if ($user && $user->password === $oldPassword) {
            // The old password matches, so update the password
            DB::table('guru')->where('nip', $nip)->update([
                'password' => $newPassword,
            ]);

            $updatedUser = DB::table('guru')->where('nip', $nip)->first();

            $response = array(
                'success' => true,
                'message' => 'Password telah diperbarui',
            );
            return response()->json($response);
        } else {
            return "Invalid old password";
        }
    }

    public function tampilMateriGuru(Request $request)
    {
        $id_mapel = $request->input('id_mapel');

        $materi = DB::table('materi')
            ->select('materi.id_materi', 'materi.judul_materi', 'materi.keterangan')
            ->where('materi.id_mapel', $id_mapel)
            ->get();

        return response()->json($materi);
    }

    public function TambahMateriGuru(Request $request)
    {
        // Ambil input dari request
        $lampiranMateri = $request->input('lampiran_materi');
        $judulMateri = $request->input('judul_materi');
        $keterangan = $request->input('keterangan');
        $idMapel = $request->input('id_mapel');

        try {
            // Decode file dari Base64 ke binary
            $binaryFile = base64_decode($lampiranMateri);

            // Generate nama file dengan format judulMateri_tanggalWaktu.pdf
            $filename = $judulMateri . '_' . now()->format('YmdHis') . '.pdf';
            $targetPath = public_path('storage/materi/') . $filename;

            // Simpan file ke path target
            file_put_contents($targetPath, $binaryFile);

            // Tambahkan data ke database
            DB::table('materi')->insert([
                'lampiran_materi' => 'materi/' . $filename,
                'judul_materi' => $judulMateri,
                'keterangan' => $keterangan,
                'id_mapel' => $idMapel,
                'created_at' => now(),
                'updated_at' => now(),
            ]);

            return response()->json(['message' => 'File berhasil diupload dan data tugas ditambahkan'], 200);
        } catch (\Exception $e) {
            // Tangani semua kesalahan yang terjadi dan kembalikan respons kesalahan
            return response()->json(['message' => 'Gagal menambahkan materi: ' . $e->getMessage()], 500);
        }
    }


}
