<?php

namespace Lightscale\ScormPlayer\Models;

use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;

use Peopleaps\Scorm\Model\ScormScoTrackingModel;

class ScormScoTracking extends ScormScoTrackingModel
{
    use HasFactory;

    protected $fillable = [
        'uuid',
        'progression',
        'score',
        'score_raw',
        'score_min',
        'score_max',
        'score_scaled',
        'lesson_status',
        'completion_status',
        'session_time',
        'total_time_int',
        'total_time_string',
        'entry',
        'suspend_data',
        'credit',
        'exit',
        'location',
        'mode',
        'is_locked',
        'details',
        'latest_date',
    ];

    public function user()
    {
        return $this->belongsTo(config('scorm.user_class'));
    }

    public function commentsFromLearner() : Attribute
    {
        return Attribute::make(
            get: fn() => []
        );
    }

    protected function commentsFromLms() : Attribute
    {
        return Attribute::make(
            get: fn() => []
        );
    }

    protected function score() : Attribute
    {
        return Attribute::make(
            get: fn() => [
                'min' => $this->score_min,
                'max' => $this->score_max,
                'raw' => $this->score_raw,
                'scaled' => $this->score_scaled,
            ],
            set: fn(array $data) => [
                'score_min' => $data['min'] ?? null,
                'score_max' => $data['max'] ?? null,
                'score_raw' => $data['raw'] ?? null,
                'score_scaled' => $data['scaled'] ?? null,
            ]
        );
    }

    protected function learnerId() : Attribute
    {
        return Attribute::make(
            get: fn() => $this->user_id
        );
    }

    protected function learnerName() : Attribute
    {
        return Attribute::make(
            get: fn() => $this->user->name
        );
    }

    public function getCMIData() : array
    {
        $data = collect([
            'score',
            'entry',
            'credit',
            'exit',
            'mode',
            'location',
            'suspend_data',
            'completion_status',
            //'comments_from_lms',
            //'comments_from_learner',
            'learner_id',
            'learner_name',
        ])->mapWithKeys(fn($k) => [$k => $this->{$k}])->all();

        return ['cmi' => $data];
    }

    public function setCMIData(array $data)
    {
        $cmi = $data['cmi'] ?? [];
        $this->fill($cmi);
        $this->save();
    }
}