<?php

namespace App\Http\Controllers;

use App\Jobs\kirimNotifikasiErrorJob;
use App\Jobs\layananPengajuanDpuDpaJob;

use App\Models\Bagian;
use App\Models\Mahasiswa;
use App\Models\PengajuanDpuDpa;
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;
use Spatie\Permission\Models\Role;
use Ixudra\Curl\Facades\Curl;

class LayananPengajuanDpuDpaController extends Controller
{

//done
public function index(){
    $data = PengajuanDpuDpa::
    select('pengajuan_dpu_dpas.*',
    'mahasiswas.nim as nim',
    'mahasiswas.nama as nama',
    'dosen_dpu.nama_gelar as dpu_nama_gelar',
    'dosen_dpa.nama_gelar as dpa_nama_gelar'
    )
    ->join('mahasiswas','mahasiswas_id','=','mahasiswas.id')
    ->join('users as dosen_dpu','mahasiswas.dosen_dpu_id','=','dosen_dpu.id')
    ->join('users as dosen_dpa','mahasiswas.dosen_dpa_id','=','dosen_dpa.id')
    ->get();
    return view('layanan-dpudpa.index',['title' => 'Pengajuan DPU/DPA | Admin Dashboard','data' => $data]);
}
//done
public function tambah(){
    $dosen = User::role('Dosen')->get();
    $bagian = Bagian::select('id', 'nama_bagian')->get();
    return view('layanan-dpudpa.tambah',['dosen'=>$dosen, 'bagian'=>$bagian]);
}

//done
public function terima(Request $request){
    $id = $request->id;
    $countcaseid = PengajuanDpuDpa::where('ttd_operator','!=','-')->count();
    $caseid = "LS".date_format(date_create(),"ym").$countcaseid+1;
    
    $cekData = PengajuanDpuDpa::where('caseid',$caseid)->first();
    $data = PengajuanDpuDpa::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-dpudpa.index')->with('error','Gagal simpan Data, Cek kembali Detail Data yang akan diterima');
    }
    //save CASEID dan kirim email
    
    $data->caseid = $caseid;
    $data->ttd_operator = Carbon::now();
    if($data->save()){
        $data_job = [
            [
                'jenis' => 'mahasiswa',
                'id' => $id,
            ],
            [
                'jenis' => 'dpu',
                'id' => $id,
            ],
            [
                'jenis' => 'dpa',
                'id' => $id,
            ],
        ];
        foreach($data_job as $item){
            dispatch(new layananPengajuanDpuDpaJob($item));
        }
        return redirect()->route('layanan-dpudpa.index')->with('success','Data Berhasil Disimpan, Email Akan Dikirimkan ke Mahasiswa, DPU dan DPA');
    }

}

//done
public function store(Request $request){
    
    $request->validate([
        'nim'=>'required|numeric',
        'nama'=>'required',
        'nomor_hp'=>'required|numeric',
        'email'=>'required|email',
        'judul_seminar_proposal'=>'required',
        'bagian'=>'required|numeric',
        'dosen_dpu'=>'required|numeric',
        'dosen_dpa'=>'required|numeric',
        'file_transkrip' => '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@mail.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',
        'file_transkrip.mimes'=>'Format File Bukan PDF, Cek Ulang file anda',
        'file_transkrip.max'=>'Ukuran File Anda lebih dari 4Mb, Cek Ulang File anda',
    ]);
    //Cek Apakah Data Mahasiswa Tersebut sudah ada, jika ada maka diminta untuk menggunakan fitur cari
    $mahasiswas_id = Mahasiswa::where('nim',$request->nim)->first();
    if(!is_null($mahasiswas_id)){
        return redirect()->route('layanan-dpudpa.tambah')->with('error','Data Anda Sudah Ada, Gunakan Fitur Cari');
    }

    $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'] = $request->judul_seminar_proposal;
    $data_mhs['bagian'] = $request->bagian;
    $data_mhs['dosen_dpu_id'] = $request->dosen_dpu;
    $data_mhs['dosen_dpa_id'] = $request->dosen_dpa;
    //set default to 0
    $data_mhs['dosen_penguji1_id'] = 1;
    $data_mhs['dosen_penguji2_id'] = 1;
    $data_mhs['judul_skripsi_id'] = '-';
    $data_mhs['judul_skripsi_en'] = '-';
    $data_mhs['judul_jurnal'] = '-';
    $data_mhs['judul_artikel'] = '-';
    
    //set penyimpanan file
    $file_transkrip = $request->file('file_transkrip');
    $file_transkrip_name = 'LS_'.str_replace(' ', '_',$file_transkrip->getClientOriginalName());
    $path = $request->nim.'/'.$file_transkrip_name;
    //jika berhasil save file dan save data mhs maka pengajuan akan diisi
    if(Storage::disk('public')->put($path, file_get_contents($file_transkrip)) && Mahasiswa::create($data_mhs)){
        $mahasiswas_id = Mahasiswa::where('nim',$request->nim)->first();
        $data_dpudpa['mahasiswas_id'] = $mahasiswas_id->id;
        $data_dpudpa['bukti_transkrip_nilai'] = $file_transkrip_name;
        PengajuanDpuDpa::create($data_dpudpa);
        return redirect()->route('layanan-dpudpa.tambah')->with('success','Sukses Tambah Data, Silahkan Menunggu Email Konfirmasi setelah disetujui Oleh Operator');
    }
    return redirect()->route('layanan-dpudpa.tambah')->with('error','Gagal Tambah data, Cek kembali data yang anda masukkan');  
}

