<?php

namespace BitApps\SocialPro\HTTP\Controllers;

use BitApps\Social\Model\Account;
use BitApps\Social\Model\Log;
use BitApps\Social\Model\Schedule;
use BitApps\SocialPro\Model\AiPromptConfig;

final class BitSocialAnalyticsController
{
    public function filterTrackingData($additional_data)
    {
        // Add plugin data to the tracking data

        $accountsData = Account::get(['platform', 'account_type', 'status']);
        $activeAccountCount = Account::where('status', true)->count();
        $publishedPostCount = Log::where('status', true)->count();
        $activeScheduleCount = Schedule::where('status', true)->count();
        $totalShareNowCount = Schedule::where('schedule_type', Schedule::scheduleType['DIRECT_SHARE'])->count();
        $aiPromptConfigs = AiPromptConfig::get(['type', 'model']);
        $aiPlatformAccounts = $this->getAIPlatformAccounts();

        $additional_data['accounts'] = $accountsData;
        $additional_data['accountSummary'] = $this->accountSummary($accountsData);

        $additional_data['activeAccountCount'] = $activeAccountCount ?? 0;
        $additional_data['publishedPostCount'] = $publishedPostCount ?? 0;
        $additional_data['activeScheduleCount'] = $activeScheduleCount ?? 0;
        $additional_data['totalShareNowCount'] = $totalShareNowCount ?? 0;

        $additional_data['aiPromptConfigs'] = $this->aiPromptConfigsSummary($aiPromptConfigs);
        $additional_data['aiPlatformAccounts'] = $aiPlatformAccounts;
        $additional_data['aiAccountConnectStatus'] = $this->aiAccountConnectStatus($aiPlatformAccounts, $aiPromptConfigs);

        return $additional_data;
    }

    private function aiPromptConfigsSummary($aiPromptConfigs = null)
    {
        $aiPromptConfigs = $aiPromptConfigs ?? AiPromptConfig::get(['type', 'model']) ?? [];
        $summary = [];
        $modelsByType = [];
        $typeCount = [];

        if (\is_array($aiPromptConfigs) && \count($aiPromptConfigs) > 0) {
            foreach ($aiPromptConfigs as $config) {
                $type = $config['type'] ?? 'unknown';
                $model = $config['model'] ?? 'unknown';

                if (!isset($modelsByType[$type])) {
                    $modelsByType[$type] = [];
                }

                if (!\in_array($model, $modelsByType[$type])) {
                    $modelsByType[$type][] = $model;
                }

                if (!isset($typeCount[$type])) {
                    $typeCount[$type] = 0;
                }

                $typeCount[$type]++;
            }
        }

        $summary['modelsByType'] = $modelsByType;
        $summary['typeCount'] = $typeCount;
        $summary['totalConfigs'] = \is_array($aiPromptConfigs) ? \count($aiPromptConfigs) : 0;

        return $summary;
    }

    private function aiAccountConnectStatus($aiPlatformAccounts = [], $aiPromptConfigs = [])
    {
        // AI platform account connection status based on available AI platform accounts
        $aiPlatformAccountsCount = \is_array($aiPlatformAccounts) ? \count($aiPlatformAccounts) : 0;
        $aiPromptConfigsCount = \is_array($aiPromptConfigs) ? \count($aiPromptConfigs) : 0;

        return [
            'connected'          => $aiPlatformAccountsCount > 0,
            'aiPlatformAccounts' => $aiPlatformAccountsCount,
            'aiPromptConfigs'    => $aiPromptConfigsCount,
            'hasAiConfig'        => $aiPromptConfigsCount > 0,
        ];
    }

    private function getAIPlatformAccounts()
    {
        $accounts = Account::where('account_type', Account::accountType['AI_PLATFORM'])
            ->get(['id,platform']);

        if (empty($accounts)) {
            return [];
        }

        $aiPlatformAccounts = [];

        foreach ($accounts as $account) {
            $aiPlatformAccounts[] = [
                'id'       => $account->id,
                'platform' => $account->platform,
            ];
        }

        return $aiPlatformAccounts;
    }

    private function accountSummary($accountsData)
    {
        $summary = [];
        $platformSummary = [];
        if (\count($accountsData) > 0) {
            foreach ($accountsData as $account) {
                $platform = $account['platform'];

                if (!isset($platformSummary[$platform])) {
                    $platformSummary[$platform] = 0;
                }

                $platformSummary[$platform]++;
            }
        }
        $summary['platformSummary'] = $platformSummary;
        $summary['totalAccounts'] = \count($accountsData);

        return $summary;
    }
}
