<?php

namespace App\Controllers;

use App\Models\Penilaian_model;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Style\Fill;

class Penilaian extends BaseController
{
    public function __construct()
    {
        $this->Penilaian_model = new Penilaian_model();
    }
    private $Penilaian_model;
    public function index()
    {
        // $ceklogin = cekLogin();
        // if ($ceklogin) return $ceklogin;
        // $user = getUserInfo();
        $setting = $this->appSetting();
        $data = [
            // 'nama_user' => $user->nama,
            'setting' => $setting,
            'title' => 'Nilai Akhir'
        ];
        return view('Admin/Penilaian/nilaiakhir', $data);
    }
    public function getTujuan($idpembelajaran)
    {
        $exec = $this->Penilaian_model->get_where_tujuan(['id_pembelajaran' => $idpembelajaran]);

        return $this->response->setJSON($exec);
    }

    public function savePenilaian()
    {

        $request = $this->request;
        $nilaiArray = $request->getPost('nilai');
        $tujuanArray = $request->getPost('tujuan');
        $idpembelajaran = $request->getPost('idpembelajaran');
        // Lakukan validasi atau proses lain sesuai kebutuhan
        // Simpan data nilai dan switch ke database menggunakan model
        foreach ($nilaiArray as $idSiswa => $nilai) {
            $tujuanTercapai = isset($tujuanArray[$idSiswa]['tercapai']) ? implode(',', $tujuanArray[$idSiswa]['tercapai']) : '';
            $tujuanTidakTercapai = isset($tujuanArray[$idSiswa]['tidak_tercapai']) ? implode(',', $tujuanArray[$idSiswa]['tidak_tercapai']) : '';
            $where = ['id_siswa' => $idSiswa, 'id_pembelajaran' => $idpembelajaran];
            $ceksiswa = $this->Penilaian_model->get_where_penilaian($where);
            if (!$ceksiswa) {
                $this->Penilaian_model->penilaian_add([
                    'id_pembelajaran' => $idpembelajaran,
                    'id_siswa' => $idSiswa,
                    'nilai_akhir' => $nilai,
                    'tujuan_tercapai' => $tujuanTercapai,
                    'tujuan_belum' => $tujuanTidakTercapai,
                    'tahunpelajaran' => $this->appSetting()->tahunpelajaran
                ]);
            } else {
                $this->Penilaian_model->penilaian_update($where, ['nilai_akhir' => $nilai, 'tujuan_tercapai' => $tujuanTercapai, 'tujuan_belum' => $tujuanTidakTercapai]);
            }
        }

        // Kirim respons ke client
        return $this->response->setJSON(['status' => 'success', 'message' => 'Data berhasil disimpan']);
    }

    public function saveCapaian()
    {

        $idpembelajaran = $this->request->getPost('idpembelajaran');
        $dataToUpdate = $this->request->getPost('dataToUpdate');

        foreach ($dataToUpdate as $data) {
            $id_siswa = $data['id_siswa'];
            $deskripsi_tercapai = $data['deskripsi_tercapai'];
            $deskripsi_belum = $data['deskripsi_belum'];

            // Update deskripsi tercapai dan belum tercapai dalam database
            $this->Penilaian_model->penilaian_update(['id_siswa' => $id_siswa, 'id_pembelajaran' => $idpembelajaran], ['deskripsi_tercapai' => $deskripsi_tercapai, 'deskripsi_belum' => $deskripsi_belum]);
        }


        // Kirim respons ke client
        return $this->response->setJSON(['status' => 'success', 'message' => 'Data berhasil disimpan']);
    }


    public function getPembelajaran()
    {
        $exec = $this->Penilaian_model->get_all_pembelajaran($this->appSetting()->tahunpelajaran, cekRoleid());
        $data['data'] = $exec;
        return $this->response->setJSON($data);
    }
    public function getSiswa($rombel, $idp)
    {
        $siswa = $this->Penilaian_model->get_penilaian_siswa($rombel, $idp, $this->appSetting()->tahunpelajaran);
        return $this->response->setJSON($siswa);
    }
    public function getCapaian($idp)
    {
        $siswa = $this->Penilaian_model->get_capaian_siswa($idp, $this->appSetting()->tahunpelajaran);
        return $this->response->setJSON($siswa);
    }



    public function edit($id)
    {
        $data = $this->Penilaian_model->get_by_id($id);
        echo json_encode($data);
    }

    public function resetCapaian()
    {
        $idpem = $this->request->getPost('idpem');
        $data = array(
            'deskripsi_tercapai' => "",
            'deskripsi_belum' => "",
        );

        $exec = $this->Penilaian_model->penilaian_update(['id_pembelajaran' => $idpem], $data);

        if ($exec) {
            return $this->response->setJSON(['success' => true, 'message' => 'Reset successfully']);
        } else {
            return $this->response->setJSON(['success' => false, 'message' => 'Tidak ada data yang mengalami perubahan']);
        }
    }


    public function delete($id)
    {
        $user = $this->Penilaian_model->find($id);

        if ($user) {
            $this->Penilaian_model->delete($id);
            return $this->response->setJSON(['success' => true, 'message' => 'User deleted successfully']);
        } else {
            return $this->response->setStatusCode(404)->setJSON(['success' => false, 'message' => 'User not found']);
        }
    }