//done
public function destroy(Request $request){
    $id = $request->id;
    //cari data dan kirim notif sebelum dihapus
    $data = PengajuanDpuDpa::where('pengajuan_dpu_dpas.id',$id)
    ->join('mahasiswas','mahasiswas_id','=','mahasiswas.id')
    ->first();
    $data_job = [
        'jenis' => 'penolakan',
        'judul_seminar_proposal' => $data->judul_seminar_proposal,
        'nama_mahasiswa' => $data->nama,
        'nim_mahasiswa' => $data->nim,
        'email' => $data->email,
        'created_at' => $data->created_at,
        'alasan' => $request->alasan,
    ];
    $path = $data->nim."/".$data->bukti_transkrip_nilai;
    //hapus file yang diupload mahasiswa
    if(Storage::disk('public')->exists($path)){
        //hapus data pengajuan mahasiswa
        Storage::disk('public')->delete($path);
    }
    
    $dataDelete = PengajuanDpuDpa::findOrFail($id);
    
    //kirim notifikasi jika data berhasil dihapus
    if($dataDelete->delete()){
        dispatch(new layananPengajuanDpuDpaJob($data_job));
        return redirect()->route('layanan-dpudpa.index')->with('success','Permintaan Sudah Diproses, Email akan segera dikirim ke penerima');
    }
    return redirect()->route('layanan-dpudpa.index')->with('error','Gagal Hapus Data, coba cek data yang akan dihapus lalu coba lagi!');
}

//done
public function ettd($url, $caseid){
    $role_untuk_ettd = ['dpu','dpa','kombi'];
    $data = PengajuanDpuDpa::where('caseid','=',$caseid)
    ->select('pengajuan_dpu_dpas.id',
    'pengajuan_dpu_dpas.caseid',
    'mahasiswas.nama',
    'mahasiswas.nim',
    'mahasiswas.judul_seminar_proposal',
    'dosen_dpu.nama_gelar as dosen_dpu_nama_gelar',
    'dosen_dpa.nama_gelar as dosen_dpa_nama_gelar',
    )
    ->join('mahasiswas','pengajuan_dpu_dpas.mahasiswas_id','=','mahasiswas.id')
    ->join('users as dosen_dpu','mahasiswas.dosen_dpu_id','=','dosen_dpu.id')
    ->join('users as dosen_dpa','mahasiswas.dosen_dpa_id','=','dosen_dpa.id')
    ->first();
    if(in_array($url, $role_untuk_ettd) && !is_null($data)){
        //jika URL DPU maka render ini
        if($url=='dpu'){
            $jenis = 'Dosen Pembimbing Utama';
            return view('layanan-dpudpa.ettd',['title'=> 'INPUT E-Signature','jenis'=>$jenis,'data'=> $data]);
        }
        //jika URL DPA maka render ini
        elseif($url=='dpa'){
            $jenis = 'Dosen Pembimbing Anggota';
            return view('layanan-dpudpa.ettd',['title'=> 'INPUT E-Signature','jenis'=>$jenis,'data'=> $data]);
        }
        //jika URL Kombi maka render ini
        elseif($url=='kombi'){
            $jenis = 'Komisi Bimbingan';
            $kombiRole = Role::findByName('Ketua Kombi')->users;
            $dataKombi = [
                'caseid' => $data->caseid,
                'nama' => $data->nama,
                'nim' => $data->nim,
                'judul_seminar_proposal' => $data->judul_seminar_proposal,
                'dosen_kombi_nama_gelar' => $kombiRole[0]->nama_gelar,

            ];
            $jenis = 'Komisi Bimbingan';
            return view('layanan-dpudpa.ettd',['title'=> 'INPUT E-Signature','jenis'=>$jenis,'data'=> $dataKombi]);
        }
    }
    //jika URL tidak diantara ketika itu maka render ini
    return redirect()->route('laman-awal')->with(['error'=>'Invalid CASEID, Atau CaseID Tidak Ditemukan']);

}

