<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\LearningObjective;
use App\Models\Subject;
use App\Models\SchoolProfile;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Http; 
use Illuminate\Support\Facades\Log;

class LearningObjectiveController extends Controller
{
    public function index()
    {
        $user = Auth::user();
        
        // 1. Data Referensi untuk Dropdown (Modal Tambah)
        if ($user->role == 'super_admin') {
            $subjects = Subject::all();
        } else {
            // Asumsi: Guru/Admin Mapel punya relasi 'subjects'
            $subjects = $user->subjects; 
        }

        // 2. Definisi Query Awal
        $query = LearningObjective::with('subject');

        // 3. Filter Data Berdasarkan Role
        if ($user->role == 'super_admin') {
            // Super Admin melihat SEMUA data (Tidak perlu filter tambahan)
        } 
        elseif ($user->role == 'admin_mapel') {
            // Admin Mapel melihat data sesuai mapel yang diampunya
            // Pastikan user punya relasi subjects (many-to-many atau one-to-many)
            $subjectIds = $user->subjects->pluck('id'); 
            $query->whereIn('subject_id', $subjectIds);
        } 
        else {
            // Guru Mapel hanya melihat data yang DIA BUAT SENDIRI (by user_id)
            // ATAU jika ingin melihat berdasarkan mapel yang diajar (walau dibuat orang lain),
            // gunakan logika whereIn('subject_id') seperti admin_mapel.
            // Di sini saya ikuti logika Anda: by user_id.
            $query->where('user_id', $user->id);
        }
        
        // --- PERBAIKAN UTAMA DISINI ---
        // Jangan panggil LearningObjective::... lagi, tapi gunakan $query yang sudah difilter di atas
        $atp = $query->orderBy('phase', 'asc')
                ->orderBy('subject_id', 'asc')
                ->orderBy('created_at', 'asc')
                ->get();

        return view('pages.perangkat.atp.index', [
            'atp' => $atp, 
            'subjects' => $subjects
        ]);
    }

		public function store(Request $request)
    {
        // Validasi input array menggunakan .*
        $request->validate([
            'subject_id'        => 'required',
            'fase'              => 'required',
            'cp'                => 'required',
            'tp.*'              => 'required', // Validasi setiap elemen array tp
            'alokasi_waktu.*'   => 'required|numeric', // Validasi setiap elemen array alokasi
        ]);

        // Looping untuk menyimpan setiap baris TP yang di-generate AI atau diinput manual
        foreach ($request->tp as $index => $tp_desc) {
            // Pastikan TP tidak kosong sebelum disimpan
            if (!empty($tp_desc)) {
                LearningObjective::create([
                    'user_id'               => Auth::id(),
                    'subject_id'            => $request->subject_id,
                    'phase'                 => $request->fase,
                    'learning_outcome'      => $request->cp,
                    'objective_description' => $tp_desc,
                    'alokasi_waktu'         => $request->alokasi_waktu[$index],
                ]);
            }
        }

        return back()->with('success', 'Data ATP (Capaian Pembelajaran dan pecahannya) berhasil disimpan!');
    }
    public function destroy($id)
    {
        $atp = LearningObjective::find($id);

        // Opsional: Validasi agar guru tidak menghapus punya orang lain
        if(Auth::user()->role != 'super_admin' && $atp->user_id != Auth::id()){
             return back()->with('error', 'Anda tidak berhak menghapus data ini.');
        }

        $atp->delete();
        return back()->with('success', 'Data berhasil dihapus.');
    }

