<?php

namespace App\Http\Controllers\User;

use App\Http\Controllers\Controller;
use App\Models\Audit;
use App\Models\Bagian;
use App\Models\Tema;
use App\Models\Periode;
use App\Models\Notification;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
use Illuminate\Support\Str;
use Barryvdh\DomPDF\Facade\Pdf;

class AuditController extends Controller
{
   /**
 * Tambah Audit + Daftar Audit Belum Diverifikasi
 */
public function create(Request $request) 
{
    $userId = Auth::id();

    // Reset filter khusus BELUM
    if ($request->has('reset')) {
        session()->forget(['belum_tema', 'belum_bulan', 'belum_tahun']);
        return redirect()->route('audit.create');
    }

    // Filter BELUM
    $belumTema  = $request->input('belum_tema', session('belum_tema'));
    $belumBulan = $request->input('belum_bulan', session('belum_bulan'));
    $belumTahun = $request->input('belum_tahun', session('belum_tahun'));

    session([
        'belum_tema'  => $belumTema,
        'belum_bulan' => $belumBulan,
        'belum_tahun' => $belumTahun,
    ]);

    // Query BELUM verifikasi
    $queryBelum = Audit::with(['bagian', 'tema'])
        ->where('user_id', $userId)
        ->whereRaw("LOWER(TRIM(status)) = 'open'")
        ->where(function ($q) {
            $q->whereNull('tanggal_verifikasi')
              ->orWhereNull('keterangan_sesudah');
        });

    if ($belumTema)  $queryBelum->where('tema_id', $belumTema);
    if ($belumBulan) $queryBelum->whereMonth('tanggal_audit', $belumBulan);
    if ($belumTahun) $queryBelum->whereYear('tanggal_audit', $belumTahun);

    $auditBelumDilengkapi = $queryBelum
        ->orderByDesc('tanggal_audit')
        ->paginate(10, ['*'], 'page_belum');

    $temaList = Tema::whereHas('periode', function ($q) {
        $q->where('status', 1)->whereNull('tanggal_selesai');
    })->pluck('nama', 'id');

    $tahunList = Audit::whereNotNull('tanggal_audit')
        ->selectRaw('YEAR(tanggal_audit) as tahun')
        ->distinct()->orderBy('tahun')
        ->pluck('tahun');

    $bagians = Bagian::all();

    return view('web_user.tambah-audit', compact(
    'auditBelumDilengkapi',
    'temaList',
    'tahunList',
    'bagians',
    'belumTema',
    'belumBulan',
    'belumTahun'
))->with([
    'sudahTema' => null,
    'sudahBulan' => null,
    'sudahTahun' => null,
]);

}

/**
 * Daftar Audit yang SUDAH Diverifikasi
 */
public function verifikasiAudit(Request $request) 
{
    $userId = Auth::id();

    // Reset filter khusus SUDAH
    if ($request->has('reset')) {
        session()->forget(['sudah_tema', 'sudah_bulan', 'sudah_tahun']);
        return redirect()->route('audit.verifikasi');
    }

    // Filter SUDAH
    $sudahTema  = $request->input('sudah_tema', session('sudah_tema'));
    $sudahBulan = $request->input('sudah_bulan', session('sudah_bulan'));
    $sudahTahun = $request->input('sudah_tahun', session('sudah_tahun'));

    session([
        'sudah_tema'  => $sudahTema,
        'sudah_bulan' => $sudahBulan,
        'sudah_tahun' => $sudahTahun,
    ]);

    // Query SUDAH verifikasi
    $querySudah = Audit::with(['bagian', 'tema'])
        ->where('user_id', $userId)
        ->whereRaw("LOWER(TRIM(status)) = 'open'")
        ->whereNotNull('tanggal_verifikasi')
        ->whereNotNull('keterangan_sesudah');

    if ($sudahTema)  $querySudah->where('tema_id', $sudahTema);
    if ($sudahBulan) $querySudah->whereMonth('tanggal_audit', $sudahBulan);
    if ($sudahTahun) $querySudah->whereYear('tanggal_audit', $sudahTahun);

    $auditSudahDilengkapi = $querySudah
        ->orderByDesc('tanggal_audit')
        ->paginate(10, ['*'], 'page_sudah');

    $temaList = Tema::whereIn('id', function ($q) use ($userId) {
        $q->select('tema_id')
          ->from('audit')
          ->where('user_id', $userId)
          ->whereRaw("LOWER(TRIM(status)) = 'open'")
          ->whereNotNull('tanggal_verifikasi')
          ->whereNotNull('keterangan_sesudah');
    })
    ->pluck('nama', 'id');

    $tahunList = Audit::whereNotNull('tanggal_audit')
        ->selectRaw('YEAR(tanggal_audit) as tahun')
        ->distinct()->orderBy('tahun')
        ->pluck('tahun');

    return view('web_user.verifikasi-audit', compact(
        'auditSudahDilengkapi',
        'temaList',
        'tahunList',
        'sudahTema',
        'sudahBulan',
        'sudahTahun'
    ));
}


