<?php

namespace App\Services;

use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;

class ABDMService
{
    // 1. Get Access Token
    public function getAccessToken(): array|string
    {
        try {
            $response = Http::timeout(30)
                ->withHeaders([
                    'Content-Type' => 'application/json',
                    'REQUEST-ID' => (string) Str::uuid(),
                    'TIMESTAMP' => now()->toIso8601ZuluString(),
                    'X-CM-ID' => 'sbx',
                ])
                ->post(env('API_URL'), [
                    'clientId' => env('CLIENT_ID'),
                    'clientSecret' => env('CLIENT_SECRET'),
                    'grantType' => env('GRANT_TYPE'),
                ]);

            if ($response->successful()) {
                return $response->json();
            }

            return 'Failed to get token: ' . $response->body();
        } catch (\Exception $e) {
            return 'Exception: ' . $e->getMessage();
        }
    }

    // 2. Generate txnId before sending OTP
    public function initTxnId(string $accessToken): array|string
    {
        try {
            $response = Http::timeout(60)
                ->retry(3, 2000)
                ->withHeaders([
                    'Content-Type' => 'application/json',
                    'Authorization' => 'Bearer ' . $accessToken,
                    'REQUEST-ID' => (string) Str::uuid(),
                    'TIMESTAMP' => now()->toIso8601ZuluString(),
                ])
                ->post('https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/init', []);
    
            if ($response->successful()) {
                return $response->json();
            }
    
            return 'Txn Initialization Failed: ' . $response->body();
        } catch (\Exception $e) {
            return 'Exception while generating txnId: ' . $e->getMessage();
        }
    }
    
    