    //============= LEGER NILAI =================
    public function indexLeger()
    {
        // $ceklogin = cekLogin();
        // if ($ceklogin) return $ceklogin;
        // $user = getUserInfo();
        $setting = $this->appSetting();
        $data = [
            // 'nama_user' => $user->nama,
            'setting' => $setting,
            'title' => 'Leger Nilai'
        ];
        return view('Admin/Penilaian/legernilai', $data);
    }
    public function getLegerSiswa($idrombel)
    {
        $siswa = $this->Penilaian_model->get_siswa($idrombel, $this->appSetting()->tahunpelajaran);
        return $this->response->setJSON($siswa);
    }
    public function getRombel()
    {
        $siswa = $this->Penilaian_model->get_rombel($this->appSetting()->tahunpelajaran);
        return $this->response->setJSON($siswa);
    }
    public function exporExcel($idrombel)
    {
        // Ambil data dari database atau dari sumber lainnya
        $data = $this->Penilaian_model->get_siswa($idrombel, $this->appSetting()->tahunpelajaran); // Fungsi untuk mendapatkan data
        // Mengonversi objek menjadi array
        $data = json_decode(json_encode($data), true);

        // Hitung jumlah kolom pembelajaran
        $jumlah_pembelajaran = count($data['pembelajaran']);

        // Buat objek Spreadsheet
        $spreadsheet = new Spreadsheet();

        // Tambahkan data ke dalam sheet Excel
        $sheet = $spreadsheet->getActiveSheet();

        // Judul tabel
        $judul_kolom = 'LEGER NILAI PEMBELAJARAN';
        $sheet->setCellValue('A1', $judul_kolom);
        $sheet->mergeCells('A1:' . $this->getColumnLetter($jumlah_pembelajaran + 6) . '1'); // Menggabungkan sel untuk judul
        $sheet->getStyle('A1:' . $this->getColumnLetter($jumlah_pembelajaran + 6) . '1')->getFont()->setBold(true)->setSize(14);
        $sheet->getStyle('A1:' . $this->getColumnLetter($jumlah_pembelajaran + 6) . '1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);

        // Kolom No
        $sheet->setCellValue('A2', 'No');
        $sheet->getStyle('A2')->getFont()->setBold(true);
        $sheet->setCellValue('B2', 'Nama Siswa');
        $sheet->getStyle('B2')->getFont()->setBold(true);
        $sheet->setCellValue('C2', 'Nama Rombel');
        $sheet->getStyle('C2')->getFont()->setBold(true);

        // Tambahkan header pembelajaran
        $column = 'D';
        foreach ($data['pembelajaran'] as $pembelajaran) {
            $sheet->setCellValue($column . '2', $pembelajaran['nama_matapelajaran']);
            $sheet->getStyle($column . '2')->getFont()->setBold(true);
            $column++;
        }

        // Tambahkan header absensi
        $sheet->setCellValue($column . '2', 'Sakit');
        $sheet->getStyle($column . '2')->getFont()->setBold(true);
        $sheet->setCellValue(++$column . '2', 'Ijin');
        $sheet->getStyle($column . '2')->getFont()->setBold(true);
        $sheet->setCellValue(++$column . '2', 'Alfa');
        $sheet->getStyle($column . '2')->getFont()->setBold(true);

        // Auto width kolom Nama Siswa
        $sheet->getColumnDimension('A')->setAutoSize(true);
        $sheet->getColumnDimension('B')->setAutoSize(true);

        // Data siswa
        $row = 3;
        $no = 1;
        foreach ($data['siswa'] as $siswa) {
            $sheet->setCellValue('A' . $row, $no++);
            $sheet->setCellValue('B' . $row, $siswa['nama']);
            $sheet->setCellValue('C' . $row, $siswa['nama_rombel']);

            // Loop untuk menambahkan nilai atau X untuk setiap pembelajaran
            $column = 'D';
            foreach ($data['pembelajaran'] as $pembelajaran) {
                $nilai = 'X'; // Nilai default
                foreach ($siswa['penilaian'] as $penilaian) {
                    if ($penilaian['id_pembelajaran'] == $pembelajaran['id_pembelajaran']) {
                        $nilai = $penilaian['nilai_akhir']; // Gunakan nilai dari penilaian jika ada
                        break;
                    }
                }
                $sheet->setCellValue($column++ . $row, $nilai);
            }

            // Tambahkan data absensi
            $absensi = $siswa['absensi'][0]; // Ambil data absensi pertama (asumsi hanya satu data absensi)
            $sheet->setCellValue($column++ . $row, $absensi['sakit']);
            $sheet->setCellValue($column++ . $row, $absensi['ijin']);
            $sheet->setCellValue($column++ . $row, $absensi['alfa']);

            $row++;
        }


        // Set judul file
        $filename = 'Leger_Nilai_' . $this->appSetting()->tahunpelajaran . '.xlsx';

        // Set header untuk file Excel
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="' . $filename . '"');
        header('Cache-Control: max-age=0');

        // Panggil writer untuk menulis ke file Excel
        $writer = new Xlsx($spreadsheet);
        $writer->save('php://output');

        exit(); // Panggil exit setelah menyimpan file Excel
    }

    // Kemudian, gunakan fungsi getColumnLetter di dalam kode Anda:
    private function getColumnLetter($columnNumber)
    {
        return Coordinate::stringFromColumnIndex($columnNumber);
    }

    // Metode untuk mendapatkan data (dapat disesuaikan dengan kebutuhan Anda)
    private function getData()
    {
        // Ambil data dari database atau dari sumber lainnya
        // Misalnya, Anda dapat menggunakan model untuk mengambil data siswa, pembelajaran, dan absensi dari database
        // Return data dalam bentuk array
    }
}
