<?php

namespace App\Http\Controllers;

use App\Models\DataBalita;
use App\Models\DataIbuHamil;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Models\DataPeriksaIbuHamil;
use App\Models\DataObat;
use App\Models\DataPeriksaBalita;
use Illuminate\Validation\Rule;
use Carbon\Carbon;

class DataLaporanController extends Controller
{
    public function index()
    {
        // Penggabungan data nama ibu dan nama ayah agar tidak tertumpuk menggunakan groupby
        $dataIbuHamil = DataIbuHamil::select('nama_ibu', 'nama_ayah', 'alamat', 'id', 'status_ibu', 'status_ayah')
            ->orderBy('id', 'desc')
            ->whereIn('id', function ($query) {
                $query->select(DB::raw('MAX(id)'))
                    ->from('data_ibu_hamil')
                    ->groupBy('nama_ibu', 'nama_ayah');
            })
            ->get();

        return view('pages.data_laporan.index', [
            "title" => "Data Laporan",
            "heading" => "Data Laporan",
            'dataIbuHamil' => $dataIbuHamil,
        ]);
    }



    public function destroy($id)
    {
        // Mencari data dari tabel data ibu hamil berdasarkan id yang didapat
        $data = DataIbuHamil::findOrFail($id);

        // Mengambil seluruh data nama ibu dan nama ayah dan disimpan ke variabel sameNameData
        $sameNameData = DataIbuHamil::where('nama_ibu', $data->nama_ibu)
            ->where('nama_ayah', $data->nama_ayah)
            ->get();
        // Memasukkan id yang diambil dari variabel $sameNameData dan dijadikan array
        $sameNameIds = $sameNameData->pluck('id')->toArray();

        // Menghapus data balita berdasarkan id yang dimasukkan ke array
        DataBalita::where('ibu_hamil_id', $sameNameIds)->delete();

        // Menghapus data Ibu Hamil berdasarkan nama ibu dan ayah
        DataIbuHamil::where([
            'nama_ibu' => $data->nama_ibu,
            'nama_ayah' => $data->nama_ayah
        ])->delete();

        // Setelah proses penghapusan berhasil maka akan diarahkan ke halaman /data_pasien
        return redirect('/data_pasien')->with('success', 'Data Ibu ' . $data->nama_ibu . ' Berhasil Dihapus');
    }

    public function preview($id)
    {
        // Mencari data dari model DataIbuHamil berdasarkan id yang didapat
        $prev = DataIbuHamil::findOrFail($id);

        // Mencari data ibuhamil dari model DataIbuHamil berdasarkan nama ibu dan nama ayah dengan $prev
        $status_hamil = DataIbuHamil::where([
            'nama_ibu' => $prev->nama_ibu,
            'nama_ayah' => $prev->nama_ayah
        ])->get();

        // Mencari data balita dari model DataBalita berdasarkan nama ibu hamil id
        $data_balita = DataBalita::where('ibu_hamil_id', $id)->get();

        // Cari data dengan nama_ibu dan nama_ayah yang sama dengan $prev
        $sameNameData = DataIbuHamil::where('nama_ibu', $prev->nama_ibu)
            ->where('nama_ayah', $prev->nama_ayah)
            ->get();

        // Ambil ID dari semua data yang memiliki nama_ibu dan nama_ayah yang sama lalu dimasukkan ke array
        $sameNameIds = $sameNameData->pluck('id')->toArray();

        // Hitung total balita berdasarkan ibu_hamil_id yang ditemukan dan yang tidak memiliki status 'Belum Dilahirkan'
        $total_balita = DataBalita::whereIn('ibu_hamil_id', $sameNameIds)
            ->whereNotIn('status', ['Belum Dilahirkan'])
            ->count();

        // Hitung total balita meninggal berdasarkan ibu_hamil_id yang ditemukan dan yang memiliki status 'Meninggal'
        $total_balita_meninggal = DataBalita::whereIn('ibu_hamil_id', $sameNameIds)
            ->where('status', 'Meninggal')
            ->count();

        // Mengambil data nama balita berdasarkan ibu_hamil_id yang ditemukan dan yang tidak memiliki status 'Belum Dilahirkan'
        $nama_balita = DataBalita::whereIn('ibu_hamil_id', $sameNameIds)
            ->whereNotIn('status', ['Belum Dilahirkan'])
            ->get();


        return view('pages.data_laporan.action.preview', [
            "title" => "Data Laporan Preview",
            "heading" => "Data Profile",
            "data" => $prev,
            "heading2" => "Profile Ibu",
            "jumlah_anak" => $total_balita,
            "data_bayi" => $data_balita,
            "data_balita" => $nama_balita,
            "jumlah_balita_meninggal" => $total_balita_meninggal,
            "status_hamil" => $status_hamil,
        ]);
    }

