import { useState, useEffect } from 'react';
import { formatNumber, formatPercent, getVixLabel, getFgLabel } from '../stockUtils';

export default function useAiCoach({ portfolioHoldings, portfolioSummary, totalCash, totalAssets, marketCtx }) {
    const [aiModel, setAiModel] = useState(() => localStorage.getItem('ai_coach_model') ?? 'claude-haiku-4-5-20251001');
    const [aiResult, setAiResult] = useState(null);
    const [aiLoading, setAiLoading] = useState(false);
    const [aiError, setAiError] = useState('');

    useEffect(() => {
        const today = new Date().toISOString().slice(0, 10);
        const cached = localStorage.getItem(`ai_coach_${today}`);
        if (cached) {
            try { setAiResult({ ...JSON.parse(cached), cached: true }); } catch { /* ignore */ }
        }
    }, []);

    const handleAiCoach = async () => {
        if (portfolioHoldings.length === 0) return;

        const today = new Date().toISOString().slice(0, 10);
        const cacheKey = `ai_coach_${today}`;
        const cached = localStorage.getItem(cacheKey);
        if (cached) {
            try { setAiResult({ ...JSON.parse(cached), cached: true }); return; } catch { /* invalid */ }
        }

        setAiLoading(true);
        setAiError('');

        const holdingsText = portfolioHoldings
            .map((item) =>
                `- ${item.name ?? item.ticker}(${item.ticker ?? ''}): ${item.quantity}주, 매입가 ${formatNumber(item.avg_price)}원, 현재가 ${item.current_price != null ? formatNumber(item.current_price) + '원' : '미조회'}, 수익률 ${item.profit_rate != null ? formatPercent(item.profit_rate) : '미조회'}`
            )
            .join('\n');

        const marketText = marketCtx
            ? `\n[현재 시장 환경]\nVIX: ${marketCtx.vix != null ? `${marketCtx.vix} (${getVixLabel(marketCtx.vix)})` : '데이터 없음'}\nFear & Greed: ${marketCtx.fg != null ? `${marketCtx.fg}점 (${getFgLabel(marketCtx.fg)})` : '데이터 없음'}\n미국 10년물 국채: ${marketCtx.treasury != null ? `${marketCtx.treasury}%` : '데이터 없음'}\nWTI 유가: ${marketCtx.wti != null ? `$${marketCtx.wti}` : '데이터 없음'}`
            : '';

        const prompt = `당신은 한국 주식 전문 투자 코치입니다. 아래 포트폴리오와 시장 환경을 종합 분석하여 JSON으로만 답하세요.

분석 일자: ${today}
총 매입금액: ${formatNumber(portfolioSummary.total_buy)}원
총 평가금액: ${formatNumber(portfolioSummary.total_eval)}원
총 손익: ${formatNumber(portfolioSummary.total_profit)}원 (수익률: ${formatPercent(portfolioSummary.total_profit_rate)})
예수금 합계: ${totalCash != null ? formatNumber(totalCash) + '원' : '미입력'}
총 자산: ${totalAssets != null ? formatNumber(totalAssets) + '원' : '미집계'}
보유 종목 수: ${portfolioHoldings.length}개
보유 종목:
${holdingsText}${marketText}

반드시 아래 JSON 형식으로만 응답하세요 (코드블록 없이, 모든 텍스트는 한국어로):
{
  "score": 85,
  "grade": "A",
  "summary": "30자 이내 한줄 평가",
  "evaluation": "200자 이내 상세 평가",
  "advice": [
    { "title": "조언 제목", "body": "50자 이내 조언 내용" },
    { "title": "조언 제목", "body": "50자 이내 조언 내용" },
    { "title": "조언 제목", "body": "50자 이내 조언 내용" }
  ]
}`;

        try {
            const res = await fetch('/api/stock/ai-coach', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ model: aiModel, prompt, max_tokens: 1024 }),
            });
            if (!res.ok) {
                const errData = await res.json().catch(() => ({}));
                throw new Error(errData.error || `AI Coach 오류 (${res.status})`);
            }
            const data = await res.json();
            const text = data.content?.[0]?.text ?? '';
            const jsonMatch = text.match(/\{[\s\S]*\}/);
            if (!jsonMatch) throw new Error('AI 응답에서 JSON을 파싱할 수 없습니다.');
            const result = JSON.parse(jsonMatch[0]);
            const final = { ...result, generated_at: new Date().toISOString(), cached: false };
            localStorage.setItem(cacheKey, JSON.stringify(final));
            setAiResult(final);
        } catch (err) {
            setAiError(err?.message ?? String(err));
        } finally {
            setAiLoading(false);
        }
    };

    return { aiModel, setAiModel, aiResult, setAiResult, aiLoading, aiError, handleAiCoach };
}
