<?php

namespace App\GraphQL\Mutations;

use App\Mail\RegistrationMail;
use App\Models\Group;
use App\Models\Instructor;
use App\Models\RegistrationData;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;

class ChangeStatus
{
    /**
     * @param null $_
     * @param array<string, mixed> $args
     * @throws \Exception
     */
    public function __invoke($_, array $args)
    {
        $ids = @$args['id'] ?? [];
        //        self::guardStudentsNotLocked($ids);
        $registrations = self::updateRegistrationStatus($ids, @$args['status']);
        // dd($registrations);
        if (self::isAcceptance(@$args['status'])) {
            // $group = self::guardArgsContainGroup($args);
            // $instructor = self::guardArgsContainInstructor($args);
            self::acceptRegistrations($registrations);
        }
        return $registrations;
    }

    /**
     * @param $ids
     */
    private static function guardStudentsNotLocked($ids)
    {
        $status = RegistrationData::whereIn('id', $ids)->pluck('status')->all();
        if (in_array(2, $status) || in_array(3, $status))
            abortMassage(null, 'This request is locked, Non-Adjustable', 'هذا الطلب مغلق، غير قابل للتعديل');
    }

    /**
     * @param $ids
     * @param $status
     * @return mixed
     * @throws \Exception
     */
    private static function updateRegistrationStatus($ids, $status)
    {
        $query = idsToModels($ids, RegistrationData::class);
        $query->update(['status' => $status]);
        return $query->get();
    }

    /**
     * @param $args
     * @return mixed
     */
    private static function guardArgsContainGroup($args)
    {
        if (!isset($args['group']) || Group::find($args['group']) == null)
            abortMassage(null, 'Missing Group', 'الرجاء تحديد الشعبة');
        return $args['group'];
    }

    /**
     * @param $args
     * @return mixed
     */
    private static function guardArgsContainInstructor($args)
    {
        if (!isset($args['instructor']) || Instructor::find($args['instructor']) == null)
            abortMassage(null, 'Missing Instructor', 'الرجاء تحديد المشرف');
        return $args['instructor'];
    }

    /**
     * @param $status
     * @return bool
     */
    private static function isAcceptance($status)
    {
        return $status == 2;
    }

    /**
     * @param $registrations
     * @param $group
     * @param $instructor
     */
    private static function acceptRegistrations($registrations)
    {
        // Begin Transaction
        DB::beginTransaction();
        foreach ($registrations as $registration) {
            if (self::createStudentForRegistration($registration));
        }
        // Commit Transaction
        DB::commit();
    }

    /**
     * @param $registration
     * @param $group
     * @param $instructor
     */
    private static function createStudentForRegistration($registration)
    {
        try {
            $group = $registration->group_id;
            $instructor = $registration->instructor_id;
            $user = User::create([
                'fname_en' => $registration->fname,
                'sname_en' => $registration->sname,
                'tname_en' => $registration->tname,
                'lname_en' => $registration->lname,
                'fname_ar' => $registration->fname_ar,
                'sname_ar' => $registration->sname_ar,
                'tname_ar' => $registration->tname_ar,
                'lname_ar' => $registration->lname_ar,
                'name' => $registration->name,
                'name_ar' => $registration->name_ar,
                'id_number' => $registration->id_number,
                'phone' => $registration->phone,
                'email' => $registration->email,
                'password' => bcrypt('password'),
            ]);
            $student = $user->student()->create([
                'status' => 1,
            ]);
            $student->profile()->create([
                'city' => $registration->city,
                'dob_hijri' => $registration->dob_hijri,
                'sex' => $registration->sex,
            ]);
            $student->educational()->create([
                'id' => $student->id,
                'student_number' => $student->generateStudentNumber(),
                'certificate_type' => $registration->certificate_type,
                'gpa' => $registration->gpa,
                'supervisor_id' => $instructor,
                'group_id' => $group
            ]);
            return true;
        } catch (\Throwable $th) {
            dd($th);
            return false;
        }
    }

    /**
     * @param $registration
     */
    private static function sendRegistrationWelcomeEmail($registration)
    {
        Mail::to($registration->email)->send(new RegistrationMail([
            'title' => 'Mail From HIPF',
            'body' => 'Congratulation your request has been approved, now you can sign in to our system , username: ' . $registration->email . ' , password: password'
        ]));
    }
}
