<?php

namespace App\Http\Controllers\Guru;

use App\Http\Controllers\Controller;
use App\Models\Absensi;
use App\Models\Siswa;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Exports\RekapKehadiranExport;
use Maatwebsite\Excel\Facades\Excel;

class RekapKehadiranController extends Controller
{
    public function index(Request $request)
{
    $user = Auth::user();

    if (!$user->guru) {
        return redirect()->route('dashboard')
            ->with('error', 'Data profil Guru tidak ditemukan.');
    }

    $guruId = $user->guru->guru_id;
    $jadwalId = $request->jadwal_id;

$jadwals = \App\Models\Jadwal::with(['mapel', 'kelas'])
    ->where('guru_id', $guruId)
    ->get();

    $periode = $request->get('periode', 'harian');
    $tanggal = $request->get('tanggal', date('Y-m-d'));
    $bulan   = $request->get('bulan', date('Y-m'));
    $tahun   = $request->get('tahun', date('Y'));

    $namaKolomTanggal = 'tanggal';

    $items = Siswa::whereHas('absensi', function ($query) use (
        $jadwalId,
        $guruId,
        $periode,
        $tanggal,
        $bulan,
        $tahun,
        $namaKolomTanggal
    ) {

       $query->whereHas('jadwal', function ($jadwal) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $jadwal->where('jadwal_id', $jadwalId);
    } else {
        $jadwal->where('guru_id', $guruId);
    }

});

        if ($periode == 'harian') {
            $query->whereDate($namaKolomTanggal, $tanggal);
        }

        if ($periode == 'bulanan') {
            $query->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
        }

        if ($periode == 'tahunan') {
            $query->whereYear($namaKolomTanggal, $tahun);
        }
    })
    ->withCount([

        'absensi as total_hadir' => function ($q) use (
    $jadwalId,
    $guruId,
    $periode,
    $tanggal,
    $bulan,
    $tahun,
    $namaKolomTanggal
) {

            $q->where('status', 'H');
           $q->whereHas('jadwal', function ($jadwal) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $jadwal->where('jadwal_id', $jadwalId);
    } else {
        $jadwal->where('guru_id', $guruId);
    }

});

            if ($periode == 'harian') {
                $q->whereDate($namaKolomTanggal, $tanggal);
            }

            if ($periode == 'bulanan') {
                $q->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                    ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
            }

            if ($periode == 'tahunan') {
                $q->whereYear($namaKolomTanggal, $tahun);
            }
        },

        'absensi as total_sakit' => function ($q) use (
    $jadwalId,
    $guruId,
    $periode,
    $tanggal,
    $bulan,
    $tahun,
    $namaKolomTanggal
) {

            $q->where('status', 'S');
           $q->whereHas('jadwal', function ($jadwal) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $jadwal->where('jadwal_id', $jadwalId);
    } else {
        $jadwal->where('guru_id', $guruId);
    }

});

            if ($periode == 'harian') {
                $q->whereDate($namaKolomTanggal, $tanggal);
            }

            if ($periode == 'bulanan') {
                $q->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                    ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
            }

            if ($periode == 'tahunan') {
                $q->whereYear($namaKolomTanggal, $tahun);
            }
        },

        'absensi as total_izin' => function ($q) use (
    $jadwalId,
    $guruId,
    $periode,
    $tanggal,
    $bulan,
    $tahun,
    $namaKolomTanggal
) {

            $q->where('status', 'I');
           $q->whereHas('jadwal', function ($jadwal) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $jadwal->where('jadwal_id', $jadwalId);
    } else {
        $jadwal->where('guru_id', $guruId);
    }

});

            if ($periode == 'harian') {
                $q->whereDate($namaKolomTanggal, $tanggal);
            }

            if ($periode == 'bulanan') {
                $q->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                    ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
            }

            if ($periode == 'tahunan') {
                $q->whereYear($namaKolomTanggal, $tahun);
            }
        },

        'absensi as total_alfa' => function ($q) use (
    $jadwalId,
    $guruId,
    $periode,
    $tanggal,
    $bulan,
    $tahun,
    $namaKolomTanggal
) {

            $q->where('status', 'A');
           $q->whereHas('jadwal', function ($jadwal) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $jadwal->where('jadwal_id', $jadwalId);
    } else {
        $jadwal->where('guru_id', $guruId);
    }

});
            if ($periode == 'harian') {
                $q->whereDate($namaKolomTanggal, $tanggal);
            }

            if ($periode == 'bulanan') {
                $q->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                    ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
            }

            if ($periode == 'tahunan') {
                $q->whereYear($namaKolomTanggal, $tahun);
            }
        },

    ])
    ->paginate(10)
    ->withQueryString();

   return view(
    'guru.rekap-kehadiran.index',
    compact(
        'items',
        'jadwals',
        'tanggal',
        'bulan',
        'tahun',
        'periode'
    )
);
}
public function exportExcel(Request $request)
{
    $user = Auth::user();

    if (!$user->guru) {
        return redirect()->route('dashboard')
            ->with('error', 'Data profil Guru tidak ditemukan.');
    }

   $guruId = $user->guru->guru_id;
    $jadwalId = $request->jadwal_id;

$jadwals = \App\Models\Jadwal::with(['mapel', 'kelas'])
    ->where('guru_id', $guruId)
    ->get();

    $periode = $request->get('periode', 'harian');
    $tanggal = $request->get('tanggal', date('Y-m-d'));
    $bulan   = $request->get('bulan', date('Y-m'));
    $tahun   = $request->get('tahun', date('Y'));

    $namaKolomTanggal = 'tanggal';

    $items = Siswa::whereHas('absensi', function ($query) use (
        $jadwalId,
        $guruId,
        $periode,
        $tanggal,
        $bulan,
        $tahun,
        $namaKolomTanggal
    ) {

        $query->whereHas('jadwal', function ($q) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $q->where('jadwal_id', $jadwalId);
    } else {
        $q->where('guru_id', $guruId);
    }

});

        if ($periode == 'harian') {
            $query->whereDate($namaKolomTanggal, $tanggal);
        }

        if ($periode == 'bulanan') {
            $query->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
        }

        if ($periode == 'tahunan') {
            $query->whereYear($namaKolomTanggal, $tahun);
        }
    })
    ->withCount([

        'absensi as total_hadir' => function ($q) use (
    $jadwalId,
    $guruId,
    $periode,
    $tanggal,
    $bulan,
    $tahun,
    $namaKolomTanggal
) {

            $q->where('status', 'H');
            $q->whereHas('jadwal', function ($jadwal) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $jadwal->where('jadwal_id', $jadwalId);
    } else {
        $jadwal->where('guru_id', $guruId);
    }

});

            if ($periode == 'harian') {
                $q->whereDate($namaKolomTanggal, $tanggal);
            }

            if ($periode == 'bulanan') {
                $q->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                    ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
            }

            if ($periode == 'tahunan') {
                $q->whereYear($namaKolomTanggal, $tahun);
            }
        },

        'absensi as total_sakit' => function ($q) use (
    $jadwalId,
    $guruId,
    $periode,
    $tanggal,
    $bulan,
    $tahun,
    $namaKolomTanggal
) {

            $q->where('status', 'S');
            $q->whereHas('jadwal', function ($jadwal) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $jadwal->where('jadwal_id', $jadwalId);
    } else {
        $jadwal->where('guru_id', $guruId);
    }

});

            if ($periode == 'harian') {
                $q->whereDate($namaKolomTanggal, $tanggal);
            }

            if ($periode == 'bulanan') {
                $q->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                    ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
            }

            if ($periode == 'tahunan') {
                $q->whereYear($namaKolomTanggal, $tahun);
            }
        },

        'absensi as total_izin' => function ($q) use (
    $jadwalId,
    $guruId,
    $periode,
    $tanggal,
    $bulan,
    $tahun,
    $namaKolomTanggal
) {

            $q->where('status', 'I');
            $q->whereHas('jadwal', function ($jadwal) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $jadwal->where('jadwal_id', $jadwalId);
    } else {
        $jadwal->where('guru_id', $guruId);
    }

});

            if ($periode == 'harian') {
                $q->whereDate($namaKolomTanggal, $tanggal);
            }

            if ($periode == 'bulanan') {
                $q->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                    ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
            }

            if ($periode == 'tahunan') {
                $q->whereYear($namaKolomTanggal, $tahun);
            }
        },

        'absensi as total_alfa' => function ($q) use (
    $jadwalId,
    $guruId,
    $periode,
    $tanggal,
    $bulan,
    $tahun,
    $namaKolomTanggal
) {

            $q->where('status', 'A');
            $q->whereHas('jadwal', function ($jadwal) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $jadwal->where('jadwal_id', $jadwalId);
    } else {
        $jadwal->where('guru_id', $guruId);
    }

});

            if ($periode == 'harian') {
                $q->whereDate($namaKolomTanggal, $tanggal);
            }

            if ($periode == 'bulanan') {
                $q->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                    ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
            }

            if ($periode == 'tahunan') {
                $q->whereYear($namaKolomTanggal, $tahun);
            }
        },

            ])->get();

    return Excel::download(
        new RekapKehadiranExport(
            $items,
            $jadwals,
            $user,
            $periode,
            $tanggal,
            $bulan,
            $tahun
        ),
        'Rekap_Kehadiran.xlsx'
    );
}
    public function exportPdf(Request $request)
    {
        $user = Auth::user();

    if (!$user->guru) {
        return redirect()->route('dashboard')
            ->with('error', 'Data profil Guru tidak ditemukan.');
    }

    $guruId = $user->guru->guru_id;
    $jadwalId = $request->jadwal_id;

$jadwals = \App\Models\Jadwal::with(['mapel', 'kelas'])
    ->where('guru_id', $guruId)
    ->get();

    $periode = $request->get('periode', 'harian');
    $tanggal = $request->get('tanggal', date('Y-m-d'));
    $bulan   = $request->get('bulan', date('Y-m'));
    $tahun   = $request->get('tahun', date('Y'));

    $namaKolomTanggal = 'tanggal';

    $items = Siswa::whereHas('absensi', function ($query) use (
        $jadwalId,
        $guruId,
        $periode,
        $tanggal,
        $bulan,
        $tahun,
        $namaKolomTanggal
    ) {

        $query->whereHas('jadwal', function ($q) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $q->where('jadwal_id', $jadwalId);
    } else {
        $q->where('guru_id', $guruId);
    }

});

        if ($periode == 'harian') {
            $query->whereDate($namaKolomTanggal, $tanggal);
        }

        if ($periode == 'bulanan') {
            $query->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
        }

        if ($periode == 'tahunan') {
            $query->whereYear($namaKolomTanggal, $tahun);
        }
    })
    ->withCount([

        'absensi as total_hadir' => function ($q) use (
    $jadwalId,
    $guruId,
    $periode,
    $tanggal,
    $bulan,
    $tahun,
    $namaKolomTanggal
) {

            $q->where('status', 'H');
            $q->whereHas('jadwal', function ($jadwal) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $jadwal->where('jadwal_id', $jadwalId);
    } else {
        $jadwal->where('guru_id', $guruId);
    }

});

            if ($periode == 'harian') {
                $q->whereDate($namaKolomTanggal, $tanggal);
            }

            if ($periode == 'bulanan') {
                $q->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                    ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
            }

            if ($periode == 'tahunan') {
                $q->whereYear($namaKolomTanggal, $tahun);
            }
        },

        'absensi as total_sakit' => function ($q) use (
    $jadwalId,
    $guruId,
    $periode,
    $tanggal,
    $bulan,
    $tahun,
    $namaKolomTanggal
) {

            $q->where('status', 'S');
            $q->whereHas('jadwal', function ($jadwal) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $jadwal->where('jadwal_id', $jadwalId);
    } else {
        $jadwal->where('guru_id', $guruId);
    }

});

            if ($periode == 'harian') {
                $q->whereDate($namaKolomTanggal, $tanggal);
            }

            if ($periode == 'bulanan') {
                $q->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                    ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
            }

            if ($periode == 'tahunan') {
                $q->whereYear($namaKolomTanggal, $tahun);
            }
        },

        'absensi as total_izin' => function ($q) use (
    $jadwalId,
    $guruId,
    $periode,
    $tanggal,
    $bulan,
    $tahun,
    $namaKolomTanggal
) {

            $q->where('status', 'I');
            $q->whereHas('jadwal', function ($jadwal) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $jadwal->where('jadwal_id', $jadwalId);
    } else {
        $jadwal->where('guru_id', $guruId);
    }

});

            if ($periode == 'harian') {
                $q->whereDate($namaKolomTanggal, $tanggal);
            }

            if ($periode == 'bulanan') {
                $q->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                    ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
            }

            if ($periode == 'tahunan') {
                $q->whereYear($namaKolomTanggal, $tahun);
            }
        },

        'absensi as total_alfa' => function ($q) use (
    $jadwalId,
    $guruId,
    $periode,
    $tanggal,
    $bulan,
    $tahun,
    $namaKolomTanggal
) {

            $q->where('status', 'A');
            $q->whereHas('jadwal', function ($jadwal) use ($jadwalId, $guruId) {

    if ($jadwalId) {
        $jadwal->where('jadwal_id', $jadwalId);
    } else {
        $jadwal->where('guru_id', $guruId);
    }

});

            if ($periode == 'harian') {
                $q->whereDate($namaKolomTanggal, $tanggal);
            }

            if ($periode == 'bulanan') {
                $q->whereMonth($namaKolomTanggal, date('m', strtotime($bulan)))
                    ->whereYear($namaKolomTanggal, date('Y', strtotime($bulan)));
            }

            if ($periode == 'tahunan') {
                $q->whereYear($namaKolomTanggal, $tahun);
            }
        },

            ])->get();

        // Menggunakan library barryvdh/laravel-dompdf
        $pdf = \PDF::loadView(
    'guru.rekap-kehadiran.pdf',
    compact(
        'items',
        'jadwals',
        'user',
        'tanggal',
        'bulan',
        'tahun',
        'periode'
    )
);
        return $pdf->stream('Rekap_Kehadiran_' . $tanggal . '.pdf');
    }
}