<?php

namespace App\Filament\Pages;

use App\Services\KnowledgeGraphService;
use App\Services\QuestionServiceApi;
use BackedEnum;
use Filament\Notifications\Notification;
use Filament\Pages\Page;
use UnitEnum;
use Livewire\Attributes\Computed;

class QuestionGeneration extends Page
{
    protected static ?string $title = '题目生成';
    protected static string|BackedEnum|null $navigationIcon = 'heroicon-o-sparkles';
    protected static ?string $navigationLabel = '题目生成';
    protected static string|UnitEnum|null $navigationGroup = '卷子生成管理';
    protected static ?int $navigationSort = 9;
    protected string $view = 'filament.pages.question-generation';

    public ?string $generateKpCode = null;
    public array $selectedSkills = [];
    public int $questionCount = 100;
    public ?string $generateDifficulty = null;
    public ?string $generateType = null;
    public ?string $promptTemplate = null;

    public bool $isGenerating = false;
    public ?string $currentTaskId = null;
    public int $currentTaskProgress = 0;
    public ?string $currentTaskMessage = null;

    #[Computed(cache: false)]
    public function knowledgePointOptions(): array
    {
        return app(\App\Services\QuestionServiceApi::class)->getKnowledgePointOptions();
    }

    #[Computed(cache: false)]
    public function skillsOptions(): array
    {
        if (!$this->generateKpCode) {
            return [];
        }

        $service = app(KnowledgeGraphService::class);
        return $service->getSkillsByKnowledgePoint($this->generateKpCode);
    }

    #[Computed(cache: false)]
    public function questionTypeOptions(): array
    {
        return [
            'CHOICE' => '单选题',
            'MULTIPLE_CHOICE' => '多选题',
            'FILL_IN_THE_BLANK' => '填空题',
            'CALCULATION' => '计算题',
            'WORD_PROBLEM' => '应用题',
            'PROOF' => '证明题',
        ];
    }

    #[Computed(cache: false)]
    public function promptOptions(): array
    {
        $service = app(\App\Services\QuestionServiceApi::class);
        $prompts = $service->listPrompts(type: 'question_generation', active: 'yes');

        // 只展示激活的题目生成模板
        $options = [];
        foreach ($prompts as $prompt) {
            $label = $prompt['template_name'];
            if (!empty($prompt['description'])) {
                $label .= ' - ' . (is_string($prompt['description']) ? $prompt['description'] : json_encode($prompt['description']));
            }
            $options[$prompt['template_name']] = $label;
        }

        // 自动选择第一个激活模板
        if (!$this->promptTemplate && !empty($options)) {
            $this->promptTemplate = array_key_first($options);
        }

        return $options;
    }

    public function updatedGenerateKpCode(): void
    {
        // 选择新知识点时清空技能选择
        $this->selectedSkills = [];
    }

    public function toggleAllSkills(): void
    {
        $skillsOptions = $this->skillsOptions;
        $skillsCount = count($skillsOptions);

        \Log::info('[ToggleAllSkills] Called', [
            'skillsCount' => $skillsCount,
            'selectedSkillsCount' => count($this->selectedSkills),
            'skillsOptions' => array_column($skillsOptions, 'code'),
            'selectedSkills' => $this->selectedSkills
        ]);

        if ($skillsCount === 0) {
            \Log::info('[ToggleAllSkills] No skills available, returning');
            return;
        }

        // 获取所有技能的编码列表
        $allSkillCodes = array_values(array_unique(array_column($skillsOptions, 'code')));

        // 检查当前选中的技能是否等于全部技能
        if (count($this->selectedSkills) === $skillsCount &&
            count(array_intersect($this->selectedSkills, $allSkillCodes)) === $skillsCount) {
            // 如果已全选，则清空
            $this->selectedSkills = [];
            \Log::info('[ToggleAllSkills] Deselecting all skills');
        } else {
            // 否则全选
            $this->selectedSkills = $allSkillCodes;
            \Log::info('[ToggleAllSkills] Selecting all skills', ['newSelection' => $this->selectedSkills]);
        }
    }

    public function executeGenerate()
    {
        if ($this->isGenerating) {
            return;
        }

        if (!$this->generateKpCode) {
            Notification::make()->title('请选择知识点')->danger()->send();
            return;
        }

        $skillsOptions = $this->skillsOptions;
        $skillsCount = count($skillsOptions);

        if ($skillsCount > 0 && empty($this->selectedSkills)) {
            Notification::make()->title('请选择至少一个技能')->danger()->send();
            return;
        }

        $this->isGenerating = true;
        $this->currentTaskId = null;

        try {
            $service = app(QuestionServiceApi::class);

            $params = [
                'kp_code' => $this->generateKpCode,
                'skills' => $this->selectedSkills,
                'count' => $this->questionCount,
                'difficulty' => $this->generateDifficulty,
                'type' => $this->generateType,
                'prompt_template' => $this->promptTemplate ?? null
            ];

            $response = $service->generateQuestions($params);

            \Log::info("[QuestionGen] 生成请求完成", [
                'response' => $response,
                'kp_code' => $this->generateKpCode,
                'skills' => $this->selectedSkills,
                'count' => $this->questionCount,
            ]);

            if (!($response['success'] ?? false)) {
                $this->isGenerating = false;
                Notification::make()
                    ->title('生成失败')
                    ->body($response['message'] ?? '生成失败')
                    ->danger()
                    ->send();
                return;
            }

            Notification::make()
                ->title('生成完成')
                ->body('已生成题目并入库')
                ->success()
                ->send();

            $redirectUrl = "/admin/question-management";
            $this->js("window.location.href = '{$redirectUrl}';");
            return;
        } catch (\Illuminate\Http\Client\ConnectionException $e) {
            $this->isGenerating = false;
            \Log::error("[QuestionGen] 连接异常: " . $e->getMessage());
            Notification::make()
                ->title('连接AI服务失败')
                ->body('请检查AI服务是否正常运行')
                ->danger()
                ->send();
        } catch (\Exception $e) {
            $this->isGenerating = false;
            \Log::error("[QuestionGen] 生成异常: " . $e->getMessage());
            Notification::make()
                ->title('请求异常')
                ->body($e->getMessage())
                ->danger()
                ->send();
        }
    }

    public function forceCloseStatusBar(string $taskId): void
    {
        \Log::info("[QuestionGen] 强制关闭状态栏: {$taskId}");
        $this->isGenerating = false;
        $this->currentTaskId = null;

        Notification::make()
            ->title('⚠️ 任务超时')
            ->body('生成任务可能已完成，请刷新页面查看')
            ->warning()
            ->persistent()
            ->send();
    }
}
