<?php

namespace App\Http\Controllers\User;

use App\Http\Controllers\Controller;
use App\Models\Biodata;
use App\Models\User\PublikasiJurnal;
use App\Models\User\PublikasiJurnalAnggota;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Validator;
use Alert;

class PublikasiJurnalController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $data['rs'] = PublikasiJurnal::query()->orderBy('updated_at', 'desc')->get();
        return view('user.publikasijurnal.index', $data);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
        $data['edit'] = false;
        return view('user.publikasijurnal.create', $data);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $data = $request->except('_token');

        Validator::make($data, PublikasiJurnal::RULES, PublikasiJurnal::ERROR_MESSAGES)->validate();

        $data['userid_created'] = Auth::user()->id;
        $data['userid_updated'] = Auth::user()->id;
        $data['halaman'] = abs($data['halaman1']).'-'.abs($data['halaman2']);

        try{
            $publikasi = PublikasiJurnal::query()->create($data);

            return redirect()->route('publikasijurnal.next-form', ['id' => encrypt($publikasi->id)]);
        }
        catch(Exception $ex){
            return redirect()->back()->withInput();
        }

        return redirect()->back()->withInput();
    }

    public function nextForm(Request $request, $id)
    {
        $anggota = PublikasiJurnalAnggota::query()->with('biodata')->where('publikasijurnal_id', decrypt($id))->get();

        if(count($anggota) < 1 || is_null($request->next_state)){
            $data['id'] = $id;
            $data['keanggotaan'] = PublikasiJurnalAnggota::KEANGGOTAAN;
            $data['dosen_anggota'] = $anggota->whereNotNull('nidn');
            $data['non_dosen_anggota'] = $anggota->whereNull('nidn');

            return view('user.publikasijurnal.create_anggota', $data);
        }
        else if($request->next_state == 'finish' && count($anggota) > 0){

            alert()->success('Berhasil', 'Publikasi Jurnal berhasil disimpan');

            return redirect()->route('publikasijurnal.index');
        }
    }

    public function editAnggota(Request $request, $id)
    {
        $anggota = PublikasiJurnalAnggota::query()->with('biodata')->where('publikasijurnal_id', decrypt($id))->get();
        $data['id'] = $id;
        $data['keanggotaan'] = PublikasiJurnalAnggota::KEANGGOTAAN;
        $data['dosen_anggota'] = $anggota->whereIn('jenis', ['t', 'd']);
        $data['non_dosen_anggota'] = $anggota->whereIn('jenis', ['l']);

        return view('user.publikasijurnal.create_anggota', $data);
    }

    public function deleteAnggota(Request $request)
    {
        try{
            $anggota = PublikasiJurnalAnggota::query()->find(decrypt($request->id))->delete();

            return response('Success', 200);
        }
        catch(Exception $ex){
            return response('Error', 500);
        }
    }

    public function simpanAnggota(Request $request, $id)
    {
        $allAnggota = PublikasiJurnalAnggota::where('publikasijurnal_id', decrypt($id))->get();

        $anggota = $allAnggota->where('nidn', $request->nidn);

        $ketua = $allAnggota->where('peran', PublikasiJurnalAnggota::KEANGGOTAAN[PublikasiJurnalAnggota::KETUA_KEY]);

        if( count($ketua) > 0 && $request->keanggotaan == PublikasiJurnalAnggota::KEANGGOTAAN[PublikasiJurnalAnggota::KETUA_KEY]){

            return response('Ketua tidak boleh lebih dari satu', 500);
        }

        if(count($anggota) < 1 || is_null($request->nidn)){
            $dosen = null;

            if(!is_null($request->nidn)){
                $dosen = Biodata::query()->where('nidn', $request->nidn)->first();
            }

            $data = $this->arrayDataAnggota($request);

            $store = $this->getStoredArrayDataAnggota($request, $id, $dosen);

            if(is_null($dosen) && $request->name == 'dosen'){

                return response('NIDN tidak terdaftar sebagai dosen atau belum tervalidasi', 500);
            }
            elseif(!is_null($dosen) && $request->name == 'non_dosen'){

                return response('NIDN terdaftar sebagai dosen', 500);
            }

            try{
                Validator::make($store, PublikasiJurnalAnggota::RULES, PublikasiJurnalAnggota::ERROR_MESSAGES)->validate();

                $anggota = PublikasiJurnalAnggota::query()->create($store);
                $data['id'] = $anggota->id;

                return view('user.publikasijurnal.row_anggota', $data);
            }
            catch(Exception $ex){
                return response('Data yang diberikan tidak lengkap atau tidak valid', 500);
            }
        }
        return response('Data sudah ada', 500);
    }

    private function arrayDataAnggota(Request $request)
    {
        $data['no'] = $request->no;
        $data['nama'] = $request->nama;
        $data['keanggotaan'] = $request->keanggotaan;
        $data['prodi'] = $request->prodi;
        $data['nidn'] = encrypt($request->nidn);
        $data['name'] = $request->name;

        return $data;
    }

    public function getStoredArrayDataAnggota(Request $request, $id, $dosen)
    {
        $store['publikasijurnal_id'] = decrypt($id);
        $store['nidn'] = $request->nidn;
        $store['peran'] = $request->keanggotaan;


        if (!is_null($dosen) && $request->name == 'dosen') {
            $store['jenis'] = $dosen->jenis;
            $store['nama'] = $dosen->name;

        } elseif (is_null($dosen) && $request->name == 'non_dosen') {
            $store['jenis'] = 'l';
            $store['institusi'] = $request->prodi;
            $store['nama'] = $request->nama;
        }

        return $store;
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $data['data'] = PublikasiJurnal::query()->find(decrypt($id));
        $data['edit'] = true;

        return view('user.publikasijurnal.create', $data);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $data = $request->except('_token');

        Validator::make($data, PublikasiJurnal::RULES, PublikasiJurnal::ERROR_MESSAGES)->validate();

        $data['userid_updated'] = Auth::user()->id;
        $data['halaman'] = abs($data['halaman1']).'-'.abs($data['halaman2']);

        try{
            PublikasiJurnal::query()->find(decrypt($id))->update($data);

            alert()->success('Berhasil', 'Publikasi Jurnal berhasil disimpan');

            return redirect()->route('publikasijurnal.index');
        }
        catch(Exception $ex){

            alert()->error('Gagal', 'Publikasi Jurnal gagal disimpan');

            return redirect()->back()->withInput();
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        DB::beginTransaction();
        try{
            $penelitian = PublikasiJurnal::query()->find(decrypt($id));

            $penelitian->anggota()->delete();
            $penelitian->delete();

            DB::commit();

            alert()->success('Berhasil', 'Publikasi Jurnal berhasil dihapus');

            return redirect()->route('publikasijurnal.index');
        }
        catch(Exception $ex){

            DB::rollBack();

            alert()->success('Berhasil', 'Publikasi Jurnal berhasil dihapus');

            return redirect()->route('publikasijurnal.index');
        }
    }
}