    public function update_ibu_hamil(Request $request, $id)
    {
        $data = DataIbuHamil::find($id);

        $customMessages = [
            'required' => 'Kolom :attribute wajib diisi.',
            'min' => 'Kolom :attribute minimal harus :min karakter.',
            'max' => 'Kolom :attribute maksimal harus :max karakter.',
            'unique' => ':attribute telah terdaftar',
        ];

        $validatedData = $request->validate([
            'nik_ibu' => [
                'required',
                'max:255',
                // Rule::unique('data_ibu_hamil')->ignore($id),
            ],
            'nama_ibu' => 'required|max:255',
            'tanggal_lahir_ibu' => 'required|max:255',
            'tanggal_lahir_ayah' => 'required|max:255',
            // 'umur_ibu' => 'required|max:255',
            'nama_ayah' => 'required|max:255',
            // 'umur_ayah' => 'required|max:255',
            'alamat' => 'required|max:255',
            'status_ibu' => 'required|max:255',
            'status_ayah' => 'required|max:255',
        ], $customMessages);

        if ($request->nik_ibu !== $data->nik_ibu) {
            $request->validate([
                'nik_ibu' => [
                    Rule::unique('data_ibu_hamil'),
                ],
            ], ['nik_ibu.unique' => 'NIK Ibu telah terdaftar']);
        }

        $nama_ibu = $data->nama_ibu;
        $nama_ayah = $data->nama_ayah;

        $tanggalLahirIbu = Carbon::parse($request->input('tanggal_lahir_ibu'));
        $usiaIbu = $tanggalLahirIbu->diffInYears(Carbon::now());
        $tanggalLahirAyah = Carbon::parse($request->input('tanggal_lahir_ayah'));
        $usiaAyah = $tanggalLahirAyah->diffInYears(Carbon::now());
        $validatedData['umur_ayah'] = $usiaAyah;

        $validatedData['umur_ibu'] = $usiaIbu;

        DataIbuHamil::where('nama_ibu', $nama_ibu)
            ->where('nama_ayah', $nama_ayah)
            ->update($validatedData);

        return redirect('/data_pasien/' . $id)->with('success', 'Biodata Ibu ' . $data->nama_ibu . ' Berhasil di Update');
    }

    public function destroy_hamil_ke($id)
    {
        // Mencari data dari tabel data ibu hamil berdasarkan id yang didapat
        $data = DataIbuHamil::findOrFail($id);

        // Menghapus data balita berdasarkan id yang didapat dari $data
        DataBalita::where('ibu_hamil_id', $data->id)->delete();

        // Menghapus data Ibu Hamil berdasarkan nama ibu dan ayah yang didapat dari $data
        DataIbuHamil::where('id', $data->id)->delete();

        // Setelah proses penghapusan berhasil maka akan diarahkan ke halaman /data_pasien
        return redirect('/data_pasien/')->with('success', 'Data hamil ke ' . $data->anak_ke . ' dari Ibu ' . $data->nama_ibu . ' Berhasil Dihapus');
    }
    public function destroy_status_ibu_hamil($id)
    {
        // Mencari data dari tabel data ibu hamil berdasarkan id yang didapat
        $data = DataPeriksaIbuHamil::findOrFail($id);

        // Menghapus data balita berdasarkan id yang didapat dari $data
        DataPeriksaIbuHamil::where('id', $data->id)->delete();

        // Setelah proses penghapusan berhasil maka akan diarahkan ke halaman /data_pasien
        return redirect('/data_pasien/' . $data->ibu_hamil_id . '/laporan_ibu_hamil')->with('success', 'Data hamil ke ' . $data->anak_ke . ' dari Ibu ' . $data->nama_ibu . ' Berhasil Dihapus');
    }

