<?php

namespace App\Http\Controllers;

use App\Jobs\kirimNotifikasiErrorJob;
use App\Jobs\layananSidangAkhirJob;
use App\Models\Bagian;
use App\Models\Mahasiswa;
use App\Models\PengajuanSidangAkhir;
use App\Models\User;
use Barryvdh\DomPDF\Facade\Pdf;
use Carbon\Carbon;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use SimpleSoftwareIO\QrCode\Facades\QrCode;

class LayananSidangAkhirController extends Controller
{

public function index(){
    $data = PengajuanSidangAkhir::
    select(
        'pengajuan_sidang_akhirs.*',
        'mahasiswas.nama',
        'mahasiswas.nim',
        'dosen_dpu.nama_gelar as dpu_nama_gelar',
    )
    ->join('mahasiswas','mahasiswas_id','=','mahasiswas.id')
    ->join('users as dosen_dpu','mahasiswas.dosen_dpu_id','=','dosen_dpu.id')
    ->get();
    return view('layanan-sidangakhir.index',['title' => 'Pengajuan Sidang Akhir | Admin Dashboard', 'data' => $data]);
}

public function tambah(){
    $dosen = User::role('Dosen')->get();
    $bagian = Bagian::select('id','nama_bagian')->get();
    //cek apakah ada data mahasiswa dari hasil cari
    $nim = session('mahasiswas_id');
    if($nim!=null){
        $data_mahasiswa = Mahasiswa::find($nim);
        return view('layanan-sidangakhir.tambah',['dosen'=>$dosen, 'bagian'=>$bagian,'data_mahasiswa'=>$data_mahasiswa]);
    }
    return view('layanan-sidangakhir.tambah',['dosen'=>$dosen, 'bagian'=>$bagian]);
}

public function cari(){
    return view('layanan-sidangakhir.cari',['title'=>'Cari Data Mahasiswa Untuk Keperluan Pengajuan Sidang Akhir']);
}

public function search(Request $request){
    $data = Mahasiswa::where('nim',$request->nim)->first();
    if($data==null){
        return redirect()->route('layanan-sidangakhir.tambah')->with('error','NIM Tidak Ditemukan, Gunakan Fitur Tambah');
    }
    return redirect()->route('layanan-sidangakhir.tambah')->with('mahasiswas_id',$data->id);
}

public function destroy(Request $request){
    $id = $request->id;
    //cari data dan kirim notif sebelum dihapus
    $data = PengajuanSidangAkhir::where('pengajuan_sidang_akhirs.id',$id)
    ->join('mahasiswas','mahasiswas_id','=','mahasiswas.id')
    ->first();
    //data yang akan dikirim untuk dihapus
    $data_job = [
        'jenis' => 'penolakan',
        'caseid' => $data->caseid,
        'nama_mahasiswa' => $data->nama,
        'nim_mahasiswa' => $data->nim,
        'judul_skripsi_id' => $data->judul_skripsi_id,
        'judul_skripsi_en' => $data->judul_skripsi_en,
        'email' => $data->email,
        'created_at' => $data->created_at,
        'alasan' => $request->alasan,
    ];
    //lokasi file
    $path = [
        'bukti_transkrip' => $data->nim."/".$data->bukti_transkrip,
        'bukti_turnitin' => $data->nim."/".$data->bukti_turnitin,
        'bukti_sister' => $data->nim."/".$data->bukti_sister,
        'bukti_lembar_monitoring' => $data->nim."/".$data->bukti_lembar_monitoring,
        'bukti_naskah_dosen_pembimbing' => $data->nim."/".$data->bukti_naskah_dosen_pembimbing,
        'bukti_naskah_dosen_penguji' => $data->nim."/".$data->bukti_naskah_dosen_penguji,
    ];
    
    //delete file
    foreach($path as $item){
        try {
            Storage::disk('public')->delete($item);
        }
        catch(Exception $e){
            $text['error'] = $e->getMessage();
            dispatch(new kirimNotifikasiErrorJob($text));
            
            return redirect()->route('layanan-sidangakhir.index')->with('error','Error : '.$text['error']);
        }
    }
    
    //delete data mahasiswa
    try {
        $dataDelete = PengajuanSidangAkhir::findOrFail($id);
        $dataDelete->delete();
        //kirim notif ke mahasiswa bahwa ditolak
        dispatch(new layananSidangAkhirJob($data_job));
        
    }catch(Exception $e){
        //kirim notif error jika terjadi error
        $text['error'] = $e->getMessage();
        dispatch(new kirimNotifikasiErrorJob($text));
        
        return redirect()->route('layanan-sidangakhir.index')->with('error','Error : '.$text['error']);
    }
    return redirect()->route('layanan-sidangakhir.index')->with('success','Permintaan Sudah Diproses, Email akan segera dikirim ke penerima');
}

public function store(Request $request){
    
    $request->validate([
        'nim'=>'required|numeric',
        'nama'=>'required',
        'nomor_hp'=>'required|numeric',
        'email'=>'required|email',
        'judul_skripsi_id'=>'required',
        'judul_skripsi_en'=>'required',
        'bagian'=>'required|numeric',
        'dosen_dpu'=>'required|numeric',
        'dosen_dpa'=>'required|numeric',
        'dosen_penguji1'=>'required|numeric',
        'dosen_penguji2'=>'required|numeric',
        'nilai_plagiasi'=>'required|numeric',
        'bukti_lembar_monitoring' => 'required|mimes:pdf|max:4096',
        'bukti_transkrip' => 'required|mimes:pdf|max:4096',
        'bukti_turnitin' => 'required|mimes:pdf|max:4096',
        'bukti_sister' => 'required|mimes:pdf|max:4096',
        'bukti_naskah_dosen_pembimbing' => 'required|mimes:pdf|max:4096',
        'bukti_naskah_dosen_penguji' => 'required|mimes:pdf|max:4096',
    ],[
        'nim.required'=>'NIP Wajib Diisi',
        'nim.numeric'=>'NIM Wajib Berisi Angka saja',
        'nomor_hp.numeric'=>'Nomor HP Wajib Menggunakan Angka, Contoh 089xxxxx',
        'email.email'=>'Format email tidak sesuai, cek lagi email anda, Contoh mahasiswa@gmail.com/ mahasiswa@mail.unej.ac.id',
        'bagian.numeric'=>'Bagian tidak valid, cek kembali Bagian yang dipilih',
        'dosen_dpu.numeric'=>'Dosen Pembimbing tidak valid, cek kembali Dosen Pembimbing Utama yang dipilih',
        'dosen_dpa.numeric'=>'Dosen Pembimbing tidak valid, cek kembali Dosen Pembimbing Anggota yang dipilih',
        'dosen_penguji1.numeric'=>'Dosen Penguji tidak valid, cek kembali Dosen Penguji Utama yang dipilih',
        'dosen_penguji2.numeric'=>'Dosen Penguji tidak valid, cek kembali Dosen Penguji Anggota yang dipilih',
        'nilai_plagiasi.numeric'=>'Masukkan Nilai Plagiasi Berupa Angka saja',
    ]);

    //olah file
    $bukti_transkrip = $request->file('bukti_transkrip');
    $bukti_turnitin = $request->file('bukti_turnitin');
    $bukti_sister = $request->file('bukti_sister');
    $bukti_lembar_monitoring = $request->file('bukti_lembar_monitoring');
    $bukti_naskah_dosen_pembimbing = $request->file('bukti_naskah_dosen_pembimbing');
    $bukti_naskah_dosen_penguji = $request->file('bukti_naskah_dosen_penguji');
    //beri nama tiap file
    $bukti_transkrip_name= 'LA_1'.str_replace(' ', '_',$bukti_transkrip->getClientOriginalName());
    $bukti_turnitin_name = 'LA_2'.str_replace(' ', '_',$bukti_turnitin->getClientOriginalName());
    $bukti_sister_name = 'LA_3'.str_replace(' ', '_',$bukti_sister->getClientOriginalName());
    $bukti_lembar_monitoring_name = 'LA_4'.str_replace(' ', '_',$bukti_lembar_monitoring->getClientOriginalName());
    $bukti_naskah_dosen_pembimbing_name = 'LA_5'.str_replace(' ', '_',$bukti_naskah_dosen_pembimbing->getClientOriginalName());
    $bukti_naskah_dosen_penguji_name = 'LA_6'.str_replace(' ', '_',$bukti_naskah_dosen_penguji->getClientOriginalName());

    //cek apakah data mahasiswa ada, jika ada maka dikembalikan dan dianjurkan menggunakan fitur cari
    $mahasiswa = Mahasiswa::where('nim',$request->nim)->first();
    if(!is_null($mahasiswa) && $request->status!="ada"){
        return redirect()->route('layanan-sidangakhir.tambah')->with('error','Data Anda Sudah Ada, Gunakan Fitur Cari Menggunakan NIM :'.$request->nim);
    }
    //kalo menggunakan fitur cari, akan menggunakan fungsi ini
    elseif(!is_null($mahasiswa) && $request->status=="ada"){
        $mahasiswas_id = $mahasiswa->id;
        $data_sidangakhir['mahasiswas_id'] = $mahasiswas_id;
        $data_sidangakhir['nilai_plagiasi'] = $request->nilai_plagiasi;
        $data_sidangakhir['bukti_transkrip'] = $bukti_transkrip_name;
        $data_sidangakhir['bukti_turnitin'] = $bukti_turnitin_name;
        $data_sidangakhir['bukti_sister'] = $bukti_sister_name;
        $data_sidangakhir['bukti_lembar_monitoring'] = $bukti_lembar_monitoring_name;
        $data_sidangakhir['bukti_naskah_dosen_pembimbing'] = $bukti_naskah_dosen_pembimbing_name;
        $data_sidangakhir['bukti_naskah_dosen_penguji'] = $bukti_naskah_dosen_penguji_name;
        //save data pengajuan
        PengajuanSidangAkhir::create($data_sidangakhir);
        //update data mahasiswa
        $mahasiswa->judul_skripsi_id = $request->judul_skripsi_id;
        $mahasiswa->judul_skripsi_en = $request->judul_skripsi_en;
        $mahasiswa->save();
        //save file
        Storage::disk('public')->put($request->nim.'/'.$bukti_transkrip_name, file_get_contents($bukti_transkrip));
        Storage::disk('public')->put($request->nim.'/'.$bukti_turnitin_name, file_get_contents($bukti_turnitin));
        Storage::disk('public')->put($request->nim.'/'.$bukti_sister_name, file_get_contents($bukti_sister));
        Storage::disk('public')->put($request->nim.'/'.$bukti_lembar_monitoring_name, file_get_contents($bukti_lembar_monitoring));
        Storage::disk('public')->put($request->nim.'/'.$bukti_naskah_dosen_pembimbing_name, file_get_contents($bukti_naskah_dosen_pembimbing));
        Storage::disk('public')->put($request->nim.'/'.$bukti_naskah_dosen_penguji_name, file_get_contents($bukti_naskah_dosen_penguji));
        return redirect()->route('layanan-sidangakhir.tambah')->with('success','Sukses Tambah Data, Silahkan Menunggu Email Konfirmasi setelah disetujui Oleh Operator');
    }

    //jika data belum ada, maka create data baru
    $data_mhs['nim'] = $request->nim;
    $data_mhs['nama'] = $request->nama;
    $data_mhs['nomor_hp'] = $request->nomor_hp;
    $data_mhs['email'] = $request->email;
    $data_mhs['judul_seminar_proposal'] = '-';
    $data_mhs['bagian'] = $request->bagian;
    $data_mhs['dosen_dpu_id'] = $request->dosen_dpu;
    $data_mhs['dosen_dpa_id'] = $request->dosen_dpa;
    $data_mhs['dosen_penguji1_id'] = $request->dosen_penguji1;
    $data_mhs['dosen_penguji2_id'] = $request->dosen_penguji2;
    //set default values to -
    $data_mhs['judul_skripsi_id'] = $request->judul_skripsi_id;
    $data_mhs['judul_skripsi_en'] = $request->judul_skripsi_en;
    $data_mhs['judul_jurnal'] = '-';
    $data_mhs['judul_artikel'] = '-';

    //save data mahasiswa dan pengajuan
    if(Mahasiswa::create($data_mhs)){
        $mahasiswas_id = Mahasiswa::where('nim',$request->nim)->first();
        $data_sidangakhir['mahasiswas_id'] = $mahasiswas_id->id;
        $data_sidangakhir['nilai_plagiasi'] = $request->nilai_plagiasi;
        $data_sidangakhir['bukti_transkrip'] = $bukti_transkrip_name;
        $data_sidangakhir['bukti_turnitin'] = $bukti_turnitin_name;
        $data_sidangakhir['bukti_sister'] = $bukti_sister_name;
        $data_sidangakhir['bukti_lembar_monitoring'] = $bukti_lembar_monitoring_name;
        $data_sidangakhir['bukti_naskah_dosen_pembimbing'] = $bukti_naskah_dosen_pembimbing_name;
        $data_sidangakhir['bukti_naskah_dosen_penguji'] = $bukti_naskah_dosen_penguji_name;
        PengajuanSidangAkhir::create($data_sidangakhir);

        Storage::disk('public')->put($request->nim.'/'.$bukti_transkrip_name, file_get_contents($bukti_transkrip));
        Storage::disk('public')->put($request->nim.'/'.$bukti_turnitin_name, file_get_contents($bukti_turnitin));
        Storage::disk('public')->put($request->nim.'/'.$bukti_sister_name, file_get_contents($bukti_sister));
        Storage::disk('public')->put($request->nim.'/'.$bukti_lembar_monitoring_name, file_get_contents($bukti_lembar_monitoring));
        Storage::disk('public')->put($request->nim.'/'.$bukti_naskah_dosen_pembimbing_name, file_get_contents($bukti_naskah_dosen_pembimbing));
        Storage::disk('public')->put($request->nim.'/'.$bukti_naskah_dosen_penguji_name, file_get_contents($bukti_naskah_dosen_penguji));
        return redirect()->route('layanan-sidangakhir.tambah')->with('success','Sukses Tambah Data, Silahkan Menunggu Email Konfirmasi setelah disetujui Oleh Operator');
    }
    return redirect()->route('layanan-sidangakhir.tambah')->with('error','Gagal Tambah data, Cek kembali data yang anda masukkan');  
}

public function terima(Request $request){
    $id = $request->id;
    $countcaseid = PengajuanSidangAkhir::where('ttd_operator','!=','-')->count();
    $caseid = "LA".date_format(date_create(),"ym").$countcaseid+1;

    $cekData = PengajuanSidangAkhir::where('caseid',$caseid)->first();
    $data = PengajuanSidangAkhir::where('id',$id)->first();
    //cek apakah ada caseid yang sama sebelum disave
    if(!is_null($cekData)){
        $data->updated_at = Carbon::now();
        $data->save();
        return redirect()->route('layanan-sidangakhir.index')->with('error','Gagal simpan Data, Cek kembali Detail Data yang akan diterima');
    }

    $data->caseid = $caseid;
    $data->ttd_operator = Carbon::now();
    if($data->save()){
        $data_job = [
            [
                'jenis' => 'mahasiswa',
                'id' => $id,
            ],
            [
                'jenis' => 'dpu',
                'id' => $id,
            ],
        ];
        foreach($data_job as $item){
            dispatch(new layananSidangAkhirJob($item));
        }
        return redirect()->route('layanan-sidangakhir.index')->with('success','Data Berhasil Disimpan, Email Akan Dikirimkan ke Mahasiswa, DPU dan DPA');
    }
}

public function ettd($caseid){
    $data = PengajuanSidangAkhir::where('caseid', $caseid)
    ->select(
        'pengajuan_sidang_akhirs.*',
        'mahasiswas.nama',
        'mahasiswas.nim',
        'mahasiswas.judul_skripsi_id',
        'mahasiswas.judul_skripsi_en',
        'dosen_dpu.nama_gelar as dosen_dpu_nama_gelar',
    )
    ->join('mahasiswas','pengajuan_sidang_akhirs.mahasiswas_id','=','mahasiswas.id')
    ->join('users as dosen_dpu','mahasiswas.dosen_dpu_id','=','dosen_dpu.id')
    ->first();
    //jika data tidak null, maka render ini
    if(!is_null($data)){
            $jenis = 'Dosen Pembimbing Utama';
            return view('layanan-sidangakhir.ettd',['title'=> 'INPUT E-Signature','jenis'=>$jenis,'data'=> $data]);
        }
    //jika URL tidak diantara ketika itu maka render ini
    return redirect()->route('laman-awal')->with(['error'=>'Invalid CASEID, Atau CaseID Tidak Ditemukan']);
}

public function submitettd($caseid, Request $request){
    $data = PengajuanSidangAkhir::where('caseid','=',$caseid)->first();
    //jika data ada, maka diproses
    if(!is_null($data)){
        //cek ttd jika ttd sudah pernah diisi maka dikembalikan error
        if($data->ttd_dpu!='-'){
            return redirect()->route('layanan-sidangakhir.ettd',['caseid'=>$caseid])->with(['error'=>'CaseID Ini Sudah Pernah Anda Tandatangani Pada '.$data->ttd_dpu]);
        }
        $ttd = Mahasiswa::where('nim',$request->nim)->join('users as dosen_dpu','mahasiswas.dosen_dpu_id','=','dosen_dpu.id')->first();
            //jika Belum Pernah maka TTD akan diproses
            if($ttd->ettd==$request->ettd){
                $data->ttd_dpu = Carbon::now();
                $data->save();
                $data_job =[
                        'jenis' => 'mahasiswa selesai',
                        'id' => $data->id,
                    ];
                    dispatch(new layananSidangAkhirJob($data_job));
                return redirect()->route('monitoring.caseid',['caseid'=>$caseid])->with(['success'=>'Terimakasih Telah Melakukan Tanda Tangan Pada CaseID '.$caseid]);
            }
            //jika ETTD Tidak sesuai Akan Dikembalikan Ke laman TTD Dengan error
            else{
                return redirect()->route('layanan-sidangakhir.ettd',['caseid'=>$caseid])->with(['error'=>'E-TTD Tidak Sesuai, Cek Kembali ETTD Anda']);
            }
    }
}

public function cetak($caseid){
    $data = PengajuanSidangAkhir::where('caseid', $caseid)
    ->select(
        'pengajuan_sidang_akhirs.*',
        'mahasiswas.nama',
        'bagians.nama_bagian',
        'mahasiswas.nim',
        'mahasiswas.judul_skripsi_id',
        'mahasiswas.judul_skripsi_en',
        'dosen_dpu.nama_gelar as dosen_dpu_nama_gelar',
        'dosen_dpu.nip as dosen_dpu_nip',
    )
    ->join('mahasiswas','pengajuan_sidang_akhirs.mahasiswas_id','=','mahasiswas.id')
    ->join('bagians','mahasiswas.bagian','=','bagians.id')
    ->join('users as dosen_dpu','mahasiswas.dosen_dpu_id','=','dosen_dpu.id')
    ->first();
    if(is_null($data)){
        return redirect()->route('monitoring.caseid',['caseid'=>$caseid])->with('error','Data Dengan CASEID Tersebut Tidak ada');
    }

    //jika data tidak null, maka render ini
    if($data->ttd_dpu=='-'){
        return redirect()->route('monitoring.caseid',['caseid'=>$caseid])->with('error','Data Belum Di TandaTangani Oleh Dosen Pembimbing Utama, File Bisa didownload ketika DPU sudah tanda tangan!');
    }

    $data = [
        'title' => 'Cetak Kesediaan',
        // 'date' => Carbon::now()->format('d-m-Y'),
        'date' => $data->updated_at->format('d-m-Y'),
        'nama_mahasiswa' => $data->nama,
        'nim' => $data->nim,
        'bagian' => $data->nama_bagian,
        'judul_skripsi_id' => $data->judul_skripsi_id,
        'judul_skripsi_en' => $data->judul_skripsi_en,
        'nilai_plagiasi' => $data->nilai_plagiasi,
        'dosen_dpu_nama_gelar' => $data->dosen_dpu_nama_gelar,
        'dosen_dpu_nip' => $data->dosen_dpu_nip,
        'dosen_dpu_qrcode' => base64_encode(QrCode::size(100)->generate($data->dosen_dpu_nama_gelar.'_TTD_'.$data->ttd_dpu)),
    ];
    $pdf = Pdf::loadView('layanan-sidangakhir.cetak', $data);
    return $pdf->setPaper('a4', 'potrait')->download($caseid.'-Surat Pernyataan Bebas Plagiasi Proposal.pdf');
}

public function resend($caseid, Request $request){
    try{
        $data = PengajuanSidangAkhir::where('caseid',$caseid)->first();
        $data_job = [
            'id' => $data->id,
            'jenis' => $request->jenis,
        ];
        dispatch(new layananSidangAkhirJob($data_job));
    }catch(Exception $e){
        $text['error'] = $e->getMessage();
        dispatch(new kirimNotifikasiErrorJob($text));
        
        return redirect()->route('layanan-sidangakhir.index')->with('error','Error : '.$text['error']);
    }
    return redirect()->route('layanan-sidangakhir.index')->with('success','Berhasil Kirim Ulang Email Kepada '.$request->jenis.' Dengan CaseID : '.$caseid);
    
}
}
