<?php

namespace MintyPHP\Service\Scheduler\Handler;

use MintyPHP\Service\User\UserLifecycleService;

class UserLifecycleJobHandler implements ScheduledJobHandlerInterface
{
    public function __construct(private readonly UserLifecycleService $userLifecycleService)
    {
    }

    public function definition(): array
    {
        return [
            'label'                         => 'User lifecycle run',
            'description'                   => 'Runs automatic user deactivate/delete policy',
            'default_enabled'               => 1,
            'default_timezone'              => defined('APP_TIMEZONE') ? (string) APP_TIMEZONE : 'UTC',
            'default_schedule_type'         => 'daily',
            'default_schedule_interval'     => 1,
            'default_schedule_time'         => '02:15',
            'default_schedule_weekdays_csv' => null,
            'default_catchup_once'          => 1,
            'allowed_schedule_types'        => ['hourly', 'daily', 'weekly'],
        ];
    }

    public function execute(?int $actorUserId): array
    {
        $result = $this->userLifecycleService->run($actorUserId !== null && $actorUserId > 0 ? $actorUserId : null);

        if (!($result['ok'] ?? false)) {
            $errorCode = (string) ($result['error'] ?? 'job_failed');
            $status = $errorCode === 'lock_not_acquired' ? 'skipped' : 'failed';
            return [
                'status'        => $status,
                'error_code'    => $errorCode,
                'error_message' => null,
                'result'        => $this->formatResult($result),
            ];
        }

        return [
            'status'        => 'success',
            'error_code'    => null,
            'error_message' => null,
            'result'        => $this->formatResult($result),
        ];
    }

    private function formatResult(array $result): array
    {
        return [
            'run_uuid'          => (string) ($result['run_uuid'] ?? ''),
            'deactivated_count' => (int) ($result['deactivated_count'] ?? 0),
            'deleted_count'     => (int) ($result['deleted_count'] ?? 0),
            'skipped_count'     => (int) ($result['skipped_count'] ?? 0),
            'duration_ms'       => (int) ($result['duration_ms'] ?? 0),
        ];
    }
}
