<?php

namespace App\Http\Controllers\Api\Integrations;

use App\Http\Controllers\Controller;
use App\Models\BiometricDevice;
use App\Models\Company;
use App\Services\Biometric\ZktecoPayloadParser;
use App\Services\Biometric\ZktecoPunchIngestService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class ZktecoAttendanceWebhookController extends Controller
{
    public function __invoke(
        Request $request,
        ZktecoPunchIngestService $ingest,
        ZktecoPayloadParser $parser
    ): JsonResponse {
        /** @var BiometricDevice $device */
        $device = $request->attributes->get('biometric_device');
        /** @var Company $company */
        $company = $request->attributes->get('biometric_company');

        $featureKey = (string) config('zkteco.plan_feature_key', 'attendance_biometric');
        if (! $company->hasPlanFeature($featureKey)) {
            return response()->json([
                'message' => 'Biometric attendance is not included in your subscription plan.',
            ], 403);
        }

        $parsed = $parser->parseRequest($request);
        if ($parsed['error'] !== null || $parsed['rows'] === []) {
            // Still mark device as seen so ops can see auth is OK.
            $device->forceFill(['last_seen_at' => now()])->save();

            Log::warning('zkteco.empty_or_invalid_payload', [
                'device_id' => $device->id,
                'company_id' => $company->id,
                'content_type' => $request->header('Content-Type'),
                'error' => $parsed['error'],
                'body_preview' => mb_substr((string) $request->getContent(), 0, 500),
            ]);

            return response()->json([
                'message' => $parsed['error'] ?? 'Expected a JSON array of punches.',
            ], 422);
        }

        $result = $ingest->ingest($device, $company, $parsed['rows'], $request->ip());

        return response()->json([
            'message' => 'Accepted',
            'accepted' => $result['accepted'],
            'duplicates' => $result['duplicates'],
            'rejected' => $result['rejected'],
            'reject_reasons' => $result['reject_reasons'] ?? [],
        ], 202);
    }
}
