<?php

namespace App\Services\Integrations\Sdk;

use Illuminate\Support\Facades\File;

class ApiSdkStatusService
{
    /**
     * @return array<int, array<string, mixed>>
     */
    public function packages(): array
    {
        return [
            [
                'key' => 'google_ads_php',
                'name' => 'Google Ads PHP Client',
                'package' => 'googleads/google-ads-php',
                'class' => 'Google\\Ads\\GoogleAds\\Lib\\V21\\GoogleAdsClientBuilder',
                'fallback_class' => 'Google\\Ads\\GoogleAds\\Lib\\V20\\GoogleAdsClientBuilder',
                'required_for' => 'Google Ads resmi SDK ile GAQL sorguları ve hesap erişim testi',
                'install' => 'composer require googleads/google-ads-php',
                'status' => $this->classAvailable('Google\\Ads\\GoogleAds\\Lib\\V21\\GoogleAdsClientBuilder') || $this->classAvailable('Google\\Ads\\GoogleAds\\Lib\\V20\\GoogleAdsClientBuilder') || $this->classAvailable('Google\\Ads\\GoogleAds\\Lib\\V19\\GoogleAdsClientBuilder'),
                'notes' => $this->googleAdsNotes(),
            ],
            [
                'key' => 'meta_business_sdk',
                'name' => 'Meta Business SDK for PHP',
                'package' => 'facebook/php-business-sdk',
                'class' => 'FacebookAds\\Api',
                'required_for' => 'Meta Marketing API / Ads Insights SDK erişimi',
                'install' => 'composer require facebook/php-business-sdk',
                'status' => $this->classAvailable('FacebookAds\\Api'),
                'notes' => 'PHP 8+ önerilir. App ID, App Secret, access token ve reklam hesabı ID gerekir.',
            ],
            [
                'key' => 'google_api_client',
                'name' => 'Google API PHP Client',
                'package' => 'google/apiclient',
                'class' => 'Google\\Client',
                'required_for' => 'Search Console API, Google OAuth yardımcı işlemleri ve mülk listeleme',
                'install' => 'composer require google/apiclient',
                'status' => $this->classAvailable('Google\\Client'),
                'notes' => 'Search Console ve OAuth yardımcı akışlarında kullanılabilir. Mevcut REST fallback korunur.',
            ],
            [
                'key' => 'analytics_data',
                'name' => 'Google Analytics Data PHP Client',
                'package' => 'google/analytics-data',
                'class' => 'Google\\Analytics\\Data\\V1beta\\Client\\BetaAnalyticsDataClient',
                'required_for' => 'GA4 Data API SDK istemcisi',
                'install' => 'composer require google/analytics-data',
                'status' => $this->classAvailable('Google\\Analytics\\Data\\V1beta\\Client\\BetaAnalyticsDataClient'),
                'notes' => 'GA4 için REST fallback çalışmaya devam eder. Service account/OAuth tercihine göre ayrıca yapılandırılır.',
            ],
        ];
    }

    /**
     * @return array<int, array<string, mixed>>
     */
    public function extensions(): array
    {
        return [
            [
                'name' => 'gRPC PHP extension',
                'extension' => 'grpc',
                'status' => extension_loaded('grpc'),
                'required' => false,
                'notes' => 'Google Ads PHP client performansı için önerilir. Kurulu değilse REST fallback korunur.',
            ],
            [
                'name' => 'Protobuf PHP extension',
                'extension' => 'protobuf',
                'status' => extension_loaded('protobuf'),
                'required' => false,
                'notes' => 'Google Ads PHP client için önerilir; yoksa PHP implementation kullanılabilir.',
            ],
            [
                'name' => 'OpenSSL',
                'extension' => 'openssl',
                'status' => extension_loaded('openssl'),
                'required' => true,
                'notes' => 'OAuth, HTTPS ve token şifreleme için gereklidir.',
            ],
            [
                'name' => 'cURL',
                'extension' => 'curl',
                'status' => extension_loaded('curl'),
                'required' => true,
                'notes' => 'HTTP API çağrıları için gereklidir.',
            ],
        ];
    }

    /**
     * @return array{packages:int, installed:int, missing:int, extensions:int, extension_errors:int}
     */
    public function summary(): array
    {
        $packages = $this->packages();
        $extensions = $this->extensions();

        return [
            'packages' => count($packages),
            'installed' => collect($packages)->where('status', true)->count(),
            'missing' => collect($packages)->where('status', false)->count(),
            'extensions' => count($extensions),
            'extension_errors' => collect($extensions)->filter(fn ($item) => ($item['required'] ?? false) && ! $item['status'])->count(),
        ];
    }

    /**
     * @return array<string, string>
     */
    public function installCommands(): array
    {
        return [
            'all' => 'composer require googleads/google-ads-php facebook/php-business-sdk google/apiclient google/analytics-data',
            'google_ads' => 'composer require googleads/google-ads-php',
            'meta' => 'composer require facebook/php-business-sdk',
            'google_common' => 'composer require google/apiclient google/analytics-data',
            'clear' => 'composer dump-autoload && php artisan optimize:clear && php artisan dw:check-api-sdks',
        ];
    }

    /**
     * @return array<int, string>
     */
    public function warnings(): array
    {
        $warnings = [];

        if (! File::exists(base_path('composer.json'))) {
            $warnings[] = 'composer.json bulunamadı. Patch yanlış dizine uygulanmış olabilir.';
        }

        foreach ($this->extensions() as $extension) {
            if (($extension['required'] ?? false) && ! $extension['status']) {
                $warnings[] = $extension['name'].' zorunlu ama sunucuda kapalı görünüyor.';
            }
        }

        if (! extension_loaded('grpc')) {
            $warnings[] = 'gRPC kurulu değil. Google Ads PHP client için önerilir; mevcut REST fallback yine kullanılabilir.';
        }

        return $warnings;
    }

    private function classAvailable(string $class): bool
    {
        return class_exists($class);
    }

    private function googleAdsNotes(): string
    {
        $version = collect(['V24', 'V23', 'V22', 'V21', 'V20', 'V19'])
            ->first(fn ($version) => class_exists("Google\\Ads\\GoogleAds\\Lib\\{$version}\\GoogleAdsClientBuilder"));

        return $version
            ? 'Kurulu SDK sürümü algılandı: '.$version.'. Developer token, customer ID ve OAuth refresh token gerekir.'
            : 'Kurulu değil. Google Ads için mevcut REST endpoint fallback çalışmaya devam eder.';
    }
}
