<?php

declare(strict_types=1);

namespace App\Modules\Surveys\Application;

use App\Modules\Surveys\Domain\Survey;
use App\Modules\Surveys\Domain\SurveyPublication;
use App\Modules\Surveys\Domain\SurveyQuestion;

class SurveyService
{
    /**
     * @return array<int, Survey>
     */
    public function activeSurveys(string $tenantId): array
    {
        return [
            new Survey(
                id: 'survey-demo-1',
                tenantId: $tenantId,
                title: 'Zufriedenheit mit dem Kaffeeangebot',
                status: 'draft',
                questions: [
                    new SurveyQuestion(
                        id: 'survey-question-demo-1',
                        surveyId: 'survey-demo-1',
                        question: 'Wie zufrieden bist du mit dem aktuellen Angebot?',
                        questionType: 'scale',
                        required: true,
                        options: ['1 - sehr unzufrieden', '2', '3', '4', '5 - sehr zufrieden'],
                    ),
                    new SurveyQuestion(
                        id: 'survey-question-demo-2',
                        surveyId: 'survey-demo-1',
                        question: 'Welche Sorten sollen erhalten bleiben?',
                        questionType: 'multi_select',
                        required: false,
                        options: ['Espresso', 'Filter', 'Haferdrink', 'Decaf'],
                    ),
                ],
            ),
            new Survey(
                id: 'survey-demo-2',
                tenantId: $tenantId,
                title: 'Team-Organisation und Office-Ablauf',
                status: 'in_review',
                questions: [
                    new SurveyQuestion(
                        id: 'survey-question-demo-3',
                        surveyId: 'survey-demo-2',
                        question: 'Was soll im Arbeitsablauf vereinfacht werden?',
                        questionType: 'text',
                        required: true,
                    ),
                ],
            ),
        ];
    }

    /**
     * @return array<string, mixed>
     */
    public function managerBoard(string $tenantId): array
    {
        $drafts = $this->activeSurveys($tenantId);
        $snapshots = $this->publishedSnapshots($tenantId);

        return [
            'metrics' => [
                [
                    'label' => 'Entwuerfe',
                    'value' => (string) count(array_filter($drafts, static fn (Survey $survey): bool => $survey->isDraft() || $survey->status() === 'in_review')),
                    'detail' => 'Survey-Entwuerfe und Veroeffentlichungsvorstufen.',
                ],
                [
                    'label' => 'Snapshots',
                    'value' => (string) count($snapshots),
                    'detail' => 'Freigegebene Versionen fuer Mitglieder und Tenant-Admins.',
                ],
                [
                    'label' => 'Antworten',
                    'value' => (string) array_sum(array_map(static fn (SurveyPublication $publication): int => $publication->responseCount(), $snapshots)),
                    'detail' => 'Aggregierte Ruemeldungen pro freigegebenem Stand.',
                ],
                [
                    'label' => 'Veroeffentlichung',
                    'value' => 'Snapshot',
                    'detail' => 'Mitglieder sehen freigegebene Versionen statt Live-Entwuerfe.',
                ],
            ],
            'draft_surveys' => $drafts,
            'published_snapshots' => $snapshots,
            'workflow' => [
                [
                    'step' => '1. Entwurf',
                    'detail' => 'Tenant-Admins oder Survey-Manager legen Fragen, Antworttypen und Laufzeit an.',
                ],
                [
                    'step' => '2. Pruefung',
                    'detail' => 'Die Freigabe erfolgt durch berechtigte Tenant-Verantwortliche.',
                ],
                [
                    'step' => '3. Snapshot',
                    'detail' => 'Zur Veroeffentlichung wird ein stabiler Stand eingefroren.',
                ],
                [
                    'step' => '4. Auswertung',
                    'detail' => 'Tenant-Admins sehen Auswertungen, Mitglieder nur freigegebene Ergebnisse.',
                ],
            ],
            'roles' => [
                [
                    'role' => 'tenant_admin',
                    'capability' => 'Vollzugriff auf Erfassung, Freigabe, Auswertung und Veroeffentlichung.',
                ],
                [
                    'role' => 'survey_manager',
                    'capability' => 'Umfragen anlegen, pflegen und zur Freigabe vorbereiten.',
                ],
                [
                    'role' => 'member',
                    'capability' => 'Freigegebene Snapshots lesen und an aktiven Umfragen teilnehmen.',
                ],
            ],
            'publishing_rules' => [
                'Fachseite bearbeitet Entwuerfe live.',
                'Mitglieder sehen nur freigegebene Snapshots.',
                'Veroeffentlicht wird ein stabiler Stand mit nachvollziehbarer Version.',
                'Ende und Freischaltung koennen tenantweit gesteuert werden.',
            ],
        ];
    }

    /**
     * @return array<string, mixed>
     */
    public function memberBoard(string $tenantId): array
    {
        $snapshots = $this->publishedSnapshots($tenantId);

        return [
            'snapshots' => $snapshots,
            'participation' => [
                'Antworten laufen tenantbezogen zusammen.',
                'Mitglieder sehen nur freigegebene Versionen.',
                'Mehrfachauswahl, Freitext und Bewertungsfragen sind als Zielbild vorgesehen.',
            ],
        ];
    }

    /**
     * @return array<int, SurveyPublication>
     */
    public function publishedSnapshots(string $tenantId): array
    {
        return [
            new SurveyPublication(
                id: 'survey-publication-demo-1',
                surveyId: 'survey-demo-1',
                surveyTitle: 'Zufriedenheit mit dem Kaffeeangebot',
                versionLabel: 'Snapshot v3',
                publishedAt: '2026-03-25 09:00:00',
                publishedBy: 'Tenant Admin',
                memberVisible: true,
                responseCount: 28,
                summary: 'Die Mehrheit bewertet das Angebot positiv. Prioritaet sind Sortiment und Nachschub.',
            ),
            new SurveyPublication(
                id: 'survey-publication-demo-2',
                surveyId: 'survey-demo-2',
                surveyTitle: 'Team-Organisation und Office-Ablauf',
                versionLabel: 'Snapshot v1',
                publishedAt: '2026-03-28 15:30:00',
                publishedBy: 'Survey Manager',
                memberVisible: true,
                responseCount: 16,
                summary: 'Der Ablauf wird als solide beschrieben, es werden klarere Verantwortlichkeiten gewuenscht.',
            ),
        ];
    }
}