    public function update_ibu_hamilv2(Request $request, $id)
    {
        $data = DataIbuHamil::find($id);

        $customMessages = [
            'required' => 'Kolom :attribute wajib diisi.',
            'min' => 'Kolom :attribute minimal harus :min karakter.',
            'max' => 'Kolom :attribute maksimal harus :max karakter.',
            'unique' => ':attribute telah terdaftar',

        ];

        $validatedData = $request->validate([
            'nik_ibu' => [
                'required',
                'max:255',
                // Rule::unique('data_ibu_hamil')->ignore($id),
            ],
            'nama_ibu' => 'required|max:255',
            'tanggal_lahir_ibu' => 'required|max:255',
            'tanggal_lahir_ayah' => 'required|max:255',
            // 'umur_ibu' => 'required|max:255',
            'nama_ayah' => 'required|max:255',
            // 'umur_ayah' => 'required|max:255',
            'alamat' => 'required|max:255',
            'status_ibu' => 'required|max:255',
            'status_ayah' => 'required|max:255',

        ], $customMessages);

        if ($request->nik_ibu !== $data->nik_ibu) {
            $request->validate([
                'nik_ibu' => [
                    Rule::unique('data_ibu_hamil'),
                ],
            ], ['nik_ibu.unique' => 'NIK Ibu telah terdaftar']);
        }

        $nama_ibu = $data->nama_ibu;
        $nama_ayah = $data->nama_ayah;

        $tanggalLahirIbu = Carbon::parse($request->input('tanggal_lahir_ibu'));
        $usiaIbu = $tanggalLahirIbu->diffInYears(Carbon::now());
        $tanggalLahirAyah = Carbon::parse($request->input('tanggal_lahir_ayah'));
        $usiaAyah = $tanggalLahirAyah->diffInYears(Carbon::now());
        $validatedData['umur_ayah'] = $usiaAyah;

        $validatedData['umur_ibu'] = $usiaIbu;

        DataIbuHamil::where('nama_ibu', $nama_ibu)
            ->where('nama_ayah', $nama_ayah)
            ->update($validatedData);

        return redirect('/data_pasien/' . $id . '/laporan_ibu_hamil')->with('success', 'Biodata Ibu ' . $data->nama_ibu . ' Berhasil di Update');
    }
    public function update_ibu_hamilv3(Request $request, $id)
    {
        $data = DataBalita::find($id);

        $customMessages = [
            'required' => 'Kolom :attribute wajib diisi.',
            'max' => 'Kolom :attribute maksimal harus :max karakter.',
            'unique' => ':attribute telah terdaftar',
        ];

        $validatedData = $request->validate([
            'nik_ibu' => [
                'required',
                'max:255',
                // Rule::unique('data_ibu_hamil')->ignore($id),
            ],
            'nama_ibu' => 'required|max:255',
            'tanggal_lahir_ibu' => 'required|max:255',
            'tanggal_lahir_ayah' => 'required|max:255',
            // 'umur_ibu' => 'required|max:255',
            'nama_ayah' => 'required|max:255',
            // 'umur_ayah' => 'required|max:255',
            'alamat' => 'required|max:255',
            'status_ibu' => 'required|max:255',
            'status_ayah' => 'required|max:255',
        ], $customMessages);

        if ($request->nik_ibu !== $data->details->nik_ibu) {
            $request->validate([
                'nik_ibu' => [
                    Rule::unique('data_ibu_hamil'),
                ],
            ], ['nik_ibu.unique' => 'NIK Ibu telah terdaftar']);
        }

        $nama_ibu = $data->details->nama_ibu;
        $nama_ayah = $data->details->nama_ayah;

        $tanggalLahirIbu = Carbon::parse($request->input('tanggal_lahir_ibu'));
        $usiaIbu = $tanggalLahirIbu->diffInYears(Carbon::now());
        $tanggalLahirAyah = Carbon::parse($request->input('tanggal_lahir_ayah'));
        $usiaAyah = $tanggalLahirAyah->diffInYears(Carbon::now());
        $validatedData['umur_ayah'] = $usiaAyah;

        $validatedData['umur_ibu'] = $usiaIbu;

        DataIbuHamil::where('nama_ibu', $nama_ibu)
            ->where('nama_ayah', $nama_ayah)
            ->update($validatedData);

        return redirect('/data_pasien/' . $id . '/laporan_data_balita')->with('success', 'Biodata Ibu ' . $data->nama_ibu . ' Berhasil di Update');
    }

    public function preview_status_ibu_hamil($id)
    {
        $prev = DataIbuHamil::findOrFail($id);

        $status_periksa_ibu_hamil = DataPeriksaIbuHamil::where('ibu_hamil_id', $id)->get();

        $data_balita = DataBalita::where('ibu_hamil_id', $id)->get();

        // Cari data dengan nama_ibu dan nama_ayah yang sama dengan $prev
        $sameNameData = DataIbuHamil::where('nama_ibu', $prev->nama_ibu)
            ->where('nama_ayah', $prev->nama_ayah)
            ->get();

        // Ambil ID dari semua data yang memiliki nama_ibu dan nama_ayah yang sama
        $sameNameIds = $sameNameData->pluck('id')->toArray();

        // Hitung total balita berdasarkan ibu_hamil_id yang ditemukan
        $total_balita = DataBalita::whereIn('ibu_hamil_id', $sameNameIds)
            ->whereNotIn('status', ['Belum Dilahirkan'])
            ->count();

        $total_balita_meninggal = DataBalita::whereIn('ibu_hamil_id', $sameNameIds)
            ->where('status', 'Meninggal')
            ->count();

        return view('pages.data_laporan.laporan_status_hamil.index', [
            "title" => "Data Laporan Preview",
            "heading" => "Data Profile",
            "data" => $prev,
            "heading2" => "Profile Ibu",
            "jumlah_anak" => $total_balita,
            "data_bayi" => $data_balita,
            "jumlah_balita_meninggal" => $total_balita_meninggal,
            "data_vitamin" => DataObat::all(),
            "status_ibu_hamil" => $status_periksa_ibu_hamil
        ]);
    }
    public function edit_status_hamil($id)
    {
        $prev = DataPeriksaIbuHamil::findOrFail($id)->first();
        $prevv2 = DataPeriksaIbuHamil::findOrFail($id);

        return view('pages.data_laporan.laporan_status_hamil.edit', [
            "title" => "Edit Status Hamil",
            "heading" => "Edit Status Periksa Ibu " . $prev->dataIbuhamil->nama_ibu,
            "data" => $prevv2,
            "data_vitamin" => DataObat::all(),

        ]);
    }

