<?php

namespace MintyPHP\Repository\Security;

use MintyPHP\DB;

class RateLimitRepository implements RateLimitRepositoryInterface
{
    public function findByScopeAndHash(string $scope, string $subjectHash): ?array
    {
        $row = DB::selectOne(
            'select id, scope, subject_hash, hits, window_started_at, blocked_until, created, modified from request_rate_limits where scope = ? and subject_hash = ? limit 1',
            $scope,
            $subjectHash
        );
        if (!$row || !isset($row['request_rate_limits']) || !is_array($row['request_rate_limits'])) {
            return null;
        }
        return $row['request_rate_limits'];
    }

    public function create(
        string $scope,
        string $subjectHash,
        int $hits,
        string $windowStartedAt,
        ?string $blockedUntil
    ): bool {
        $result = DB::insert(
            'insert into request_rate_limits (scope, subject_hash, hits, window_started_at, blocked_until, created) values (?,?,?,?,?,NOW())',
            $scope,
            $subjectHash,
            (string) max(0, $hits),
            $windowStartedAt,
            $blockedUntil
        );
        return $result !== false;
    }

    public function updateStateById(
        int $id,
        int $hits,
        string $windowStartedAt,
        ?string $blockedUntil
    ): bool {
        if ($id <= 0) {
            return false;
        }

        $result = DB::update(
            'update request_rate_limits set hits = ?, window_started_at = ?, blocked_until = ? where id = ?',
            (string) max(0, $hits),
            $windowStartedAt,
            $blockedUntil,
            (string) $id
        );
        return $result !== false;
    }

    public function deleteByScopeAndHash(string $scope, string $subjectHash): bool
    {
        $result = DB::delete(
            'delete from request_rate_limits where scope = ? and subject_hash = ?',
            $scope,
            $subjectHash
        );
        return $result !== false;
    }
}
