<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\SiswaPresensi;
use App\AkdSiswa;
use Carbon\Carbon;
use DB;
use App\Library\Firebase;

class SiswaPresensiController extends Controller
{
    protected $firebase;
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
        $this->firebase = new Firebase();
    }

    //
    public function getAllAbsenSiswa(){
        $absenSiswa = DB::table('siswa_presensi_utama as a')
        ->join('akd_siswa as b', 'a.fk_siswa', '=', 'b.pk_siswa')
        ->select('a.pk_presensi', 'a.fk_siswa', 'b.no_induk', 
        'b.nisn', 'b.nama_siswa', 
        'b.jenis_kelamin', 'a.kd_sekolah', 
        'a.jam_datang', 'a.jam_pulang', 'a.tanggal_absen',
        'a.lat', 'a.long')
        ->orderBy('a.tanggal_absen', 'desc')
        ->get();

        if(!$absenSiswa->isEmpty()){
            return response()->json(['error' => false, 
            'message' => 'Sukses mendapat daftar absen',
            'presensi' => $absenSiswa]);
        } else {
            return response()->json(['error' => true, 
            'message' => 'Daftar absen kosong',
            'presensi' => null]);
        }
    }

    public function checkPresensi($fkSiswa, $tanggalAbsen)
    {
        $presensiDatang = SiswaPresensi::where('fk_siswa', $fkSiswa)
        ->where('tanggal_absen', $tanggalAbsen)
        ->whereNotNull('jam_datang')
        ->first();

        if($presensiDatang){
            return response()->json([
                'status' => 'pulang'
            ]);
        } else {
            return response()->json([
                'status' => 'datang'
            ]);
        }
    }

    public function checkPresensiPkl($fkSiswa, $tanggalAbsen)
    {
        $presensiDatang = DB::table('siswa_presensi_pkl')
        ->where('fk_siswa', $fkSiswa)
        ->where('tanggal_absen', $tanggalAbsen)
        ->whereNotNull('jam_datang')
        ->first();

        if($presensiDatang){
            return response()->json([
                'status' => 'pulang'
            ]);
        } else {
            return response()->json([
                'status' => 'datang'
            ]);
        }
    }

    //fungsi test koneksi firebase
    public function index(){
        return $this->firebase->testConnection();
    }

    //Fungsi untuk laporan absen per siswa
    public function prepareLaporanSiswa($fkSiswa){
        $laporan = DB::table('siswa_presensi_utama')
            ->select(DB::raw('pk_presensi, fk_siswa, tanggal_absen, MONTH(tanggal_absen) as bulan, YEAR(tanggal_absen) as tahun, jam_datang, jam_pulang'))
            ->where('fk_siswa', $fkSiswa)
            ->get();

        if(!$laporan->isEmpty()){
            return response()->json([
                'error' => false,
                'message' => 'Daftar laporan ditemukan',
                'laporan' => $laporan
            ]);
        } else {
            return response()->json([
                'error' => true,
                'message' => 'Daftar laporan tidak ditemukan',
                'laporan' => null
            ]);
        }
    }

    public function filterLaporanSiswa($fkSiswa, $bulan, $tahun){
        $filterLaporan = DB::table('siswa_presensi_utama')
            ->select(DB::raw('pk_presensi, fk_siswa, 
            tanggal_absen,  MONTH(tanggal_absen) as bulan, YEAR(tanggal_absen) as tahun, jam_datang, jam_pulang'))
            ->where('fk_siswa', $fkSiswa)
            ->whereRaw('MONTH(tanggal_absen) = ?', [$bulan])
            ->whereRaw('YEAR(tanggal_absen) = ?', [$tahun])
            ->orderBy('tanggal_absen', 'desc')
            ->get();
        
        if(!$filterLaporan->isEmpty()){
            return response()->json([
                'error' => false,
                'message' => 'Daftar filter laporan ditemukan',
                'laporan' => $filterLaporan
            ]);
        } else {
            return response()->json([
                'error' => true,
                'message' => 'Daftar filter laporan tidak ditemukan',
                'laporan' => null
            ]);
        }
    }

    public function filterLaporanPkl($fkSiswa, $bulan, $tahun){
        $filterLaporan = DB::table('siswa_presensi_pkl')
            ->select(DB::raw('pk_presensi, kd_dudi, fk_siswa, 
            tanggal_absen,  MONTH(tanggal_absen) as bulan, YEAR(tanggal_absen) as tahun, jam_datang, jam_pulang'))
            ->where('fk_siswa', $fkSiswa)
            ->whereRaw('MONTH(tanggal_absen) = ?', [$bulan])
            ->whereRaw('YEAR(tanggal_absen) = ?', [$tahun])
            ->orderBy('tanggal_absen', 'desc')
            ->get();
        
        if(!$filterLaporan->isEmpty()){
            return response()->json([
                'error' => false,
                'message' => 'Daftar filter laporan pkl ditemukan',
                'laporan' => $filterLaporan
            ]);
        } else {
            return response()->json([
                'error' => true,
                'message' => 'Daftar filter laporan pkl tidak ditemukan',
                'laporan' => null
            ]);
        }
    }

    public function inputAbsen(Request $request){
        $validator = Validator::make($request->all(),[
            'fk_siswa' => 'required',
            'kd_sekolah' => 'required',
            'jam_absen' => 'required',
            'tanggal_absen' => 'required',
            'lat' => 'required',
            'long' => 'required'
        ]);

        if($validator->fails()){
            return response()->json([
                'error' => true,
                'action' => 'validator_error',
                'message' => 'Ups ada kekurangan data / field'
            ]);
        } else {
            $tanggalGlobal = Carbon::now('Asia/Jakarta')->format('Y-m-d');
            $jamGlobal = Carbon::parse(Carbon::now('Asia/Jakarta')->format('H:i'));
            $formattedJamAbsen = Carbon::parse($request->input('jam_absen'));
            $jamMasuk = Carbon::parse("07:00");

            if($request->input('tanggal_absen') == $tanggalGlobal && $jamGlobal->diffInMinutes($formattedJamAbsen) < 5) {
                $siswa = AkdSiswa::where("pk_siswa", $request->input('fk_siswa'))->first();
                $idSiswa = $siswa->pk_siswa;
                $namaSiswa = $siswa->nama_siswa;

                $ortuSiswa = DB::table('akd_siswa as a')
                    ->join('ortu_users as b', 'a.pk_siswa', '=', 'b.fk_siswa')
                    ->join('device_users as c', 'c.ortu_id', '=', 'b.pk_ortu')
                    ->where('a.pk_siswa', $siswa->pk_siswa)
                    ->select('c.user_device_id as device_ortu')
                    ->get();

                $arrayOrtu = json_decode($ortuSiswa, true);
                $targetArray = array();

                foreach ($arrayOrtu as $key => $value) {
                    array_push($targetArray, $value['device_ortu']);
                }
                $fixTarget = implode(", ", $targetArray);

                $notifDatang = 'Bpk/Ibu yg terhormat,siswa dgn nama '.$namaSiswa.' telah melakukan presensi masuk sekolah pada :'.$request->input('tanggal_absen').' '.$request->input('jam_absen').PHP_EOL.'Terimakasih';

                $notifPulang = 'Bpk/Ibu yg terhormat,siswa dgn nama '.$namaSiswa.' telah selesai mengikuti pembelajaran sekolah pada :'.$request->input('tanggal_absen').' '.$request->input('jam_absen').PHP_EOL.'Terimakasih';

                $cekPresensi = SiswaPresensi::where('tanggal_absen', $request->input('tanggal_absen'))
                    ->where('fk_siswa', $request->input('fk_siswa'))
                    ->whereNotNull('jam_datang')
                    ->first();
                
                //jika cekPresensi terdapat satu baris data
                //maka lakukan update 
                if($cekPresensi){
                    //untuk mengecek apakah siswa yang absen di jam pulang sudah ada datanya
                    //atau tidak
                    $cekPresensiPulang = DB::table('siswa_presensi_utama')
                        ->where('fk_siswa', $request->input('fk_siswa'))
                        ->where('tanggal_absen', $request->input('tanggal_absen'))
                        ->whereNotNull('jam_pulang')
                        ->first();
                    
                    //Jika ada datanya maka mahasiswa tidak bisa input absen di tanggal yang sama
                    if($cekPresensiPulang){
                        $updateJamPulang = new SiswaPresensi;
                    
                        $updateJamPulang->where('fk_siswa', $request->input('fk_siswa'))
                            ->where('tanggal_absen', $request->input('tanggal_absen'))
                            ->update([
                                'jam_pulang' => $request->input('jam_absen'),
                                'updated_time' => Carbon::now()->toDateTimeString(),
                                'lokasi_pulang' => $request->input('lat').', '.$request->input('long')
                            ]); 

                        if($updateJamPulang){
                            $this->firebase->sendNotification(
                                'Pemberitahuan',
                                $notifPulang,
                                $fixTarget,
                                $request->input('tanggal_absen'),
                                'absen_pulang'
                            );

                            return response()->json([
                                'error' => false,
                                'action' => 'update_second',
                                'message' => 'update absen sukses'
                            ]);
                        } else {
                            return response()->json([
                                'error' => true,
                                'action' => 'fail_update',
                                'message' => 'update absen gagal'
                            ]);
                        }
                    } else { //jika belum maka lakukan update absen di field jam_pulang
                        $updateJamPulang = new SiswaPresensi;

                        $updateJamPulang->where('fk_siswa', $request->input('fk_siswa'))
                            ->where('tanggal_absen', $request->input('tanggal_absen'))
                            ->update([
                                'jam_pulang' => $request->input('jam_absen'),
                                'updated_time' => Carbon::now()->toDateTimeString(),
                                'lokasi_pulang' => $request->input('lat').', '.$request->input('long')
                            ]);
                        
                        if($updateJamPulang){
                            $this->firebase->sendNotification(
                                'Pemberitahuan',
                                $notifPulang,
                                $fixTarget,
                                $request->input('tanggal_absen'),
                                'absen_pulang'
                            );
                            return response()->json([
                                'error' => false,
                                'action' => 'update',
                                'message' => 'update absen sukses'
                            ]);
                        } else {
                            return response()->json([
                                'error' => true,
                                'action' => 'fail_update',
                                'message' => 'update absen gagal'
                            ]);
                        }
                    }
                } else { 
                    //jika tidak maka lakukan insert data
                    $inputAbsen = DB::table('siswa_presensi_utama')->insert([
                        'fk_siswa' => $request->input('fk_siswa'),
                        'kd_sekolah' => $request->input('kd_sekolah'),
                        'jam_datang' => $request->input('jam_absen'),
                        'tanggal_absen' => $request->input('tanggal_absen'),
                        'lat' => $request->input('lat'),
                        'long' => $request->input('long'),
                        'updated_time' => Carbon::now()->toDateTimeString(),
                        'lokasi_datang' => $request->input('lat').', '.$request->input('long')
                    ]);

                    if($inputAbsen){
                        $this->firebase->sendNotification(
                            'Pemberitahuan',
                            $notifDatang,
                            $fixTarget,
                            $request->input('tanggal_absen'),
                            'absen_datang'
                        );
                        return response()->json([
                            'error' => false, 
                            'action' => 'input',
                            'message' => 'input absen sukses'
                        ]);
                    } else {
                        return response()->json([
                            'error' => true, 
                            'action' => 'fail_input',
                            'message' => 'input absen gagal'
                        ]);
                    }
                }
            } else {
                return response()->json([
                    'error' => true, 
                    'action' => 'fail_input',
                    'message' => 'input absen gagal'
                ]);
            }
        }
    }

    public function inputAbsenPkl(Request $request){
        $validator = Validator::make($request->all(),[
            'fk_siswa' => 'required',
            'kd_dudi' => 'required',
            'jam_absen' => 'required',
            'tanggal_absen' => 'required',
            'lat' => 'required',
            'long' => 'required'
        ]);

        if($validator->fails()){
            return response()->json([
                'error' => true,
                'action' => 'validator_error',
                'message' => 'Ups ada kekurangan data / field'
            ]);
        } else {
            $tanggalGlobal = Carbon::now('Asia/Jakarta')->format('Y-m-d');
            $jamGlobal = Carbon::parse(Carbon::now('Asia/Jakarta')->format('H:i'));
            $formattedJamAbsen = Carbon::parse($request->input('jam_absen'));

            if($request->input('tanggal_absen') == $tanggalGlobal && $jamGlobal->diffInMinutes($formattedJamAbsen) < 2){
                $siswa = AkdSiswa::where("pk_siswa", $request->input('fk_siswa'))->first();
                $idSiswa = $siswa->pk_siswa;
                $namaSiswa = $siswa->nama_siswa;

                $ortuSiswa = DB::table('akd_siswa as a')
                    ->join('ortu_users as b', 'a.pk_siswa', '=', 'b.fk_siswa')
                    ->join('device_users as c', 'c.ortu_id', '=', 'b.pk_ortu')
                    ->where('a.pk_siswa', $siswa->pk_siswa)
                    ->select('c.user_device_id as device_ortu')
                    ->get();

                $arrayOrtu = json_decode($ortuSiswa, true);
                $targetArray = array();

                foreach ($arrayOrtu as $key => $value) {
                    array_push($targetArray, $value['device_ortu']);
                }
                $fixTarget = implode(", ", $targetArray);

                $notifDatang = 'Bpk/Ibu yg terhormat,siswa dgn nama '.$namaSiswa.' telah melakukan presensi masuk praktek kerja lapangan pada :'.$request->input('tanggal_absen').' '.$request->input('jam_absen').PHP_EOL.'Terimakasih';

                $notifPulang = 'Bpk/Ibu yg terhormat,siswa dgn nama '.$namaSiswa.' telah selesai melakukan praktek kerja lapangan pada :'.$request->input('tanggal_absen').' '.$request->input('jam_absen').PHP_EOL.'Terimakasih';

                $cekPresensi = DB::table('siswa_presensi_pkl')
                    ->where('tanggal_absen', $request->input('tanggal_absen'))
                    ->where('fk_siswa', $request->input('fk_siswa'))
                    ->whereNotNull('jam_datang')
                    ->first();
                
                //jika cekPresensi terdapat satu baris data
                //maka lakukan update 
                if($cekPresensi){
                    //untuk mengecek apakah siswa yang absen di jam pulang sudah ada datanya
                    //atau tidak
                    $cekPresensiPulang = DB::table('siswa_presensi_pkl')
                        ->where('fk_siswa', $request->input('fk_siswa'))
                        ->where('tanggal_absen', $request->input('tanggal_absen'))
                        ->whereNotNull('jam_pulang')
                        ->first();
                    
                    //Jika ada datanya maka mahasiswa tidak bisa input absen di tanggal yang sama
                    if($cekPresensiPulang){
                        //jika belum maka lakukan update absen di field jam_pulang
                        $updateJamPulang = DB::table('siswa_presensi_pkl')
                            ->where('fk_siswa', $request->input('fk_siswa'))
                            ->where('tanggal_absen', $request->input('tanggal_absen'))
                            ->update([
                                'jam_pulang' => $request->input('jam_absen'),
                                'updated_time' => Carbon::now()->toDateTimeString(),
                                'lokasi_pulang' => $request->input('lat').', '.$request->input('long')
                            ]);
                        
                        if($updateJamPulang){
                            $this->firebase->sendNotification(
                                'Pemberitahuan',
                                $notifPulang,
                                $fixTarget,
                                $request->input('tanggal_absen'),
                                'absen_pulang'
                            );
                            return response()->json([
                                'error' => false,
                                'action' => 'update_second',
                                'message' => 'update absen pkl sukses'
                            ]);
                        } else {
                            return response()->json([
                                'error' => true,
                                'action' => 'fail_update',
                                'message' => 'update absen pkl gagal'
                            ]);
                        }
                    } else {
                        //jika belum maka lakukan update absen di field jam_pulang
                        $updateJamPulang = DB::table('siswa_presensi_pkl')
                            ->where('fk_siswa', $request->input('fk_siswa'))
                            ->where('tanggal_absen', $request->input('tanggal_absen'))
                            ->update([
                                'jam_pulang' => $request->input('jam_absen'),
                                'updated_time' => Carbon::now()->toDateTimeString(),
                                'lokasi_pulang' => $request->input('lat').', '.$request->input('long')
                            ]);
                        
                        if($updateJamPulang){
                            $this->firebase->sendNotification(
                                'Pemberitahuan',
                                $notifPulang,
                                $fixTarget,
                                $request->input('tanggal_absen'),
                                'absen_pulang'
                            );
                            return response()->json([
                                'error' => false,
                                'action' => 'update',
                                'message' => 'update absen pkl sukses'
                            ]);
                        } else {
                            return response()->json([
                                'error' => true,
                                'action' => 'fail_update',
                                'message' => 'update absen pkl gagal'
                            ]);
                        }
                    }
                } else { //jika tidak maka lakukan insert data
                    $inputAbsen = DB::table('siswa_presensi_pkl')->insert([
                        'fk_siswa' => $request->input('fk_siswa'),
                        'kd_dudi' => $request->input('kd_dudi'),
                        'jam_datang' => $request->input('jam_absen'),
                        'tanggal_absen' => $request->input('tanggal_absen'),
                        'lat' => $request->input('lat'),
                        'long' => $request->input('long'),'updated_time' => Carbon::now()->toDateTimeString(),
                        'lokasi_datang' => $request->input('lat').', '.$request->input('long')
                    ]);

                    if($inputAbsen){
                        $this->firebase->sendNotification(
                            'Pemberitahuan',
                            $notifDatang,
                            $fixTarget,
                            $request->input('tanggal_absen'),
                            'absen_datang'
                        );
                        return response()->json([
                            'error' => false, 
                            'action' => 'input',
                            'message' => 'input absen pkl sukses'
                        ]);
                    } else {
                        return response()->json([
                            'error' => true, 
                            'action' => 'fail_input',
                            'message' => 'input absen pkl gagal'
                        ]);
                    }
                }
            } else {
                return response()->json([
                    'error' => true, 
                    'action' => 'fail_input',
                    'message' => 'input absen pkl gagal'
                ]); 
            }
        }
    }

    public function sendNotifOrtu($idSiswa){
        $siswa = AkdSiswa::where("pk_siswa", $idSiswa)->first();

        $notifMessage = 'Bpk/Ibu yg terhormat,siswa dgn nama '.$siswa->nama_siswa.' belum melakukan presensi masuk sekolah pada : '.Carbon::now()->toDateString().PHP_EOL.'Terimakasih';

        $ortuSiswa = DB::table('akd_siswa as a')
            ->join('ortu_users as b', 'a.pk_siswa', '=', 'b.fk_siswa')
            ->join('device_users as c', 'c.ortu_id', '=', 'b.pk_ortu')
            ->where('a.pk_siswa', $idSiswa)
            ->select('c.user_device_id as device_ortu')
            ->get();
        
        $cekAbsenSiswa = DB::table('siswa_presensi_utama')->where('fk_siswa', $idSiswa)->where('tanggal_absen', Carbon::now())->first();
        
        $sekarang = Carbon::now();

        $hariLibur = DB::table('pgw_hari_libur')
        ->where('dari_tanggal', $sekarang)
        ->first();

        $arrayOrtu = json_decode($ortuSiswa, true);
        $targetArray = array();

        foreach ($arrayOrtu as $key => $value) {
            array_push($targetArray, $value['device_ortu']);
        }
        $fixTarget = implode(", ", $targetArray);
        
        if($cekAbsenSiswa || $hariLibur || $sekarang->isWeekend()){
            return response()->json([
                'error' => false
            ]);
        } else {// ketika siswa belum mengabsen pada tanggal saat ini
            $this->firebase->sendNotification(
                'Peringatan',
                $notifMessage,
                $fixTarget,
                Carbon::now(),
                'warning_alfa'
            );    
            return response()->json([
                'error' => true
            ]);
        }
    }
}
