<?php

namespace App\Services;

use App\Models\Terminal;
use Illuminate\Support\Facades\Auth;

class PromptTemplateService
{
    /**
     * 获取所有可用的模板
     *
     * @return array
     */
    public function getTemplates(): array
    {
        return config('prompt_templates.templates', []);
    }

    /**
     * 根据ID获取模板
     *
     * @param string $templateId
     * @return array|null
     */
    public function getTemplate(string $templateId): ?array
    {
        $templates = $this->getTemplates();
        
        foreach ($templates as $template) {
            if ($template['id'] === $templateId) {
                return $template;
            }
        }
        
        return null;
    }

    /**
     * 应用模板到终端
     *
     * @param Terminal $terminal
     * @param string $templateId
     * @return string
     */
    public function applyTemplate(Terminal $terminal, string $templateId): string
    {
        $template = $this->getTemplate($templateId);
        
        if (!$template) {
            throw new \InvalidArgumentException("模板不存在: {$templateId}");
        }
        
        return $template['content'];
    }

    /**
     * 替换模板中的变量
     *
     * @param string $template
     * @param Terminal $terminal
     * @param array $additionalVars
     * @return string
     */
    public function replaceVariables(string $template, Terminal $terminal, array $additionalVars = []): string
    {
        $variables = $this->getVariableValues($terminal, $additionalVars);
        
        foreach ($variables as $key => $value) {
            // 处理数组类型的变量
            if (is_array($value)) {
                $value = implode(', ', $value);
            }
            
            $template = str_replace('{' . $key . '}', $value, $template);
        }
        
        return $template;
    }

    /**
     * 获取变量的实际值
     *
     * @param Terminal $terminal
     * @param array $additionalVars
     * @return array
     */
    public function getVariableValues(Terminal $terminal, array $additionalVars = []): array
    {
        $user = Auth::user();
        $now = now();
        
        $variables = [
            'user' => $user?->name ?? '访客',
            'user_id' => $user?->id ?? 0,
            'user_role' => $user?->roles?->first()?->name ?? '未知',
            'department' => $user?->department ?? '未知部门',
            
            'station' => $terminal->station_id ? "工作站 {$terminal->station_id}" : '未绑定工作站',
            'station_id' => $terminal->station_id ?? '未绑定',
            
            'terminal_name' => $terminal->name,
            'terminal_code' => $terminal->code,
            
            'time' => $now->format('Y-m-d H:i:s'),
            'date' => $now->format('Y-m-d'),
            'time_only' => $now->format('H:i:s'),
            'shift' => $this->getCurrentShift($now),
            
            'knowledge_bases' => $terminal->knowledgeBases->pluck('name')->toArray(),
            
            'company_name' => config('app.name', '公司名称'),
        ];
        
        return array_merge($variables, $additionalVars);
    }

    /**
     * 根据时间判断当前班次
     *
     * @param \Illuminate\Support\Carbon $time
     * @return string
     */
    protected function getCurrentShift($time): string
    {
        $hour = $time->hour;
        
        if ($hour >= 8 && $hour < 16) {
            return '早班';
        } elseif ($hour >= 16 && $hour < 24) {
            return '中班';
        } else {
            return '夜班';
        }
    }

    /**
     * 预览模板（替换变量后的结果）
     *
     * @param string $template
     * @param Terminal $terminal
     * @return string
     */
    public function preview(string $template, Terminal $terminal): string
    {
        return $this->replaceVariables($template, $terminal);
    }

    /**
     * 验证模板中的变量是否都是有效的
     *
     * @param string $template
     * @return array 返回无效的变量列表
     */
    public function validateVariables(string $template): array
    {
        $validVariables = array_column(config('prompt_variables.variables', []), 'name');
        
        // 提取模板中的所有变量
        preg_match_all('/\{([a-z_]+)\}/', $template, $matches);
        $usedVariables = $matches[1] ?? [];
        
        // 找出无效的变量
        $invalidVariables = array_diff($usedVariables, $validVariables);
        
        return array_values(array_unique($invalidVariables));
    }
}