    public function print(Request $request)
{
    $user = Auth::user();
    $subjectId = $request->input('subject_id'); // Ambil filter mapel

    $query = LearningObjective::with('subject');

    // Filter berdasarkan Role
    if ($user->role == 'admin_mapel') {
        $subjectIds = $user->subjects->pluck('id'); 
        $query->whereIn('subject_id', $subjectIds);
    } elseif ($user->role != 'super_admin') {
        $query->where('user_id', $user->id);
    }

    // --- TAMBAHKAN FILTER MAPEL SPESIFIK ---
    if ($subjectId) {
        $query->where('subject_id', $subjectId);
    }

    $atp = $query->orderBy('phase', 'asc')
                ->orderBy('created_at', 'asc')
                ->get();

    // Data Sekolah & Guru
    $school = SchoolProfile::first() ?? (object) [
        'principal_name' => '..........................',
        'principal_nip' => '..........................'
    ];
    
    $guru = $user;
    $tanggalCetak = \Carbon\Carbon::now()->locale('id')->isoFormat('D MMMM Y');

    return view('pages.perangkat.atp.print', compact('atp', 'school', 'guru', 'tanggalCetak'));
}
    public function update(Request $request, $id)
{
    // 1. Validasi Input
    $request->validate([
        'subject_id'    => 'required',
        'fase'          => 'required',
        'cp'            => 'required',
        'tp'            => 'required',
        'alokasi_waktu' => 'required|numeric',
    ]);

    // 2. Cari Data Berdasarkan ID
    $atp = LearningObjective::findOrFail($id);

    // 3. Validasi Hak Akses (Opsional tapi disarankan)
    // Pastikan guru tidak mengedit punya orang lain (kecuali admin)
    if(Auth::user()->role != 'super_admin' && $atp->user_id != Auth::id()){
        return back()->with('error', 'Anda tidak memiliki akses untuk mengedit data ini.');
    }

    // 4. Update Data ke Database
    $atp->update([
        'subject_id'            => $request->subject_id,
        'phase'                 => $request->fase,
        'learning_outcome'      => $request->cp,
        'objective_description' => $request->tp,
        'alokasi_waktu'         => $request->alokasi_waktu,
    ]);

    // 5. Kembali dengan pesan sukses
    return back()->with('success', 'Data ATP berhasil diperbarui!');
}
// --- TAMBAHAN: CETAK SATUAN (SINGLE PRINT) ---
public function printSingle($id)
{
    $item = LearningObjective::with(['subject', 'user'])->findOrFail($id);
    
    // Bungkus dalam array/collection agar view print tetap bisa melakukan looping @foreach
    $atp = collect([$item]);

    $school = SchoolProfile::first() ?? (object) [
        'principal_name' => '...........................................',
        'principal_nip' => '...........................................'
    ];

    $guru = Auth::user();
    $tanggalCetak = \Carbon\Carbon::now()->locale('id')->isoFormat('D MMMM Y');

    return view('pages.perangkat.atp.print', compact('atp', 'school', 'guru', 'tanggalCetak'));
}
    
	public function generateAiTP(Request $request)
    {
        $request->validate([
            'cp' => 'required|string',
            'totalJp' => 'required|numeric',
            'subject' => 'required|string',
            'fase' => 'required|string',
        ]);

        $cp = $request->cp;
        $totalJp = $request->totalJp;
        $subject = $request->subject;
        $fase = $request->fase;

        // Prompt dimodifikasi agar meminta Object JSON ("tp_list")
        $prompt = "Sebagai pakar Kurikulum Merdeka, pecah Capaian Pembelajaran (CP) berikut menjadi beberapa Tujuan Pembelajaran (TP) yang berurutan secara logis.
        Mata Pelajaran: {$subject}
        Fase: {$fase}
        Capaian Pembelajaran: {$cp}
        Total Alokasi Waktu: {$totalJp} Jam Pelajaran (JP).
        
        Tugas: 
        1. Buat beberapa TP dari CP tersebut.
        2. Distribusikan total {$totalJp} JP ke dalam TP-TP tersebut secara proporsional. (Jumlah seluruh JP harus tepat {$totalJp}).
        
        OUTPUT WAJIB FORMAT JSON MURNI SEPERTI INI:
        {
            \"tp_list\": [
                {\"tujuan_pembelajaran\": \"Deskripsi TP 1...\", \"alokasi_jp\": 4},
                {\"tujuan_pembelajaran\": \"Deskripsi TP 2...\", \"alokasi_jp\": 6}
            ]
        }";

        try {
            $apiKey = env('GROQ_API_KEY'); 
            $model = env('GROQ_MODEL', 'llama-3.3-70b-versatile');
            
            if (!$apiKey) {
                return response()->json(['status' => 'error', 'message' => 'API Key Groq belum dikonfigurasi di file .env']);
            }

            // Tambahkan opsi 'verify' => false (membantu jika hosting ByetHost bermasalah dengan SSL)
            $response = Http::withOptions(['verify' => false])
                ->withToken($apiKey)
                ->post('https://api.groq.com/openai/v1/chat/completions', [
                'model' => $model, 
                'response_format' => ['type' => 'json_object'], // MEMAKSA AI MENGELUARKAN JSON
                'messages' => [
                    [
                        'role' => 'system',
                        'content' => 'Kamu adalah asisten API yang selalu membalas dengan JSON valid.'
                    ],
                    [
                        'role' => 'user',
                        'content' => $prompt
                    ]
                ],
                'temperature' => 0.2, 
            ]);

            if ($response->successful()) {
                $resultText = $response->json()['choices'][0]['message']['content'];
                $tpData = json_decode($resultText, true);

                // Cek apakah ada key 'tp_list' di dalam JSON
                if (isset($tpData['tp_list']) && is_array($tpData['tp_list'])) {
                    return response()->json([
                        'status' => 'success',
                        'results' => $tpData['tp_list']
                    ]);
                } else {
                    return response()->json([
                        'status' => 'error', 
                        'message' => 'Format AI tidak sesuai. Balasan AI: ' . substr($resultText, 0, 100)
                    ]);
                }
            }

            // JIKA GROQ MENOLAK REQUEST, TAMPILKAN ALASANNYA
            return response()->json([
                'status' => 'error', 
                'message' => 'API Error: ' . $response->body()
            ]);

        } catch (\Exception $e) {
            return response()->json([
                'status' => 'error', 
                'message' => 'Server Error: ' . $e->getMessage()
            ]);
        }
    }
}