<?php
namespace assignsubmission_dta\models;

/**
 * Entity class for DTA submission plugin result summary.
 */
class dta_result_summary {

    public $timestamp;
    public $globalstacktrace;
    public $successfultestcompetencies;
    public $overalltestcompetencies;
    public $results;

    public static function assignsubmission_dta_decode_json(string $jsonstring): dta_result_summary {
        $response = json_decode($jsonstring);

        $summary = new dta_result_summary();
        $summary->timestamp = $response->timestamp ?? 0;
        $summary->globalstacktrace = $response->globalstacktrace ?? '';

        $summary->successfultestcompetencies = $response->successfulTestCompetencyProfile ?? '';
        $summary->overalltestcompetencies    = $response->overallTestCompetencyProfile ?? '';

        if (!empty($response->results) && is_array($response->results)) {
            $summary->results = self::assignsubmission_dta_decode_json_result_array($response->results);
        } else {
            $summary->results = [];
        }

        return $summary;
    }

    private static function assignsubmission_dta_decode_json_result_array(array $jsonarray): array {
        $ret = [];
        foreach ($jsonarray as $entry) {
            $value = new dta_result();
            $value->packagename   = $entry->packageName     ?? '';
            $value->classname     = $entry->className       ?? '';
            $value->name          = $entry->name            ?? '';
            $value->state         = $entry->state           ?? 0;
            $value->failuretype   = $entry->failureType     ?? '';
            $value->failurereason = $entry->failureReason   ?? '';
            $value->stacktrace    = $entry->stacktrace      ?? '';
            $value->columnnumber  = $entry->columnNumber    ?? 0;
            $value->linenumber    = $entry->lineNumber      ?? 0;
            $value->position      = $entry->position        ?? 0;

            $ret[] = $value;
        }
        return $ret;
    }

    public function assignsubmission_dta_result_count(): int {
        return count($this->results);
    }

    public function assignsubmission_dta_state_occurence_count(int $state): int {
        $num = 0;
        foreach ($this->results as $r) {
            if ($r->state === $state) {
                $num++;
            }
        }
        return $num;
    }

    public function assignsubmission_dta_compilation_error_count(): int {
        return $this->assignsubmission_dta_state_occurence_count(3); // State=3 => compile error
    }

    public function assignsubmission_dta_failed_count(): int {
        return $this->assignsubmission_dta_state_occurence_count(2); // State=2 => fail
    }

    public function assignsubmission_dta_successful_count(): int {
        return $this->assignsubmission_dta_state_occurence_count(1); // State=1 => success
    }

    public function assignsubmission_dta_unknown_count(): int {
        return $this->assignsubmission_dta_state_occurence_count(0); // State=0 => unknown
    }

    // OPTIONAL: A helper to safely get success rate 0..100
    public function assignsubmission_dta_success_rate(): float {
        $count = $this->assignsubmission_dta_result_count();
        if ($count === 0) {
            return 0.0; 
        }
        $successful = $this->assignsubmission_dta_successful_count();
        return ($successful / $count) * 100.0;
    }
}