    public function store_status_hamil(Request $request, $id)
    {
        $data = DataIbuHamil::find($id);

        $customMessages = [
            'required' => 'Kolom :attribute wajib diisi.',
            'max' => 'Kolom :attribute maksimal harus :max karakter.',
        ];
        $validatedData = $request->validate([
            'anak_ke' => [
                'required',
                'max:255',
                function ($attribute, $value, $fail) use ($request, $data) {
                    $exists = DataIbuHamil::where('nama_ibu', $data->nama_ibu)
                        ->where('nama_ayah', $data->nama_ayah)
                        ->where('anak_ke', $value)
                        ->exists();

                    if ($exists) {
                        $fail('Anak ke' . $request->anak_ke . ' telah terdaftar.');
                    }
                },
            ],
        ], $customMessages);

        $validatedData['nik_ibu'] = $data->nik_ibu;
        $validatedData['nama_ibu'] = $data->nama_ibu;
        $validatedData['tanggal_lahir_ibu'] = $data->tanggal_lahir_ibu;
        $validatedData['umur_ibu'] = $data->umur_ibu;
        $validatedData['nama_ayah'] = $data->nama_ayah;
        $validatedData['umur_ayah'] = $data->umur_ayah;
        $validatedData['alamat'] = $data->alamat;
        $validatedData['status_ibu'] = "Hamil";
        $validatedData['status_ayah'] = $data->status_ayah;

        $newData = DataIbuHamil::create($validatedData);
        $newId = $newData->id;

        // Menambahkan entri baru ke dalam tabel Data Balita
        DataBalita::create([
            'status' => 'Belum Dilahirkan',
            'ibu_hamil_id' => $newId,
        ]);

        return redirect('/data_pasien/' . $newId)->with('success', 'Berhasil Ditambah');
    }

    public function store_status_periksa_hamil(Request $request, $id)
    {
        $data = DataIbuHamil::find($id);

        $customMessages = [
            'required' => 'Kolom :attribute wajib diisi.',
            'max' => 'Kolom :attribute maksimal harus :max',
            'integer' => 'Kolom :attribute harus berupa angka.',
            'between' => 'Kolom :attribute harus di antara :min Bulan dan :max Bulan.',
            'numeric' => 'Kolom :attribute harus berupa angka.',
            'max_value' => 'Kolom :attribute maksimal harus :max. anjay',
            'unique' => ':attribute ' . $request->usia_hamil . ' Bulan telah melakukan pemeriksaan'
        ];

        $validatedData = $request->validate([

            // 'usia_hamil' => [
            //     'required',
            //     'integer',
            //     'between:1,9',
            //     'max:255',
            //     function ($attribute, $value, $fail) use ($request, $data) {
            //         $exists = DataPeriksaIbuHamil::where('ibu_hamil_id', $data->id)
            //             ->where('usia_hamil', $value)
            //             ->exists();

            //         if ($exists) {
            //             $fail('Pada usia hamil ' . $request->usia_hamil . ' bulan telah melakukan pemeriksaan');
            //         }
            //     },
            // ],
            'berat_badan' => 'required|numeric|max:200',
            'created_at' => 'required',
            'tekanan_darah' => 'required|numeric|max:200',
            'keluhan' => 'required|max:255',
            'vitamin_id' => 'required',

        ], $customMessages);
        $currentExaminationDate = new \DateTime($validatedData['created_at']);

        // Cek apakah ada pemeriksaan lain pada bulan yang sama
        $existingExamination = DataPeriksaIbuHamil::where('ibu_hamil_id', $id)
            ->whereYear('created_at', $currentExaminationDate->format('Y'))
            ->whereMonth('created_at', $currentExaminationDate->format('m'))
            ->first();

        if ($existingExamination) {

            return redirect()->back()->withErrors(['created_at' => 'Anda sudah melakukan pemeriksaan pada bulan ini'])->withInput();
        }

        $firstExamination = DataPeriksaIbuHamil::where('ibu_hamil_id', $id)
            ->orderBy('created_at', 'asc')
            ->first();

        $currentExaminationDate = new \DateTime($validatedData['created_at']);

        if ($firstExamination) {
            $firstExaminationDate = new \DateTime($firstExamination->created_at);

            if ($currentExaminationDate < $firstExaminationDate) {
                return redirect()->back()->withErrors(['created_at' => 'Tanggal pemeriksaan tidak boleh sebelum tanggal pemeriksaan pertama'])->withInput();
            }

            $interval = $firstExaminationDate->diff($currentExaminationDate);
            $ageOfPregnancy = $interval->m + 1 + ($interval->y * 12);

            if ($ageOfPregnancy > 9) {

                return redirect()->back()->withErrors(['created_at' => 'Usia kehamilan tidak boleh lebih dari 9 bulan.'])->withInput();
            }
        } else {

            $ageOfPregnancy = 1;
        }

        $validatedData['ibu_hamil_id'] = $id;
        $validatedData['user_id'] = 1;
        $validatedData['usia_hamil'] = $ageOfPregnancy;

        DataPeriksaIbuHamil::create($validatedData);

        return redirect('/data_pasien/' . $id . '/laporan_ibu_hamil')->with('success', 'Data Periksa Ibu ' . $data->nama_ibu . ' Berhasil Ditambah');
    }
    public function update_status_periksa_hamil(Request $request, $id)
    {
        $data = DataPeriksaIbuHamil::find($id);

        $customMessages = [
            'required' => 'Kolom :attribute wajib diisi.',
            'max' => 'Kolom :attribute maksimal harus :max ',
            'integer' => 'Kolom :attribute harus berupa angka.',
            'between' => 'Kolom :attribute harus di antara :min Bulan dan :max Bulan.',
            'numeric' => 'Kolom :attribute harus berupa angka.',
            'max_value' => 'Kolom :attribute maksimal harus :max. anjay',
            'unique' => ':attribute ' . $request->usia_hamil . ' Bulan telah melakukan pemeriksaan'
        ];

        $validatedData = $request->validate([
            // 'usia_hamil' => [
            //     'required',
            //     'integer',
            //     'between:1,9',
            // ],
            'created_at' => 'required',
            'berat_badan' => 'required|numeric|max:200',
            'tekanan_darah' => 'required|numeric|max:200',
            'keluhan' => 'required|max:255',
            'vitamin_id' => 'required',
        ], $customMessages);

        // $exists = DB::table('data_pemeriksaan_ibu_hamil')
        //     ->where('usia_hamil', $request->usia_hamil)
        //     ->where('ibu_hamil_id', $data->ibu_hamil_id)
        //     ->where('id', '!=', $id)
        //     ->exists();

        // if ($exists) {
        //     return redirect()->back()->withErrors([
        //         'usia_hamil' => 'Usia hamil ' . $request->usia_hamil . ' bulan telah melakukan pemeriksaan',
        //     ])->withInput();
        // }



        $validatedData['ibu_hamil_id'] = $data->ibu_hamil_id;

        DataPeriksaIbuHamil::where('id', $data->id)
            ->update($validatedData);

        return redirect('/data_pasien/' . $data->ibu_hamil_id . '/laporan_ibu_hamil')->with('success', 'Data Periksa Ibu ' . $data->nama_ibu . ' Berhasil Ditambah');
    }

