<?php

namespace App\GraphQL\Mutations;

use App\Models\Course;
use App\Models\CourseGrade;
use App\Models\Group;
use App\Models\Semester;
use App\Models\Subject;

class ExportSemesterPerformance
{
    /**
     * @param null $_
     * @param array<string, mixed> $args
     */
    public function __invoke($_, array $args)
    {
        $semesterId = @$args['semester_id'] ?? 1;
        $isPrevSemester = $semesterId != null && Semester::active()->id != $semesterId;
        if ($isPrevSemester) {
            $group = Group::findOrFail($args['group_id']);
            $subject = Subject::findOrFail($args['subject_id']);
            $course = new Course();
            $course->semester_id = $semesterId;
            $semester = Semester::findOrFail($semesterId);
            $course->group_id = $args['group_id'];
            $course->subject_id = $args['subject_id'];
            $students = $group->students->pluck('id');
            $grades = CourseGrade::whereIn('student_educational_id', $students)
                ->where('subject_id', $args['subject_id'])
                ->with(['elements'])
                ->get();
            $elements_keys = $grades->pluck('elements')->flatten(1)->pluck('name')->unique();
            return view('reports.prevSemesterPerformance', compact('course', 'group', 'grades', 'subject', 'elements_keys', 'semester'))->render();
        } else {
            $course = Course::where('group_id', $args['group_id'])->where('subject_id', $args['subject_id'])->firstOrFail();
            $overview = $course->semesterOverview();
            $group = $course->group;
            return view('reports.semesterPerformance', compact('course', 'group', 'overview'))->render();
        }

    }
}