//done
public function submitettd($url, $caseid, Request $request){
    $role_untuk_ettd = ['dpu','dpa','kombi'];
    $data = PengajuanDpuDpa::where('caseid','=',$caseid)->first();
    if(in_array($url, $role_untuk_ettd) && !is_null($data)){
        //jika URL DPU maka render ini
        if($url=='dpu'){
            //jika sudah pernah ETTD Akan Dikembalikan Ke laman TTD Dengan error
            if($data->ttd_dpu!='-'){
                return redirect()->route('layanan-dpudpa.ettd',['url'=>$url, 'caseid'=>$caseid])->with(['error'=>'CaseID Ini Sudah Pernah Anda Tandatangani Pada '.$data->ttd_dpu]);
            }
            //ambil data ETTD sesuai url
            $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();
                $this->cek_dpa_dpu($caseid);
                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-dpudpa.ettd',['url'=>$url, 'caseid'=>$caseid])->with(['error'=>'E-TTD Tidak Sesuai, Cek Kembali ETTD Anda']);
            }
        }
        //jika URL DPa maka render ini
        if($url=='dpa'){
            //jika sudah pernah ETTD Akan Dikembalikan Ke laman TTD Dengan error
            if($data->ttd_dpa!='-'){
                return redirect()->route('layanan-dpudpa.ettd',['url'=>$url, 'caseid'=>$caseid])->with(['error'=>'CaseID Ini Sudah Pernah Anda Tandatangani Pada '.$data->ttd_dpa]);
            }
            //ambil data ETTD sesuai url
            $ttd = Mahasiswa::where('nim',$request->nim)->join('users as dosen_dpa','mahasiswas.dosen_dpa_id','=','dosen_dpa.id')->first();
            //jika Belum Pernah maka TTD akan diproses
            if($ttd->ettd==$request->ettd){
                $data->ttd_dpa = Carbon::now();
                $data->save();
                $this->cek_dpa_dpu($caseid);
                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-dpudpa.ettd',['url'=>$url, 'caseid'=>$caseid])->with(['error'=>'E-TTD Tidak Sesuai, Cek Kembali ETTD Anda']);
            }
        }
        //jika URL Kombi maka render ini
        if($url=='kombi'){
            //jika sudah pernah ETTD Akan Dikembalikan Ke laman TTD Dengan error
            if($data->ttd_kombi!='-'){
                return redirect()->route('layanan-dpudpa.ettd',['url'=>$url, 'caseid'=>$caseid])->with(['error'=>'CaseID Ini Sudah Pernah Anda Tandatangani Pada '.$data->ttd_kombi]);
            }
            if($data->ttd_dpu=='-' && $data->ttd_dpa =='-'){
                return redirect()->route('layanan-dpudpa.ettd',['url'=>$url, 'caseid'=>$caseid])->with(['error'=>'DPU atau DPA Belum Tanda Tangan Pada CaseID ini']);
            }
            //ambil data ETTD sesuai url
            $ttd = Role::findByName('Ketua Kombi')->users;
            //jika Belum Pernah maka TTD akan diproses
            if($ttd[0]->ettd==$request->ettd){
                $data->ttd_kombi = Carbon::now();
                $data->save();
                $data = [
                    'jenis' => 'mahasiswa selesai',
                    'id' => $data->id,
                ];
                dispatch(new layananPengajuanDpuDpaJob($data));
                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-dpudpa.ettd',['url'=>$url, 'caseid'=>$caseid])->with(['error'=>'E-TTD Tidak Sesuai, Cek Kembali ETTD Anda']);
            }
        }
    }
}