    public function update_nama_balita(Request $request, $id)
    {
        $data = DataIbuHamil::find($id);

        $customMessages = [
            'required' => 'Kolom :attribute wajib diisi.',
            'max' => 'Kolom :attribute maksimal harus :max karakter.',
            'unique' => 'NIK sudah digunakan',
        ];

        if ($request->status == 'Meninggal') {
            $validatedData = $request->validate([
                // 'status_nik_balita' => ['required', 'max:255'],
                // 'nik_balita' => [
                //     'nullable',
                //     'max:255',
                //     'required_if:status_nik_balita,Memiliki NIK',
                //     'unique:data_balita',
                //     function ($attribute, $value, $fail) use ($request) {
                //         if ($request->input('status_nik_balita') === 'Memiliki NIK' && empty($value)) {
                //             $fail('Kolom NIK Balita wajib diisi jika Status NIK Balita adalah Memiliki NIK.');
                //         }
                //     }
                // ],
                // 'nama_balita' => 'required|max:255',
                // 'jenis_kelamin' => 'required|max:255',
                // 'tanggal_lahir' => 'required|max:255',
                // 'jam_lahir' => 'required|max:255',
                'status' => 'required|max:255',
            ], $customMessages);

            // Cek apakah nik_balita null atau kosong, jika ya isi dengan "anjay"
            // if (empty($validatedData['nik_balita'])) {
            //     $validatedData['nik_balita'] = 'Belum Memiliki NIK';
            // }

            DataBalita::where('ibu_hamil_id', $data->id)
                ->update($validatedData);
            DataIbuHamil::where('id', $data->id)
                ->update([
                    'status_ibu' => "Sudah Melahirkan"
                ]);

            return redirect('/data_pasien/' . $id)->with('success', 'Data Anak Berhasil di Update');
        } else {
            $validatedData = $request->validate([
                'status_nik_balita' => ['required', 'max:255'],
                'nik_balita' => [
                    'nullable',
                    'max:255',
                    'required_if:status_nik_balita,Memiliki NIK',
                    'unique:data_balita',
                    function ($attribute, $value, $fail) use ($request) {
                        if ($request->input('status_nik_balita') === 'Memiliki NIK' && empty($value)) {
                            $fail('Kolom NIK Balita wajib diisi jika Status NIK Balita adalah Memiliki NIK.');
                        }
                    }
                ],
                'nama_balita' => 'required|max:255',
                'jenis_kelamin' => 'required|max:255',
                'tanggal_lahir' => 'required|max:255',
                'jam_lahir' => 'required|max:255',
                'status' => 'required|max:255',
            ], $customMessages);

            // Cek apakah nik_balita null atau kosong, jika ya isi dengan "anjay"
            if (empty($validatedData['nik_balita'])) {
                $validatedData['nik_balita'] = 'Belum Memiliki NIK';
            }

            DataBalita::where('ibu_hamil_id', $data->id)
                ->update($validatedData);
            DataIbuHamil::where('id', $data->id)
                ->update([
                    'status_ibu' => "Sudah Melahirkan"
                ]);

            return redirect('/data_pasien/' . $id)->with('success', 'Data Anak Berhasil di Update');
        }
    }

    public function update_biodata_balita(Request $request, $id)
    {
        $data = DataBalita::find($id);

        $customMessages = [
            'required' => 'Kolom :attribute wajib diisi.',
            'min' => 'Kolom :attribute minimal harus :min karakter.',
            'max' => 'Kolom :attribute maksimal harus :max karakter.',
            'unique' => ':attribute telah terdaftar',

        ];

        $validatedData = $request->validate([
            'nik_balita' => [
                'required',
                'max:255',
                Rule::unique('data_balita')->ignore($id),
            ],
            'nama_balita' => 'required|max:255',
            'jenis_kelamin' => 'required|max:255',
            'tanggal_lahir' => 'required|max:255',
            'jam_lahir' => 'required|max:255',
            'status' => 'required|max:255',
        ], $customMessages);

        DataBalita::where('id', $data->id)
            ->update($validatedData);

        return redirect('/data_pasien/' . $id . '/laporan_data_balita')->with('success', 'Biodata Balita Berhasil di Update');
    }

