/home/awneajlw/.trash/app/Http/Controllers/FinalRegistrationController.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\Candidate;
use App\Models\EmbassyDocument;
use App\Models\ExperienceRange;
use App\Models\MedicalCenter;
use App\Models\ProtectorDocument;
use App\Models\ProtectorRecord;
use App\Models\ExpenseRecord;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class FinalRegistrationController extends Controller
{
    public function index()
    {
        $candidates = Candidate::all();
        $experiences = ExperienceRange::all();
        return view('finalRegistration.index' , compact('candidates' , 'experiences'));
    }
    public function create()
    {
        $experiences = ExperienceRange::all();
        return view('finalRegistration.add' , compact('experiences'));
    }

    public function store(Request $request)
    {
        // Validate the request
        $request->validate([
            'username' => 'required',
            'password' => 'required',
            'candidate_type' => 'required',
            'religion' => 'nullable',
            'title' => 'required',
            'wages_salary' => 'nullable',
            'first_name' => 'required',
            'marital_status' => 'nullable',
            'last_name' => 'required',
            'education' => 'nullable',
            'cnic' => 'required',
            'profession' => 'nullable',
            'father_name' => 'required',
            'experience' => 'nullable',
            'gender' => 'required',
            'job_type' => 'nullable',
            'date_of_birth' => 'required|date',
            'job_applied_for' => 'nullable',
            'age' => 'nullable|numeric',
            'plan' => 'nullable',
            'place_of_birth' => 'nullable',
            'nationality' => 'required',
            // Passport Info
            'passport_number' => 'nullable',
            'passport_issue_date' => 'nullable|date',
            'passport_expiry_date' => 'nullable|date',
            'passport_issue_place' => 'nullable',
            // Residence Info
            'country' => 'nullable',
            'state' => 'nullable',
            'province' => 'nullable',
            'district' => 'nullable',
            'city' => 'nullable',
            'zip' => 'nullable',
            'street' => 'nullable',
            // Contact Details
            'mobile' => 'required',
            'alternate_mobile' => 'nullable',
            'fax' => 'nullable',
            'email' => 'required',
            'website' => 'nullable',
            'return_address' => 'nullable',
            //skills
            'qualification' => 'nullable',
            'professional_qualification' => 'nullable',
            'professional_experience' => 'nullable',
            // Present Status
            'any_police_case' => 'nullable',
            'any_political_involvement' => 'nullable',
            'present_employment' => 'nullable',
            'achievements' => 'nullable',

            //Dependents
            'dependents' => 'nullable',

            //Resumes
            'resumes' => 'nullable',
        ]);

        // Process the array data for qualifications, professional qualifications, professional experience, and dependents

        // 1. Process qualifications array
        $qualifications = [];
        if ($request->has('qualification_degree') && is_array($request->qualification_degree)) {
            for ($i = 0; $i < count($request->qualification_degree); $i++) {
                $qualifications[] = [
                    'duration' => $request->qualification_duration[$i] ?? '',
                    'degree' => $request->qualification_degree[$i] ?? '',
                    'institute' => $request->qualification_institute[$i] ?? ''
                ];
            }
        }

        // 2. Process professional qualifications array
        $professionalQualifications = [];
        if ($request->has('prof_qual_degree') && is_array($request->prof_qual_degree)) {
            for ($i = 0; $i < count($request->prof_qual_degree); $i++) {
                $professionalQualifications[] = [
                    'from' => $request->prof_qual_from[$i] ?? '',
                    'to' => $request->prof_qual_to[$i] ?? '',
                    'degree' => $request->prof_qual_degree[$i] ?? '',
                    'institute' => $request->prof_qual_institute[$i] ?? ''
                ];
            }
        }

        // 3. Process professional experience array
        $professionalExperience = [];
        if ($request->has('experience_company') && is_array($request->experience_company)) {
            for ($i = 0; $i < count($request->experience_company); $i++) {
                // Combine from and to dates into a duration string
                $from = $request->experience_from[$i] ?? '';
                $to = $request->experience_to[$i] ?? '';
                $duration = '';
                if (!empty($from) || !empty($to)) {
                    $duration = $from . ' - ' . $to;
                }

                $professionalExperience[] = [
                    'company' => $request->experience_company[$i] ?? '',
                    'from' => $from,
                    'to' => $to,
                    'main_category' => $request->experience_main_category[$i] ?? '',
                    'sub_category' => $request->experience_sub_category[$i] ?? '',
                    'working_category' => $request->experience_working_category[$i] ?? '',
                    'sector' => $request->experience_sector[$i] ?? '',
                    'type' => $request->experience_type[$i] ?? ''
                ];
            }
        }

        // 4. Process dependents array
        $dependents = [];
        if ($request->has('dependent_type') && is_array($request->dependent_type)) {
            for ($i = 0; $i < count($request->dependent_type); $i++) {
                $dependents[] = [
                    'type' => $request->dependent_type[$i] ?? '',
                    'name' => $request->dependent_name[$i] ?? '',
                    'age' => $request->dependent_age[$i] ?? '',
                    'relation' => $request->dependent_relation[$i] ?? ''
                ];
            }
        }

        // Convert arrays to JSON for storage
        $qualificationsJson = !empty($qualifications) ? json_encode($qualifications) : null;
        $professionalQualificationsJson = !empty($professionalQualifications) ? json_encode($professionalQualifications) : null;
        $professionalExperienceJson = !empty($professionalExperience) ? json_encode($professionalExperience) : null;
        $dependentsJson = !empty($dependents) ? json_encode($dependents) : null;

        $resumePath = null;
        if ($request->hasFile('resumes')) {
            $file = $request->file('resumes');
            $fileName = time() . '_' . $file->getClientOriginalName();

            // Define the upload directory in public folder
            $uploadDir = public_path('uploads/resume');

            // Make sure the upload directory exists
            if (!file_exists($uploadDir)) {
                mkdir($uploadDir, 0755, true);
            }

            // Store the file
            $file->move($uploadDir, $fileName);
            $resumePath = 'uploads/resume/' . $fileName;

            // Log for debugging
            \Illuminate\Support\Facades\Log::info('Resume uploaded to: ' . $uploadDir . '/' . $fileName);
        }
        // Create the candidate record
        $candidate = Candidate::create([
            'username' => $request->username,
            'password' => bcrypt($request->password),
            'candidate_type' => $request->candidate_type,
            'religion' => $request->religion,
            'title' => $request->title,
            'wages_salary' => $request->wages_salary,
            'first_name' => $request->first_name,
            'marital_status' => $request->marital_status,
            'last_name' => $request->last_name,
            'education' => $request->education,
            'cnic' => $request->cnic,
            'profession' => $request->profession,
            'father_name' => $request->father_name,
            'experience' => $request->experience,
            'gender' => $request->gender,
            'job_type' => $request->job_type,
            'date_of_birth' => $request->date_of_birth,
            'job_applied_for' => $request->job_applied_for,
            'age' => $request->age,
            'plan' => $request->plan,
            'place_of_birth' => $request->place_of_birth,
            'nationality' => $request->nationality,
            //Passport Info
            'passport_number' => $request->passport_number,
            'passport_issue_date' => $request->passport_issue_date,
            'passport_expiry_date' => $request->passport_expiry_date,
            'passport_issue_place' => $request->passport_issue_place,

            //Residence Info
            'country' => $request->country,
            'state' => $request->state,
            'province' => $request->province,
            'district' => $request->district,
            'city' => $request->city,
            'zip' => $request->zip,
            'street' => $request->street,
            //Contact Details
            'mobile' => $request->mobile,
            'alternate_mobile' => $request->alternate_mobile,
            'fax' => $request->fax,
            'email' => $request->email,
            'website' => $request->website,
            'return_address' => $request->return_address,
            //Skills
            'qualification' => $qualificationsJson,
            'professional_qualification' => $professionalQualificationsJson,
            'professional_experience' => $professionalExperienceJson,
            //Present Status
            'any_police_case' => $request->any_police_case,
            'any_political_involvement' => $request->any_political_involvement,
            'present_employment' => $request->present_employment,
            'achievements' => $request->achievements,
            //Dependents
            'dependents' => $dependentsJson,
            //Resumes
            'resume' => $resumePath,

        ]);

        return redirect()->route('finalRegistration')->with('success', 'Candidate registered successfully!');
    }
    public function edit($id)
    {
        $candidate = Candidate::findOrFail($id);
        $experiences = ExperienceRange::all();
        $qualifications = (array) json_decode($candidate->qualification, true);
        $professionalQualifications = (array) json_decode($candidate->professional_qualification, true);
        $professionalExperience = (array) json_decode($candidate->professional_experience, true);
        $dependents = (array) json_decode($candidate->dependents, true);
        return view('finalRegistration.edit' , compact('candidate' , 'experiences' , 'qualifications' , 'professionalQualifications' , 'professionalExperience' , 'dependents'));
    }
    public function update(Request $request, $id)
    {
        // Validate the request
        $request->validate([
            'username' => 'required',
            'password' => 'nullable', // Only required if changing password
            'candidate_type' => 'required',
            'religion' => 'nullable',
            'title' => 'required',
            'wages_salary' => 'nullable',
            'first_name' => 'required',
            'marital_status' => 'nullable',
            'last_name' => 'required',
            'education' => 'nullable',
            'cnic' => 'required',
            'profession' => 'nullable',
            'father_name' => 'required',
            'experience' => 'nullable',
            'gender' => 'required',
            'job_type' => 'nullable',
            'date_of_birth' => 'required|date',
            'job_applied_for' => 'nullable',
            'age' => 'nullable|numeric',
            'plan' => 'nullable',
            'place_of_birth' => 'nullable',
            'nationality' => 'required',
            // Passport Info
            'passport_number' => 'nullable',
            'passport_issue_date' => 'nullable|date',
            'passport_expiry_date' => 'nullable|date',
            'passport_issue_place' => 'nullable',
            // Residence Info
            'country' => 'nullable',
            'state' => 'nullable',
            'province' => 'nullable',
            'district' => 'nullable',
            'city' => 'nullable',
            'zip' => 'nullable',
            'street' => 'nullable',
            // Contact Details
            'email' => 'required|email',
            'mobile' => 'required',
            'alternate_phone' => 'nullable',
            'emergency_contact' => 'nullable',
            'website' => 'nullable',
            'address' => 'nullable',
            'return_address' => 'nullable',
            // Present Status
            'any_police_case' => 'nullable',
            'any_political_involvement' => 'nullable',
            'present_employment' => 'nullable',
            'achievements' => 'nullable',
        ]);

        $candidate = Candidate::findOrFail($id);

        // Process the array data for qualifications, professional qualifications, professional experience, and dependents

        // 1. Process qualifications array
        $qualifications = [];
        if ($request->has('qualification_degree') && is_array($request->qualification_degree)) {
            for ($i = 0; $i < count($request->qualification_degree); $i++) {
                $qualifications[] = [
                    'duration' => $request->qualification_duration[$i] ?? '',
                    'degree' => $request->qualification_degree[$i] ?? '',
                    'institute' => $request->qualification_institute[$i] ?? ''
                ];
            }
        }

        // 2. Process professional qualifications array
        $professionalQualifications = [];
        if ($request->has('prof_qual_degree') && is_array($request->prof_qual_degree)) {
            for ($i = 0; $i < count($request->prof_qual_degree); $i++) {
                $professionalQualifications[] = [
                    'from' => $request->prof_qual_from[$i] ?? '',
                    'to' => $request->prof_qual_to[$i] ?? '',
                    'degree' => $request->prof_qual_degree[$i] ?? '',
                    'institute' => $request->prof_qual_institute[$i] ?? ''
                ];
            }
        }

        // 3. Process professional experience array
        $professionalExperience = [];
        if ($request->has('experience_company') && is_array($request->experience_company)) {
            for ($i = 0; $i < count($request->experience_company); $i++) {
                $professionalExperience[] = [
                    'company' => $request->experience_company[$i] ?? '',
                    'from' => $request->experience_from[$i] ?? '',
                    'to' => $request->experience_to[$i] ?? '',
                    'main_category' => $request->experience_main_category[$i] ?? '',
                    'sub_category' => $request->experience_sub_category[$i] ?? '',
                    'working_category' => $request->experience_working_category[$i] ?? '',
                    'sector' => $request->experience_sector[$i] ?? '',
                    'type' => $request->experience_type[$i] ?? ''
                ];
            }
        }

        // 4. Process dependents array
        $dependents = [];
        if ($request->has('dependent_type') && is_array($request->dependent_type)) {
            for ($i = 0; $i < count($request->dependent_type); $i++) {
                $dependents[] = [
                    'type' => $request->dependent_type[$i] ?? '',
                    'name' => $request->dependent_name[$i] ?? '',
                    'age' => $request->dependent_age[$i] ?? '',
                    'relation' => $request->dependent_relation[$i] ?? ''
                ];
            }
        }

        // Convert arrays to JSON for storage
        $qualificationsJson = !empty($qualifications) ? json_encode($qualifications) : null;
        $professionalQualificationsJson = !empty($professionalQualifications) ? json_encode($professionalQualifications) : null;
        $professionalExperienceJson = !empty($professionalExperience) ? json_encode($professionalExperience) : null;
        $dependentsJson = !empty($dependents) ? json_encode($dependents) : null;

        // Handle resume upload
        $resumePath = $candidate->resume; // Keep existing resume path
        if ($request->hasFile('resumes')) {
            $file = $request->file('resumes');
            $fileName = time() . '_' . $file->getClientOriginalName();

            // Define the upload directory in public folder
            $uploadDir = public_path('uploads/resume');

            // Make sure the upload directory exists
            if (!file_exists($uploadDir)) {
                mkdir($uploadDir, 0755, true);
            }

            // Store the file
            $file->move($uploadDir, $fileName);
            $resumePath = 'uploads/resume/' . $fileName;

            // Log for debugging
            \Illuminate\Support\Facades\Log::info('Resume uploaded to: ' . $uploadDir . '/' . $fileName);
        }

        // Update the candidate record
        $candidate->update([
            'username' => $request->username,
            'password' => $request->password ? bcrypt($request->password) : $candidate->password,
            'candidate_type' => $request->candidate_type,
            'religion' => $request->religion,
            'title' => $request->title,
            'wages_salary' => $request->wages_salary,
            'first_name' => $request->first_name,
            'marital_status' => $request->marital_status,
            'last_name' => $request->last_name,
            'education' => $request->education,
            'cnic' => $request->cnic,
            'profession' => $request->profession,
            'father_name' => $request->father_name,
            'experience' => $request->experience,
            'gender' => $request->gender,
            'job_type' => $request->job_type,
            'date_of_birth' => $request->date_of_birth,
            'job_applied_for' => $request->job_applied_for,
            'age' => $request->age,
            'plan' => $request->plan,
            'place_of_birth' => $request->place_of_birth,
            'nationality' => $request->nationality,
            // Passport Info
            'passport_number' => $request->passport_number,
            'passport_issue_date' => $request->passport_issue_date,
            'passport_expiry_date' => $request->passport_expiry_date,
            'passport_issue_place' => $request->passport_issue_place,
            // Residence Info
            'country' => $request->country,
            'state' => $request->state,
            'province' => $request->province,
            'district' => $request->district,
            'city' => $request->city,
            'zip' => $request->zip,
            'street' => $request->street,
            // Contact Details
            'email' => $request->email,
            'mobile' => $request->mobile,
            'alternate_mobile' => $request->alternate_mobile,
            'fax' => $request->fax,
            'website' => $request->website,
            'address' => $request->address,
            'return_address' => $request->return_address,
            // Skills
            'qualification' => $qualificationsJson,
            'professional_qualification' => $professionalQualificationsJson,
            'professional_experience' => $professionalExperienceJson,
            // Present Status
            'any_police_case' => $request->any_police_case,
            'any_political_involvement' => $request->any_political_involvement,
            'present_employment' => $request->present_employment,
            'achievements' => $request->achievements,
            // Dependents
            'dependents' => $dependentsJson,
            // Resume
            'resume' => $resumePath,
        ]);

        return redirect()->route('finalRegistration')->with('success', 'Candidate updated successfully!');
    }
    public function destroy($id)
    {
        $candidate = Candidate::findOrFail($id);
        $candidate->delete();
        return redirect()->route('finalRegistration')->with('success', 'Candidate deleted successfully!');
    }
    public function show($id)
    {
        $medicalCenters = MedicalCenter::all();
        $candidate = Candidate::with('jobs', 'navttc', 'embassyDocument', 'protectorRecords', 'protectorDocuments', 'expenseRecords')->findOrFail($id);
        $qualifications = (array) json_decode($candidate->qualification, true);
        $professionalQualifications = (array) json_decode($candidate->professional_qualification, true);
        $professionalExperience = (array) json_decode($candidate->professional_experience, true);
        $dependents = (array) json_decode($candidate->dependents, true);
        return view('finalRegistration.show', compact('candidate', 'qualifications', 'professionalQualifications', 'professionalExperience', 'dependents', 'medicalCenters'));
    }
    public function storeENumber(Request $request)
    {
        $request->validate([
            'candidate_id' => 'required',
            'e_number' => 'required',
        ]);

        $candidate = Candidate::findOrFail($request->candidate_id);
        $candidate->e_number = $request->e_number;
        $candidate->save();

        return redirect()->back()->with('success', 'E Number added successfully!');
    }
    public function changeStatus(Request $request)
    {
        $request->validate([
            'candidate_id' => 'required',
            'status' => 'required',
        ]);

        $candidate = Candidate::findOrFail($request->candidate_id);
        $candidate->status = $request->status;
        $candidate->save();

        return redirect()->back()->with('success', 'Status changed successfully!');
    }

    public function updateDocuments(Request $request)
    {
        $request->validate([
            'candidate_id' => 'required',
        ]);

        $candidate = Candidate::findOrFail($request->candidate_id);
        
        // Convert checkbox values (on/null) to boolean (1/0)
        $documentData = [
            'visa_form' => $request->has('visa_form') ? 1 : 0,
            'waqala_paper' => $request->has('waqala_paper') ? 1 : 0,
            'e_number_print' => $request->has('e_number_print') ? 1 : 0,
            'company_agreement' => $request->has('company_agreement') ? 1 : 0,
            'navttc_report' => $request->has('navttc_report') ? 1 : 0,
            'driving_license' => $request->has('driving_license') ? 1 : 0,
            'driving_license_undertaking' => $request->has('driving_license_undertaking') ? 1 : 0,
            'driving_license_online_print' => $request->has('driving_license_online_print') ? 1 : 0,
            'degree_copies' => $request->has('degree_copies') ? 1 : 0,
            'agency_undertaking' => $request->has('agency_undertaking') ? 1 : 0,
            'agency_license' => $request->has('agency_license') ? 1 : 0,
            'police_certificate' => $request->has('police_certificate') ? 1 : 0,
            'fir_newspaper' => $request->has('fir_newspaper') ? 1 : 0,
            'medical_report' => $request->has('medical_report') ? 1 : 0
        ];
        
        // Find existing document or create new one
        EmbassyDocument::updateOrCreate(
            ['candidate_id' => $request->candidate_id],
            $documentData
        );

        return redirect()->back()->with('success', 'Documents updated successfully!');
    }
    public function storeProtector(Request $request)
    {
        $request->validate([
            'candidate_id' => 'required',
            'protector' => 'required',
            'date' => 'required',
            'expenses' => 'nullable',
            'notes' => 'nullable',
        ]);

        ProtectorRecord::create([
            'candidate_id' => $request->candidate_id,
            'protector' => $request->protector,
            'date' => $request->date,
            'expenses' => $request->expenses,
            'notes' => $request->notes,
        ]);

        return redirect()->back()->with('success', 'Protector added successfully!');
    }
    public function updateProtector(Request $request)
    {
        $request->validate([
            'candidate_id' => 'required',
            'protector' => 'required',
            'date' => 'required',
            'expenses' => 'nullable',
            'notes' => 'nullable',
        ]);

        ProtectorRecord::updateOrCreate(
            ['candidate_id' => $request->candidate_id],
            [
                'protector' => $request->protector,
                'date' => $request->date,
                'expenses' => $request->expenses,
                'notes' => $request->notes,
            ]
        );

        return redirect()->back()->with('success', 'Protector updated successfully!');
    }
    public function destroyProtector(Request $request , $id)
    {
        $protector = ProtectorRecord::findOrFail($id);
        $protector->delete();
        return redirect()->back()->with('success', 'Protector deleted successfully!');
    }

    public function storeProtectorDocument(Request $request)
    {
        $request->validate([
            'candidate_id' => 'required',
            'bc_form' => 'nullable',
            'national_bank_slip' => 'nullable',
            'insurance_paper' => 'nullable',
            'passport_id_card' => 'nullable',
            'ptn_form' => 'nullable',
            'bank_details' => 'nullable',
            'diary_form' => 'nullable',
            'expenses' => 'nullable|numeric',
        ]);

        ProtectorDocument::updateOrCreate(
            ['candidate_id' => $request->candidate_id],
            [
                'bc_form' => $request->has('bc_form') ? 1 : 0,
                'national_bank_slip' => $request->has('national_bank_slip') ? 1 : 0,
                'insurance_paper' => $request->has('insurance_paper') ? 1 : 0,
                'passport_id_card' => $request->has('passport_id_card') ? 1 : 0,
                'ptn_form' => $request->has('ptn_form') ? 1 : 0,
                'bank_details' => $request->has('bank_details') ? 1 : 0,
                'diary_form' => $request->has('diary_form') ? 1 : 0,
                'expenses' => $request->expenses,
            ]
        );

        return redirect()->back()->with('success', 'Protector document added successfully!');
    }
    public function updateProtectorDocument(Request $request)
    {
        $request->validate([
            'candidate_id' => 'required',
            'bc_form' => 'nullable',
            'national_bank_slip' => 'nullable',
            'insurance_paper' => 'nullable',
            'passport_id_card' => 'nullable',
            'ptn_form' => 'nullable',
            'bank_details' => 'nullable',
            'diary_form' => 'nullable',
            'expenses' => 'nullable|numeric',
        ]);

        ProtectorDocument::updateOrCreate(
            ['candidate_id' => $request->candidate_id],
            [
            'bc_form' => $request->has('bc_form') ? 1 : 0,
            'national_bank_slip' => $request->has('national_bank_slip') ? 1 : 0,
            'insurance_paper' => $request->has('insurance_paper') ? 1 : 0,
            'passport_id_card' => $request->has('passport_id_card') ? 1 : 0,
            'ptn_form' => $request->has('ptn_form') ? 1 : 0,
            'bank_details' => $request->has('bank_details') ? 1 : 0,
            'diary_form' => $request->has('diary_form') ? 1 : 0,
            'expenses' => $request->expenses,
            ]
        );

        return redirect()->back()->with('success', 'Protector document updated successfully!');
    }
    public function destroyProtectorDocument(Request $request , $id)
    {
        $protectorDocument = ProtectorDocument::findOrFail($id);
        $protectorDocument->delete();
        return redirect()->back()->with('success', 'Protector document deleted successfully!');
    }

    public function storeExpenseRecord(Request $request)
    {
        $request->validate([
            'candidate_id' => 'required',
            'amount' => 'required|numeric',
            'description' => 'nullable',
            'date' => 'required|date',
            'expense_type' => 'nullable',
            'payment_method' => 'nullable',
        ]);

        ExpenseRecord::create([
            'candidate_id' => $request->candidate_id,
            'amount' => $request->amount,
            'description' => $request->description,
            'date' => $request->date,
            'expense_type' => $request->expense_type,
            'payment_method' => $request->payment_method,
            'reference_number' => rand(10000, 99999),
        ]);

        return redirect()->back()->with('success', 'Expense record added successfully!');
    }

    public function updateExpenseRecord(Request $request, $id)
    {
        $request->validate([
            'amount' => 'required|numeric',
            'description' => 'nullable',
            'date' => 'required|date',
            'expense_type' => 'nullable',
            'payment_method' => 'nullable',
        ]);

        $expenseRecord = ExpenseRecord::findOrFail($id);
        $expenseRecord->update([
            'amount' => $request->amount,
            'description' => $request->description,
            'date' => $request->date,
            'expense_type' => $request->expense_type,
            'payment_method' => $request->payment_method,
        ]);

        return redirect()->back()->with('success', 'Expense record updated successfully!');
    }

    public function destroyExpenseRecord(Request $request, $id)
    {
        $expenseRecord = ExpenseRecord::findOrFail($id);
        $expenseRecord->delete();
        return redirect()->back()->with('success', 'Expense record deleted successfully!');
    }
}