    private function compressImage($imageFile, $path, $maxKb = 256)
    {
        $manager = new ImageManager(new Driver());
        $img = $manager->read($imageFile);

        $width = 1200;
        $quality = 85;

        do {
            $resized = clone $img;
            $resized->scaleDown(width: $width);

            $tempPath = storage_path('app/temp_img.jpg');
            $resized->toJpeg($quality)->save($tempPath);

            $sizeKb = filesize($tempPath) / 1024;

            if ($sizeKb > $maxKb) {
                if ($quality > 10) {
                    $quality -= 5;
                } else {
                    $width -= 100;
                    $quality = 85;
                }
            }
        } while ($sizeKb > $maxKb && $width > 300);

        $resized->toJpeg($quality)->save(public_path('storage/' . $path));
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'auditor'       => 'required|string|max:100',
            'auditi'        => 'required|string|max:100',
            'tema_id'       => 'required|exists:tema,id',
            'kategori'      => 'required|string|max:100',
            'bagian_id'     => 'required|exists:bagian,id',
            'lokasi'        => 'nullable|string|max:200',
            'foto_sebelum'  => 'required|image|mimes:jpg,jpeg,png',
            'keterangan'    => 'nullable|string',
            'tanggal_audit' => 'required|date',
        ]);

        // Cari periode OPEN untuk tema yang dipilih
        $periodeId = Periode::where('tema_id', $validated['tema_id'])
            ->where('status', 1)
            ->whereNull('tanggal_selesai')
            ->orderByDesc('tanggal_mulai')
            ->value('id');

        if (!$periodeId) {
            return back()->with('error', 'Periode untuk tema ini belum dibuka / sudah ditutup. Hubungi admin.')->withInput();
        }

        $validated['user_id']    = Auth::id();
        $validated['status']     = 'open';       // kecil semua
        $validated['periode_id'] = $periodeId;   // penting untuk toggle per-periode

        if ($request->hasFile('foto_sebelum')) {
            $image = $request->file('foto_sebelum');
            $user  = Auth::user();
            $filename = 'audit_' . Str::slug($user->name) . '_' . Str::slug(optional($user->bagian)->nama_bagian ?? 'bagian') . '_sebelum_' . time() . '.jpg';
            $path = 'audit/' . $filename;
            $this->compressImage($image, $path, 256);
            $validated['foto_sebelum'] = $path;
        }

        Audit::create($validated);

        return redirect()->route('audit.create')->with('success', 'Data audit berhasil disimpan!');
    }

    public function updateSesudah(Request $request, $id)
{
    $audit = Audit::where('id', $id)
        ->where('user_id', Auth::id())
        ->firstOrFail();

    // pakai format tanggal yang pasti valid untuk rule after_or_equal
    $minDate = \Carbon\Carbon::parse($audit->tanggal_audit)->toDateString();

    $rules = [
        'keterangan_sesudah' => 'required|string',
        // foto OPSIONAL beneran:
        'foto_sesudah'       => 'sometimes|nullable|file|image|mimes:jpg,jpeg,png|max:5120',
    ];

    $rules['tanggal_verifikasi'] = ['nullable', 'date', 'after_or_equal:'.$audit->tanggal_audit];

    $validated = $request->validate($rules);

    // simpan teks sesudah
    $audit->keterangan_sesudah = $validated['keterangan_sesudah'];

    // simpan foto (hanya kalau ada file)
    if ($request->hasFile('foto_sesudah')) {
        $image = $request->file('foto_sesudah');
        $user  = Auth::user();
        $filename = 'audit_' . \Illuminate\Support\Str::slug($user->name) . '_'
            . \Illuminate\Support\Str::slug(optional($user->bagian)->nama_bagian ?? 'bagian')
            . '_sesudah_' . time() . '.jpg';
        $path = 'audit/' . $filename;

        $this->compressImage($image, $path, 256);
        $audit->foto_sesudah = $path;
    }

    // set/update tanggal_verifikasi bila dikirim
    if ($request->filled('tanggal_verifikasi')) {
        $audit->tanggal_verifikasi = $request->tanggal_verifikasi;
    }

    // superadmin bisa set PIC (opsional)
    if (Auth::user()->role === 'superadmin' && $request->filled('pic_perbaikan')) {
        $audit->pic_perbaikan = $request->input('pic_perbaikan');
    }

    $audit->save();

    return redirect()->route('audit.create')->with('success', 'Data verifikasi berhasil disimpan.');
}


    public function riwayat(Request $request)
{
    $userId = Auth::id();
    $limit  = (int) $request->get('limit', 10);

    $query = Audit::with(['bagian', 'tema'])
        ->where('user_id', $userId)
        ->where('status', 'close');

    // --- Filter Tema (PASTI aktif) ---
    if ($request->filled('filter_tema')) {
        $query->where('tema_id', $request->filter_tema);
    }

    // --- Filter Bulan/Tahun (SARAN: pakai tanggal_verifikasi agar sesuai label "Bulan Verifikasi") ---
    if ($request->filled('filter_bulan')) {
        $query->whereMonth('tanggal_verifikasi', $request->filter_bulan);
    }
    if ($request->filled('filter_tahun')) {
        $query->whereYear('tanggal_verifikasi', $request->filter_tahun);
    }

    $auditSudahClose = $query->orderByDesc('tanggal_verifikasi')
        ->paginate($limit)
        ->appends($request->query());

    // Dropdown sumber data
    $temaList  = Tema::pluck('nama', 'id'); // [id => nama]
    $tahunList = Audit::where('user_id', $userId)
        ->where('status', 'close')
        ->whereNotNull('tanggal_verifikasi')
        ->selectRaw('YEAR(tanggal_verifikasi) as tahun')
        ->distinct()
        ->orderBy('tahun')
        ->pluck('tahun');

    return view('web_user.riwayat-audit', compact('auditSudahClose', 'temaList', 'tahunList'));
}


    public function hasilAudit(Request $request)
    {
        $bagianId = Auth::user()->bagian_id;

        // RESET
        if ($request->has('reset')) {
            session()->forget([
                'filter_tema_user',
                'filter_bulan_audit',
                'filter_tahun_audit',
                'limit_audit'
            ]);

            $auditBulanIni = new \Illuminate\Pagination\LengthAwarePaginator([], 0, 10);

            $semuaAuditOpen = Audit::with(['bagian', 'tema'])
                ->where('bagian_id', $bagianId)
                ->where('status', 'open')
                ->orderByDesc('tanggal_audit')
                ->get();

            $temaList = Tema::whereIn('id', function ($q) use ($bagianId) {
                $q->select('tema_id')
                ->from('audit')
                ->where('bagian_id', $bagianId);
            })
            ->orderBy('nama')
            ->pluck('nama', 'id');
            $tahunList = Audit::where('bagian_id', $bagianId)
                ->selectRaw('YEAR(tanggal_audit) as tahun')
                ->distinct()
                ->pluck('tahun');

            return view('web_user.hasil-audit', compact(
                'auditBulanIni',
                'semuaAuditOpen',
                'temaList',
                'tahunList'
            ));
        }

        // SIMPAN FILTER
        if ($request->filled('filter_tema'))  session(['filter_tema_user'   => $request->filter_tema]);
        if ($request->filled('filter_bulan')) session(['filter_bulan_audit' => $request->filter_bulan]);
        if ($request->filled('filter_tahun')) session(['filter_tahun_audit' => $request->filter_tahun]);
        session(['limit_audit' => $request->get('limit', session('limit_audit', 10))]);

        $adaFilter = session()->has('filter_tema_user') ||
                     session()->has('filter_bulan_audit') ||
                     session()->has('filter_tahun_audit');

        if ($adaFilter) {
            $auditBulanIni = Audit::with(['bagian', 'tema'])
                ->where('bagian_id', $bagianId)
                ->when(session('filter_tema_user'),  fn($q) => $q->where('tema_id', session('filter_tema_user')))
                ->when(session('filter_bulan_audit'), fn($q) => $q->whereMonth('tanggal_audit', session('filter_bulan_audit')))
                ->when(session('filter_tahun_audit'), fn($q) => $q->whereYear('tanggal_audit', session('filter_tahun_audit')))
                ->orderByDesc('tanggal_audit')
                ->paginate(session('limit_audit'));
        } else {
            $auditBulanIni = new \Illuminate\Pagination\LengthAwarePaginator([], 0, session('limit_audit'));
        }

        $semuaAuditOpen = Audit::with(['bagian', 'tema'])
            ->where('bagian_id', $bagianId)
            ->where('status', 'open')
            ->orderByDesc('tanggal_audit')
            ->get();

        $temaList = Tema::whereIn('id', function ($q) use ($bagianId) {
            $q->select('tema_id')->from('audit')->where('bagian_id', $bagianId);
        })->orderBy('nama')->get();

        $tahunList = Audit::where('bagian_id', $bagianId)
            ->selectRaw('YEAR(tanggal_audit) as tahun')
            ->distinct()
            ->pluck('tahun');

        $temaTerpilih = null;
        if (session('filter_tema_user')) {
            $temaTerpilih = Tema::find(session('filter_tema_user'));
        }

        return view('web_user.hasil-audit', compact(
            'auditBulanIni',
            'semuaAuditOpen',
            'temaList',
            'tahunList',
            'temaTerpilih'
        ));
    }

    public function hasilAuditShow($id)
    {
        $audit = Audit::with(['user.bagian', 'bagian'])->findOrFail($id);
        return view('web_user.detail-hasil-audit', compact('audit'));
    }

    public function notifikasi()
    {
        $notifikasi = Notification::where('user_id', Auth::id())
            ->orderBy('created_at', 'desc')
            ->get();

        return view('web_user.notifikasi', compact('notifikasi'));
    }

    public function formVerifikasi($id)
    {
        $audit = Audit::with('bagian')
            ->where('id', $id)
            ->where('user_id', Auth::id())
            ->firstOrFail();

        return view('web_user.detail-verifikasi', compact('audit'));
    }

    public function submitVerifikasi(Request $request, $id)
    {
    // Ambil audit dulu supaya bisa validasi pakai tanggal_audit dari DB
    $audit = Audit::where('id', $id)
        ->where('user_id', Auth::id())
        ->firstOrFail();

    // Validasi:
    // - tanggal_verifikasi WAJIB hanya kalau di DB belum ada
    // - selalu dibandingkan dengan tanggal_audit milik audit (DB), bukan input request
    $rules = [
        'keterangan_sesudah' => 'required|string',
        'foto_sesudah'       => 'nullable|image|mimes:jpg,jpeg,png',
    ];
    $rules['tanggal_verifikasi'] = ['nullable', 'date', 'after_or_equal:'.$audit->tanggal_audit];

    $validated = $request->validate($rules);

    // Simpan keterangan sesudah
    $audit->keterangan_sesudah = $validated['keterangan_sesudah'];

    // Simpan foto sesudah (opsional)
    if ($request->hasFile('foto_sesudah')) {
        $image = $request->file('foto_sesudah');
        $user  = Auth::user();
        $filename = 'audit_'
            . \Illuminate\Support\Str::slug($user->name) . '_'
            . \Illuminate\Support\Str::slug(optional($user->bagian)->nama_bagian ?? 'bagian')
            . '_sesudah_' . time() . '.jpg';
        $path = 'audit/' . $filename;

        // pakai helper/func compressImage yg sudah ada di controller
        $this->compressImage($image, $path, 256);
        $audit->foto_sesudah = $path;
    }

    // Set/update tanggal_verifikasi bila dikirim
    if ($request->filled('tanggal_verifikasi')) {
        $audit->tanggal_verifikasi = $request->tanggal_verifikasi;
    }

    // (opsional) role superadmin bisa set PIC
    if (Auth::user()->role === 'superadmin') {
        $audit->pic_perbaikan = $request->input('pic_perbaikan');
    }

    $audit->save();

    return redirect()->route('audit.create')->with('success', 'Data verifikasi berhasil disimpan.');
    }


    public function hasilVerifikasi(Request $request)
    {
        $bagianId = Auth::user()->bagian_id;

        // RESET
        if ($request->has('reset')) {
            session()->forget([
                'filter_tema_user',
                'filter_bulan_audit',
                'filter_tahun_audit',
                'limit_audit'
            ]);

            $auditBulanIni = new \Illuminate\Pagination\LengthAwarePaginator([], 0, 10);

            $semuaAuditClose = Audit::with(['bagian', 'tema'])
                ->where('bagian_id', $bagianId)
                ->where('status', 'close')
                ->orderByDesc('tanggal_audit')
                ->get();

            $temaList = Tema::whereIn('id', function ($q) use ($bagianId) {
                $q->select('tema_id')
                ->from('audit')
                ->where('bagian_id', $bagianId);
            })
            ->orderBy('nama')
            ->pluck('nama', 'id');
            $tahunList = Audit::where('bagian_id', $bagianId)
                ->selectRaw('YEAR(tanggal_audit) as tahun')
                ->distinct()
                ->pluck('tahun');

            return view('web_user.hasil-verifikasi', compact(
                'auditBulanIni',
                'semuaAuditClose',
                'temaList',
                'tahunList'
            ));
        }

        // SIMPAN FILTER
        if ($request->filled('filter_tema'))  session(['filter_tema_user'   => $request->filter_tema]);
        if ($request->filled('filter_bulan')) session(['filter_bulan_audit' => $request->filter_bulan]);
        if ($request->filled('filter_tahun')) session(['filter_tahun_audit' => $request->filter_tahun]);
        session(['limit_audit' => $request->get('limit', session('limit_audit', 10))]);

        $adaFilter = session()->has('filter_tema_user') ||
                     session()->has('filter_bulan_audit') ||
                     session()->has('filter_tahun_audit');

        if ($adaFilter) {
            $auditBulanIni = Audit::with(['bagian', 'tema'])
                ->where('bagian_id', $bagianId)
                ->where('status', 'close')
                ->when(session('filter_tema_user'),  fn($q) => $q->where('tema_id', session('filter_tema_user')))
                ->when(session('filter_bulan_audit'), fn($q) => $q->whereMonth('tanggal_audit', session('filter_bulan_audit')))
                ->when(session('filter_tahun_audit'), fn($q) => $q->whereYear('tanggal_audit', session('filter_tahun_audit')))
                ->orderByDesc('tanggal_audit')
                ->paginate(session('limit_audit'));
        } else {
            $auditBulanIni = new \Illuminate\Pagination\LengthAwarePaginator([], 0, session('limit_audit'));
        }

        $semuaAuditClose = Audit::with(['bagian', 'tema'])
            ->where('bagian_id', $bagianId)
            ->where('status', 'close')
            ->orderByDesc('tanggal_audit')
            ->get();

        $temaList = Tema::whereIn('id', function ($q) use ($bagianId) {
            $q->select('tema_id')->from('audit')->where('bagian_id', $bagianId);
        })->orderBy('nama')->get();

        $tahunList = Audit::where('bagian_id', $bagianId)
            ->selectRaw('YEAR(tanggal_audit) as tahun')
            ->distinct()
            ->pluck('tahun');

        $temaTerpilih = null;
        if (session('filter_tema_user')) {
            $temaTerpilih = Tema::find(session('filter_tema_user'));
        }

        return view('web_user.hasil-verifikasi', compact(
            'auditBulanIni',
            'semuaAuditClose',
            'temaList',
            'tahunList',
            'temaTerpilih'
        ));
    }

    public function exportPDF($id)
{
    $user = Auth::user();

    $query = Audit::with(['user', 'bagian', 'tema'])
        ->where('id', $id);

    // Superadmin boleh semua
    if ($user->role === 'superadmin') {
        $audit = $query->firstOrFail();
    } else {
        // Non-superadmin: boleh kalau
        // (1) audit dibuat sendiri OR
        // (2) divisi audit = divisi user login
        $audit = $query
            ->where(function ($q) use ($user) {
                $q->where('user_id', $user->id)
                  ->orWhere('bagian_id', $user->bagian_id);
            })
            ->firstOrFail();
    }

    $pdf = Pdf::loadView('web_user.export.audit-pdf', compact('audit'));
    return $pdf->download('audit-' . $id . '.pdf');
}


    public function show($id)
    {
        $audit = Audit::with(['user.bagian', 'bagian', 'tema'])->findOrFail($id);
        return view('web_user.detail-audit', compact('audit'));
    }
}