    public function preview_laporan_data_balita($id)
    {
        $prev = DataBalita::findOrFail($id);

        // $biodata_keluarga = DataIbuHamil::where('ibu_hamil_id', $id)->get();
        $data_periksa_balita = DataPeriksaBalita::where('balita_id', $prev->id)->get();

        $status_periksa_balita = DataPeriksaBalita::where('balita_id', $id)->get();

        $data_balita = DataBalita::where('ibu_hamil_id', $id)->get();

        // Cari data dengan nama_ibu dan nama_ayah yang sama dengan $prev
        $sameNameData = DataIbuHamil::where('nama_ibu', $prev->nama_ibu)
            ->where('nama_ayah', $prev->nama_ayah)
            ->get();

        // Ambil ID dari semua data yang memiliki nama_ibu dan nama_ayah yang sama
        $sameNameIds = $sameNameData->pluck('id')->toArray();

        // Hitung total balita berdasarkan ibu_hamil_id yang ditemukan
        $total_balita = DataBalita::whereIn('ibu_hamil_id', $sameNameIds)
            ->whereNotIn('status', ['Belum Dilahirkan'])
            ->count();

        $total_balita_meninggal = DataBalita::whereIn('ibu_hamil_id', $sameNameIds)
            ->where('status', 'Meninggal')
            ->count();

        // chart

        $tinggi_balita = [];
        $berat_balita = [];
        foreach ($data_periksa_balita as $periksa) {
            $tanggal_kunjungan = \Carbon\Carbon::parse($periksa->tanggal_kunjungan);
            $bulan_kunjungan = $tanggal_kunjungan->format('F Y');
            $tinggi_balita[$bulan_kunjungan] = number_format($periksa->tinggi_badan, 0);
            $berat_balita[$bulan_kunjungan] = number_format($periksa->berat_badan, 0);
        }

        return view('pages.data_laporan.laporan_periksa_balita.index', [
            "title" => "Data Laporan Preview",
            "heading" => "Data Profile",
            "data" => $prev,
            "heading2" => "Profile Ibu",
            "jumlah_anak" => $total_balita,
            "data_bayi" => $data_balita,
            "jumlah_balita_meninggal" => $total_balita_meninggal,
            "data_vitamin" => DataObat::all(),
            "status_periksa_balita" => $status_periksa_balita,
            "tinggi_badan_balita" => $tinggi_balita,
            "berat_badan_balita" => $berat_balita
        ]);
    }


    public function store_status_periksa_balita(Request $request, $id)
    {
        $data = Databalita::find($id);

        $tanggalLahir = Carbon::parse($data->tanggal_lahir);
        $tgl_balita = $tanggalLahir->format('d F Y');


        $customMessages = [
            'required' => 'Kolom :attribute wajib diisi.',
            'min' => 'Kolom :attribute minimal harus :min',
            'max' => 'Kolom :attribute maksimal harus :max.',
            'unique' => 'Anak ke' . $request->anak_ke . ' telah terdaftar.',
            'usia_balita_tahun.max' => 'Usia balita tidak boleh lebih dari 5 tahun.',
            'usia_balita_bulan.max' => 'Bulan tidak boleh lebih dari 11.',
            'tanggal_kunjungan.unique' => 'Balita sudah melakukan periksa pada bulan :bulan tahun :tahun.',
            'numeric' => 'Kolom :attribute harus berupa angka.',

        ];
        $validatedData = $request->validate([
            'tanggal_kunjungan' => [
                'required',
                'date',
                function ($attribute, $value, $fail) use ($data, $tgl_balita) {
                    // Dapatkan tanggal lahir balita
                    $tanggalLahir = $data->tanggal_lahir;
                    // Periksa apakah tanggal kunjungan lebih kecil dari tanggal lahir
                    if (Carbon::parse($value)->lt($tanggalLahir)) {
                        $fail("Tanggal kunjungan tidak boleh kurang dari tanggal lahir balita. " . $tgl_balita);
                    }
                },
            ],
            // 'usia_balita_tahun' => 'required|min:0|max:5',
            // 'usia_balita_bulan' => 'required|integer|min:0|max:11',
            'tinggi_badan' => 'required|numeric|max:100',
            'berat_badan' => 'required|numeric|max:100',
            'lingkar_kepala_balita' => 'required|numeric|max:60',
            'vitamin_id' => 'required|max:255',
            'imunisasi_id' => 'required|max:255',

        ], $customMessages);


        // // Custom validation untuk tahun dan tanggal v1 {
        // $exists = DB::table('data_pemeriksaan_balita')
        //     ->where('usia_balita_tahun', $request->usia_balita_tahun)
        //     ->where('usia_balita_bulan', $request->usia_balita_bulan)
        //     ->where('balita_id', $data->id)
        //     ->exists();

        // if ($exists) {
        //     return redirect()->back()->withErrors([
        //         'usia_balita_tahun' => 'Usia balita tahun ' . $request->usia_balita_tahun . ' Tahun ' . $request->usia_balita_bulan . ' bulan telah melakukan pemeriksaan',
        //         'usia_balita_bulan' => 'Usia balita tahun ' . $request->usia_balita_tahun . ' Tahun ' . $request->usia_balita_bulan . ' bulan telah melakukan pemeriksaan'
        //     ])->withInput();
        // }
        // // }

        // otomatis tanggal usia periksa balita {
        // Dapatkan tanggal kunjungan dari input
        $tanggalKunjungan = Carbon::parse($validatedData['tanggal_kunjungan']);

        // Hitung usia balita berdasarkan tanggal kunjungan
        $usiaBalita = $tanggalKunjungan->diffInMonths($tanggalLahir);

        // Jika tanggal kunjungan lebih kecil dari tanggal lahir, set usia balita menjadi 0 tahun dan 1 bulan
        if ($tanggalKunjungan->lt($tanggalLahir)) {
            $usiaBalitaTahun = 0;
            $usiaBalitaBulan = 1;
        } else {
            // Hitung usia balita dalam tahun dan bulan
            $usiaBalitaTahun = floor($usiaBalita / 12);
            $usiaBalitaBulan = $usiaBalita % 12;
        }

        // Masukkan hasil perhitungan usia balita ke dalam data validasi
        $validatedData['usia_balita_tahun'] = $usiaBalitaTahun;
        $validatedData['usia_balita_bulan'] = $usiaBalitaBulan;
        // }

        $tanggal_kunjungan = $request->input('tanggal_kunjungan');
        $year = date('Y', strtotime($tanggal_kunjungan));
        $month = date('m', strtotime($tanggal_kunjungan));


        $existingRecord = DataPeriksaBalita::where('balita_id', $data->id)
            ->whereYear('tanggal_kunjungan', $year)
            ->whereMonth('tanggal_kunjungan', $month)
            ->first();

        if ($existingRecord) {
            return back()->withErrors([
                'tanggal_kunjungan' => 'Balita sudah melakukan periksa pada bulan ' . date('F', mktime(0, 0, 0, $month, 10)) . ' tahun ' . $year . '.'
            ])->withInput();
        }

        $validatedData['balita_id'] = $data->id;

        DataPeriksaBalita::create($validatedData);

        return redirect('/data_pasien/' . $data->id . '/laporan_data_balita')->with('success', 'Berhasil Ditambah');
    }