//done
public function cetak($caseid){
    $get_data = PengajuanDpuDpa::where('caseid',$caseid)->first();
    
    //jika data kosong maka render ini
    if(is_null($get_data)){
        return redirect()->route('monitoring.caseid',['caseid'=>$caseid])->with('error','Data Dengan CASEID Tersebut Tidak ada');
    }
    //jika kombi belum ttd, maka render ini
    if($get_data->ttd_kombi=='-'){
        return redirect()->route('monitoring.caseid',['caseid'=>$caseid])->with('error','Data Belum Di TandaTangani Oleh Dosen Kombi, File Bisa didownload ketika Dosen Kombi sudah tanda tangan!');
    }
    //get Data Mahasiswa, DPU dan DPA
    $data_dpu_dpa = PengajuanDpuDpa::where('caseid', $caseid)
    ->select(
        'pengajuan_dpu_dpas.*',
        'mahasiswas.nim',
        'mahasiswas.nama',
        'bagians.nama_bagian',
        'mahasiswas.judul_seminar_proposal',
        'dosen_dpu.nama_gelar as dosen_dpu_nama_gelar',
        'dosen_dpu.nip as dosen_dpu_nip',
        'dosen_dpa.nama_gelar as dosen_dpa_nama_gelar',
        'dosen_dpa.nip as dosen_dpa_nip',
        )
    ->join('mahasiswas','mahasiswas_id','=','mahasiswas.id')
    ->join('bagians','mahasiswas.bagian','=','bagians.id')
    ->join('users as dosen_dpu','mahasiswas.dosen_dpu_id','=','dosen_dpu.id')
    ->join('users as dosen_dpa','mahasiswas.dosen_dpa_id','=','dosen_dpa.id')
    ->first();
    //get Data Kombi
    $data_kombi = Role::findByName('Ketua Kombi')->users;
    $data = [
        'title' => 'Cetak Kesediaan',
        // 'date' => Carbon::now()->format('d-m-Y'),
        'date' => $data_dpu_dpa->updated_at->format('d-m-Y'),
        'nama_mahasiswa' => $data_dpu_dpa->nama,
        'nim' => $data_dpu_dpa->nim,
        'bagian' => $data_dpu_dpa->nama_bagian,
        'judul_seminar_proposal' => $data_dpu_dpa->judul_seminar_proposal,
        'dosen_dpu_nama_gelar' => $data_dpu_dpa->dosen_dpu_nama_gelar,
        'dosen_dpu_nip' => $data_dpu_dpa->dosen_dpu_nip,
        'dosen_dpu_qrcode' => base64_encode(QrCode::size(100)->generate($data_dpu_dpa->dosen_dpu_nama_gelar.'_TTD_'.$data_dpu_dpa->ttd_dpu)),
        'dosen_dpa_nama_gelar' => $data_dpu_dpa->dosen_dpa_nama_gelar,
        'dosen_dpa_nip' => $data_dpu_dpa->dosen_dpa_nip,
        'dosen_dpa_qrcode' => base64_encode(QrCode::size(100)->generate($data_dpu_dpa->dosen_dpa_nama_gelar.'_TTD_'.$data_dpu_dpa->ttd_dpa)),
        'dosen_kombi_nama_gelar' => $data_kombi[0]->nama_gelar,
        'dosen_kombi_nip' => $data_kombi[0]->nip,
        'dosen_kombi_qrcode' => base64_encode(QrCode::size(100)->generate($data_kombi[0]->nama_gelar.'_TTD_'.$data_dpu_dpa->ttd_kombi)),
    ];
    $pdf = Pdf::loadView('layanan-dpudpa.cetak', $data);
    return $pdf->setPaper('a4', 'potrait')->download($caseid.'-Kesediaan Menjadi Dosen Pembimbing Tugas Akhir.pdf');
}

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

//cek apakah DPU dan DPU sudah Tanda tangan, jika sudah maka akan mengirim notifikasi ke Kombi
private function cek_dpa_dpu($caseid){
    $status = PengajuanDpuDpa::where('caseid',$caseid)
    ->select('id','ttd_dpu','ttd_dpa')
    ->first();
    if($status->ttd_dpu!='-' && $status->ttd_dpa!='-'){
        $data = [
            'jenis' => 'kombi',
            'id' => $status->id,
        ];
        dispatch(new layananPengajuanDpuDpaJob($data));
    }
}

}