    // 3. Request OTP Using Encrypted Aadhaar
    public function requestAadhaarOtp(string $encryptedAadhaar, string $txnId, string $accessToken): array|string
    {
        try {
            $response = Http::timeout(30)
                ->withHeaders([
                    'Content-Type' => 'application/json',
                    'REQUEST-ID' => (string) Str::uuid(),
                    'TIMESTAMP' => now()->toIso8601ZuluString(),
                    'Authorization' => 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJBbFJiNVdDbThUbTlFSl9JZk85ejA2ajlvQ3Y1MXBLS0ZrbkdiX1RCdkswIn0.eyJleHAiOjE3NDQzNTQ5NzEsImlhdCI6MTc0NDM1Mzc3MSwianRpIjoiMjhlZDBjMmMtYzAwZi00MTJkLTljOWQtY2JiOGExYTQ0YWY3IiwiaXNzIjoiaHR0cHM6Ly9kZXYubmRobS5nb3YuaW4vYXV0aC9yZWFsbXMvY2VudHJhbC1yZWdpc3RyeSIsInN1YiI6IjlmMzQ5ZGIzLTU1MjItNDJhNC05NTY2LWI1MWZjM2FjYjAxMiIsInR5cCI6IkJlYXJlciIsImF6cCI6IlNCWElEXzAwOTU1MCIsInNlc3Npb25fc3RhdGUiOiIzZTFmMmMyNy1mZDQyLTQwZmMtYmM2Ni05OTUyOThkZTNlOTkiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbImh0dHA6Ly9sb2NhbGhvc3Q6OTAwNyJdLCJyZXNvdXJjZV9hY2Nlc3MiOnsiU0JYSURfMDA5NTUwIjp7InJvbGVzIjpbInVtYV9wcm90ZWN0aW9uIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSIsImNsaWVudElkIjoiU0JYSURfMDA5NTUwIiwiY2xpZW50SG9zdCI6IjEwMC42NS4xNjAuMjEyIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJzZXJ2aWNlLWFjY291bnQtc2J4aWRfMDA5NTUwIiwiY2xpZW50QWRkcmVzcyI6IjEwMC42NS4xNjAuMjEyIn0.Z8B1PAqiiPgvh1oGDpQ97js4kR7H39dO7SFMVc8FKhwCy4pMaEaGIvU9IS_JgGVr2JHYYFtOwOE7q_ItSEBIY4sRp1ZBIYwnLJ3l4hiLesVJni98SFi8kvxANFcS5_wxe_5gAw-TtEVWrkmGzynvh6sBGsO-P2pIk2d2Qrqu-p9QpJzN5pJOJG0IxMqj3ukIG8AdVGhjiEgRgpJFFL-TFhN4PnTQmQyVKgUSdkxOXa_xqAlXcY2lhlbN_C6N4RNbO_dCMyTHxUJi5lzsEAfuf3q2qGNJOK7QzOhlfgCSztgO8wTO7jLO3zu50pVLrtjHF16b3tvnIuPaz4h4yaH9-w',
                ])
                ->post('https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp', [ 
                    'txnId' => $txnId,
                    'scope' => ['abha-enrol'],
                    'loginHint' => 'aadhaar',
                    'loginId' => 'DaiD+A4vVu/2BJqy/VHHpdWo5PXUvTceKibe+b70svfgtMQWTOg5agXKD7rIY43pUXyhSqeTnVhJfoKxq7JFJsEbVqdQBuMCtcDEabYFI8FceAGOwwAagfTbbNiiY/t/38un3JU4KL28TBZnFpDQchGUHGUQJWGDK8vADs9IGAr8bYK33w9xZ2Qvy/oy8bS264SRP+sBz21U0cSh+N4m9TK8QeSLclGBxIdiISDT9IfqWJmiKrgPjnLX4RDDS/kxgDJEzEMsQAE1bVjdS7nLz3yQj1ojRvOLe4PymD90AhXWaPyVNrcHyvBtJpmF1rfE3txaMs8nI5hFHImSTUqJNakb9t1Cx/TXjOipSPrFB3AdDD5XEkqZ7DmsZr7yjDIG/FhN70H7yixbsMA83mUoq8iMeb/yK5bQ5J2EU6lRA5PGqxugXd1o/xS2Swmadm3h3LDaDny4Dgwf2j8tienF9G7JTvuVLKCHDmm8/4W3SHlqzRWEFQ3oLa5EXQ0SPrTxwxA5JcrRUEX3WICUNrOct2z/RKKfSBx2YcUosJ6B/ted4qza5b4uIvpTL0VjYLZGq+MgJRHT4oigdUJsXCB3nJydwv2bz12VP2waZM+QKVa8eUMOmMpaJ4v1bkb0pZjBXlb7Ipa4ICgRh/2bSl1uEiDmKsiKNsyjTyOLQZ42OxY=',
                    'otpSystem' => 'aadhaar',
                ]); 

            if ($response->successful()) {
                return $response->json();
            }

            return 'OTP Request Failed: ' . $response->body();
        } catch (\Exception $e) {
            return 'Exception while requesting OTP: ' . $e->getMessage();
        }
    }

    // 4. Verify OTP and Enroll
    public function verifyOtpAndEnroll(string $txnId, string $otpValue, string $mobile, string $accessToken): array|string
    {
        $payload = [
            "authData" => [
                "authMethods" => ["otp"],
                "otp" => [
                    "txnId" => $txnId,
                    "otpValue" => $otpValue,
                    "mobile" => $mobile
                ]
            ],
            "consent" => [
                "code" => "abha-enrollment",
                "version" => "1.4"
            ]
        ];

        try {
            $response = Http::timeout(30)
                ->withHeaders([
                    'Content-Type' => 'application/json',
                    'TIMESTAMP' => now()->toIso8601ZuluString(),
                    'REQUEST-ID' => (string) Str::uuid(),
                    'Authorization' => 'Bearer ' . $accessToken,
                ])
                ->post('https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/byAadhaar', $payload);

            if ($response->successful()) {
                return $response->json();
            }

            return 'OTP Verification Failed: ' . $response->body();
        } catch (\Exception $e) {
            return 'Exception while verifying OTP: ' . $e->getMessage();
        }
    }
}