    public function edit_status_periksa_balita($id)
    {
        $prev = DataPeriksaBalita::findOrFail($id);

        return view('pages.data_laporan.laporan_periksa_balita.edit', [
            "title" => "Edit Status Periksa Balita",
            "heading" => "Edit Status Periksa Balita",
            "data" => $prev,
            "data_vitamin" => DataObat::all(),

        ]);
    }

    public function update_status_periksa_balita(Request $request, $id)
    {
        $data = DataPeriksaBalita::find($id);

        $tanggalLahir = Carbon::parse($data->tanggal_lahir);
        $tgl_balita = $tanggalLahir->format('d F Y');

        $customMessages = [
            'required' => 'Kolom :attribute wajib diisi.',
            'max' => 'Kolom :attribute maksimal harus :max karakter.',
            'usia_balita_tahun.max' => 'Usia balita tidak boleh lebih dari 5 tahun.',
            'usia_balita_bulan.max' => 'Bulan tidak boleh lebih dari 11.',
            'numeric' => 'Kolom :attribute harus berupa angka.',
            'tanggal_kunjungan.unique' => 'Balita sudah melakukan periksa pada bulan :bulan tahun :tahun.',
            'numeric' => 'Kolom :attribute harus berupa angka.',
        ];

        $validatedData = $request->validate([
            'tanggal_kunjungan' => [
                'required',
                'date',
                function ($attribute, $value, $fail) use ($data, $tgl_balita) {
                    // Dapatkan tanggal lahir balita
                    $tanggalLahir = $data->tanggal_lahir;
                    // Periksa apakah tanggal kunjungan lebih kecil dari tanggal lahir
                    if (Carbon::parse($value)->lt($tanggalLahir)) {
                        $fail("Tanggal kunjungan tidak boleh kurang dari tanggal lahir balita. " . $tgl_balita);
                    }
                },
            ],
            // 'usia_balita_tahun' => 'required|min:0|max:5',
            // 'usia_balita_bulan' => 'required|integer|min:0|max:11',
            'tinggi_badan' => 'required|numeric|max:100',
            'berat_badan' => 'required|numeric|max:100',
            'lingkar_kepala_balita' => 'required|numeric|max:60',
            'vitamin_id' => 'required|max:255',
            'imunisasi_id' => 'required|max:255',
        ], $customMessages);

        // $exists = DB::table('data_pemeriksaan_balita')
        //     ->where('usia_balita_tahun', $request->usia_balita_tahun)
        //     ->where('usia_balita_bulan', $request->usia_balita_bulan)
        //     ->where('balita_id', $data->balita_id)
        //     ->where('id', '!=', $id)
        //     ->exists();

        // if ($exists) {
        //     return redirect()->back()->withErrors([
        //         'usia_balita_tahun' => 'Usia balita tahun ' . $request->usia_balita_tahun . ' Tahun ' . $request->usia_balita_bulan . ' bulan telah melakukan pemeriksaan',
        //         'usia_balita_bulan' => 'Usia balita tahun ' . $request->usia_balita_tahun . ' Tahun ' . $request->usia_balita_bulan . ' bulan telah melakukan pemeriksaan'
        //     ])->withInput();
        // }

        // Dapatkan tanggal kunjungan dari input
        $tanggalKunjungan = Carbon::parse($validatedData['tanggal_kunjungan']);

        // Hitung usia balita berdasarkan tanggal kunjungan
        $usiaBalita = $tanggalKunjungan->diffInMonths($tanggalLahir);

        // Jika tanggal kunjungan lebih kecil dari tanggal lahir, set usia balita menjadi 0 tahun dan 1 bulan
        if ($tanggalKunjungan->lt($tanggalLahir)) {
            $usiaBalitaTahun = 0;
            $usiaBalitaBulan = 1;
        } else {
            // Hitung usia balita dalam tahun dan bulan
            $usiaBalitaTahun = floor($usiaBalita / 12);
            $usiaBalitaBulan = $usiaBalita % 12;
        }

        // Masukkan hasil perhitungan usia balita ke dalam data validasi
        $validatedData['usia_balita_tahun'] = $usiaBalitaTahun;
        $validatedData['usia_balita_bulan'] = $usiaBalitaBulan;

        $tanggal_kunjungan = $request->input('tanggal_kunjungan');
        $year = date('Y', strtotime($tanggal_kunjungan));
        $month = date('m', strtotime($tanggal_kunjungan));

        $existingRecord = DataPeriksaBalita::where('balita_id', $data->balita_id)
            ->whereYear('tanggal_kunjungan', $year)
            ->whereMonth('tanggal_kunjungan', $month)
            ->where('id', '!=', $id)
            ->first();

        if ($existingRecord) {
            return back()->withErrors([
                'tanggal_kunjungan' => 'Balita sudah melakukan periksa pada bulan ' . date('F', mktime(0, 0, 0, $month, 10)) . ' tahun ' . $year . '.'
            ])->withInput();
        }

        DataPeriksaBalita::where('id', $data->id)
            ->update($validatedData);

        return redirect('/data_pasien/' . $data->balita_id . '/laporan_data_balita')->with('success', 'Data Periksa Balita Berhasil Di Update');
    }

    public function destroy_status_periksa_balita($id)
    {
        // Mencari data dari tabel data ibu hamil berdasarkan id yang didapat
        $data = DataPeriksaBalita::findOrFail($id);

        // Menghapus data balita berdasarkan id yang didapat dari $data
        DataPeriksaBalita::where('id', $data->id)->delete();

        // Setelah proses penghapusan berhasil maka akan diarahkan ke halaman /data_pasien
        return redirect('/data_pasien/' . $data->balita_id . '/laporan_data_balita')->with('success', 'Data Status Periksa Balita Berhasil Dihapus');
    }

    public function cetak($id)
    {
        $prev = DataBalita::findOrFail($id);

        // $biodata_keluarga = DataIbuHamil::where('ibu_hamil_id', $id)->get();
        $data_periksa_balita = DataPeriksaBalita::where('balita_id', $prev->id)->get();

        $status_periksa_balita = DataPeriksaBalita::where('balita_id', $id)->get();

        $data_balita = DataBalita::where('ibu_hamil_id', $id)->get();

        // Cari data dengan nama_ibu dan nama_ayah yang sama dengan $prev
        $sameNameData = DataIbuHamil::where('nama_ibu', $prev->nama_ibu)
            ->where('nama_ayah', $prev->nama_ayah)
            ->get();

        // Ambil ID dari semua data yang memiliki nama_ibu dan nama_ayah yang sama
        $sameNameIds = $sameNameData->pluck('id')->toArray();

        // Hitung total balita berdasarkan ibu_hamil_id yang ditemukan
        $total_balita = DataBalita::whereIn('ibu_hamil_id', $sameNameIds)
            ->whereNotIn('status', ['Belum Dilahirkan'])
            ->count();

        $total_balita_meninggal = DataBalita::whereIn('ibu_hamil_id', $sameNameIds)
            ->where('status', 'Meninggal')
            ->count();

        // chart

        $tinggi_balita = [];
        $berat_balita = [];
        foreach ($data_periksa_balita as $periksa) {
            $tanggal_kunjungan = \Carbon\Carbon::parse($periksa->tanggal_kunjungan);
            $bulan_kunjungan = $tanggal_kunjungan->format('F Y');
            $tinggi_balita[$bulan_kunjungan] = number_format($periksa->tinggi_badan, 0);
            $berat_balita[$bulan_kunjungan] = number_format($periksa->berat_badan, 0);
        }

        return view('pages.data_laporan.laporan_periksa_balita.cetak', [
            "title" => "anjay Data Laporan Preview",
            "heading" => "Data Profile",
            "data" => $prev,
            "heading2" => "Profile Ibu",
            "jumlah_anak" => $total_balita,
            "data_bayi" => $data_balita,
            "jumlah_balita_meninggal" => $total_balita_meninggal,
            "data_vitamin" => DataObat::all(),
            "status_periksa_balita" => $status_periksa_balita,
            "tinggi_badan_balita" => $tinggi_balita,
            "berat_badan_balita" => $berat_balita
        ]);
    }
}
