<?php
/**
 * Module: SwingJournal Dashboard
 * Purpose: Main web page with modal-first trading journal workflow
 * Related files: public/api.php, assets/js/app.js, assets/css/app.css
 * Flow: load DB -> fetch dashboard data -> render cards/tables/modals
 * Version: v1.2.0
 */
$configFile = __DIR__ . '/../config/database.php';
if (!is_file($configFile)) {
    header('Location: install.php');
    exit;
}
require_once __DIR__ . '/../includes/autoload.php';

use App\Core\Database;
use App\Modules\SwingJournal\SwingRepository;

function h(mixed $v): string { return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8'); }
function won(mixed $v): string { return number_format((float)$v); }
function pct(mixed $v): string { return number_format((float)$v, 2) . '%'; }

$error = null;
try {
    $repo = new SwingRepository(Database::pdo());
    $stats = $repo->stats();
    $watchlist = $repo->watchlist();
    $plans = $repo->plans();
    $buys = $repo->buys();
    $sells = $repo->sells();
    $holdings = $repo->holdings();
    $rules = $repo->rules();
} catch (Throwable $e) {
    $error = $e->getMessage();
    $stats = ['buy_amount'=>0,'realized_profit'=>0,'holding_count'=>0,'win_rate'=>0,'profit_loss_ratio'=>0,'rule_violations'=>0,'closed_count'=>0,'avg_win'=>0,'avg_loss'=>0];
    $watchlist = $plans = $buys = $sells = $holdings = $rules = [];
}
$firstSymbol = $holdings[0]['chart_symbol'] ?? $watchlist[0]['chart_symbol'] ?? 'KRX:005930';
?><!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Swing Journal</title>
<link rel="stylesheet" href="assets/css/app.css">
</head>
<body>
<div class="app-shell">
    <aside class="sidebar">
        <div class="brand"><span class="brand-mark">SJ</span><div><strong>Swing Journal</strong><small>v1.2 MariaDB</small></div></div>
        <nav>
            <a href="#dashboard">대시보드</a>
            <a href="#holdings">보유종목</a>
            <a href="#watchlist">관심종목</a>
            <a href="#plans">매매계획</a>
            <a href="#history">매매내역</a>
            <a href="#rules">매매원칙</a>
        </nav>
        <div class="side-note">모든 입력은 모달에서만 처리됩니다. 모달은 저장 또는 취소 버튼으로만 닫힙니다.</div>
    </aside>

    <main class="main">
        <header class="topbar">
            <div><h1>스윙매매 일지</h1><p>계획 → 매수 → 보유관리 → 매도 → 복기 흐름으로 기록합니다.</p></div>
            <div class="action-row">
                <button class="btn ghost" data-open-modal="watchModal">관심종목</button>
                <button class="btn ghost" data-open-modal="planModal">매매계획</button>
                <button class="btn primary" data-open-modal="buyModal">매수등록</button>
                <button class="btn danger-soft" data-open-modal="sellModal">매도등록</button>
            </div>
        </header>

        <?php if ($error): ?><div class="alert danger"><?= h($error) ?></div><?php endif; ?>
        <section id="dashboard" class="stat-grid">
            <article class="stat-card"><span>총 매수금액</span><strong><?= won($stats['buy_amount']) ?></strong><em>원</em></article>
            <article class="stat-card"><span>실현손익</span><strong class="<?= $stats['realized_profit'] >= 0 ? 'up' : 'down' ?>"><?= won($stats['realized_profit']) ?></strong><em>원</em></article>
            <article class="stat-card"><span>보유종목</span><strong><?= (int)$stats['holding_count'] ?></strong><em>개</em></article>
            <article class="stat-card"><span>승률</span><strong><?= pct($stats['win_rate']) ?></strong><em><?= (int)$stats['closed_count'] ?>건 완료</em></article>
            <article class="stat-card"><span>손익비</span><strong><?= number_format((float)$stats['profit_loss_ratio'], 2) ?></strong><em>평균수익/평균손실</em></article>
            <article class="stat-card"><span>원칙위반</span><strong class="<?= $stats['rule_violations'] > 0 ? 'down' : '' ?>"><?= (int)$stats['rule_violations'] ?></strong><em>회</em></article>
        </section>

        <section class="panel chart-panel">
            <div class="panel-head"><div><h2>메인 차트</h2><p>TradingView 심볼 기준. 예: KOSDAQ:199800, KRX:005930</p></div><input id="chartSymbolInput" class="mini-input" value="<?= h($firstSymbol) ?>"><button class="btn ghost" id="loadChartBtn">차트보기</button></div>
            <div class="tradingview-widget-container"><div id="tradingview_chart"></div></div>
        </section>

        <section id="holdings" class="panel">
            <div class="panel-head"><div><h2>보유종목</h2><p>매수 후 아직 전량 매도되지 않은 포지션입니다.</p></div></div>
            <div class="table-wrap"><table><thead><tr><th>종목</th><th>매수일</th><th>매수가</th><th>잔여수량</th><th>보유일</th><th>유형</th><th>차트</th></tr></thead><tbody>
            <?php foreach ($holdings as $r): ?><tr><td><?= h($r['stock_name']) ?><small><?= h($r['stock_code']) ?></small></td><td><?= h($r['buy_date']) ?></td><td><?= won($r['buy_price']) ?></td><td><?= (int)$r['remain_qty'] ?></td><td><?= (int)$r['holding_days'] ?>일</td><td><?= h($r['buy_type']) ?></td><td><button class="link-btn" data-chart="<?= h($r['chart_symbol'] ?? '') ?>">보기</button></td></tr><?php endforeach; ?>
            <?php if (!$holdings): ?><tr><td colspan="7" class="empty">보유종목이 없습니다.</td></tr><?php endif; ?>
            </tbody></table></div>
        </section>

        <section class="grid two-panels">
            <article id="watchlist" class="panel"><div class="panel-head"><h2>관심종목</h2><button class="btn tiny" data-open-modal="watchModal">추가</button></div><div class="table-wrap"><table><thead><tr><th>종목</th><th>예상매수가</th><th>손절가</th><th>목표가</th><th>상태</th></tr></thead><tbody>
            <?php foreach ($watchlist as $r): ?><tr><td><?= h($r['stock_name']) ?><small><?= h($r['reason']) ?></small></td><td><?= won($r['expected_buy_price']) ?></td><td><?= won($r['stop_loss_price']) ?></td><td><?= won($r['target_price']) ?></td><td><span class="badge"><?= h($r['status']) ?></span></td></tr><?php endforeach; ?>
            <?php if (!$watchlist): ?><tr><td colspan="5" class="empty">관심종목이 없습니다.</td></tr><?php endif; ?>
            </tbody></table></div></article>

            <article id="plans" class="panel"><div class="panel-head"><h2>매매계획</h2><button class="btn tiny" data-open-modal="planModal">추가</button></div><div class="table-wrap"><table><thead><tr><th>종목</th><th>예정가</th><th>손절가</th><th>1차목표</th><th>근거</th></tr></thead><tbody>
            <?php foreach ($plans as $r): ?><tr><td><?= h($r['stock_name']) ?><small><?= h($r['plan_date']) ?></small></td><td><?= won($r['planned_buy_price']) ?></td><td><?= won($r['stop_loss_price']) ?></td><td><?= won($r['target_price_1']) ?></td><td><?= h($r['entry_type']) ?></td></tr><?php endforeach; ?>
            <?php if (!$plans): ?><tr><td colspan="5" class="empty">매매계획이 없습니다.</td></tr><?php endif; ?>
            </tbody></table></div></article>
        </section>

        <section id="history" class="grid two-panels">
            <article class="panel"><div class="panel-head"><h2>최근 매수</h2><button class="btn tiny" data-open-modal="buyModal">등록</button></div><div class="table-wrap"><table><thead><tr><th>종목</th><th>일자</th><th>가격</th><th>수량</th><th>금액</th></tr></thead><tbody>
            <?php foreach ($buys as $r): ?><tr><td><?= h($r['stock_name']) ?></td><td><?= h($r['buy_date']) ?></td><td><?= won($r['buy_price']) ?></td><td><?= (int)$r['quantity'] ?></td><td><?= won($r['buy_total']) ?></td></tr><?php endforeach; ?>
            <?php if (!$buys): ?><tr><td colspan="5" class="empty">매수기록이 없습니다.</td></tr><?php endif; ?>
            </tbody></table></div></article>

            <article class="panel"><div class="panel-head"><h2>최근 매도/복기</h2><button class="btn tiny" data-open-modal="sellModal">등록</button></div><div class="table-wrap"><table><thead><tr><th>종목</th><th>일자</th><th>수익</th><th>수익률</th><th>사유</th></tr></thead><tbody>
            <?php foreach ($sells as $r): ?><tr><td><?= h($r['stock_name']) ?></td><td><?= h($r['sell_date']) ?></td><td class="<?= $r['profit'] >= 0 ? 'up' : 'down' ?>"><?= won($r['profit']) ?></td><td><?= pct($r['rate']) ?></td><td><?= h($r['sell_reason']) ?></td></tr><?php endforeach; ?>
            <?php if (!$sells): ?><tr><td colspan="5" class="empty">매도기록이 없습니다.</td></tr><?php endif; ?>
            </tbody></table></div></article>
        </section>

        <section id="rules" class="panel"><div class="panel-head"><h2>기본 매매원칙</h2></div><div class="rule-grid">
            <?php foreach ($rules as $r): ?><article class="rule-card"><strong><?= h($r['rule_title']) ?></strong><p><?= h($r['rule_content']) ?></p></article><?php endforeach; ?>
        </div></section>
    </main>
</div>

<?php function stockFields(): void { ?>
    <div class="grid three">
        <label>종목코드<input name="stock_code" required placeholder="199800"></label>
        <label>종목명<input name="stock_name" required placeholder="툴젠"></label>
        <label>시장<select name="market"><option>KOSDAQ</option><option>KRX</option><option>KOSPI</option><option>NYSE</option><option>NASDAQ</option><option>ETF</option></select></label>
    </div>
    <div class="grid two"><label>차트심볼<input name="chart_symbol" placeholder="KOSDAQ:199800"></label><label>테마<input name="theme" placeholder="바이오 / 로봇 / AI"></label></div>
<?php } ?>

<div class="modal-backdrop" id="watchModal" aria-hidden="true"><div class="modal-card"><form class="ajax-form"><input type="hidden" name="action" value="create_watch"><div class="modal-head"><h2>관심종목 등록</h2><p>충동매수를 막기 위해 관찰 사유와 기준가격을 먼저 기록합니다.</p></div><?php stockFields(); ?><div class="grid two"><label>관심일<input type="date" name="watch_date" value="<?= date('Y-m-d') ?>"></label><label>상태<select name="status"><option value="watching">관찰중</option><option value="ready">매수대기</option><option value="excluded">제외</option></select></label><label>예상매수가<input name="expected_buy_price" inputmode="decimal"></label><label>손절가<input name="stop_loss_price" inputmode="decimal"></label><label>목표가<input name="target_price" inputmode="decimal"></label></div><label>관심 사유<textarea name="reason"></textarea></label><label>메모<textarea name="memo"></textarea></label><div class="modal-actions"><button type="button" class="btn ghost" data-close-modal>취소</button><button class="btn primary" type="submit">입력</button></div></form></div></div>

<div class="modal-backdrop" id="planModal" aria-hidden="true"><div class="modal-card"><form class="ajax-form"><input type="hidden" name="action" value="create_plan"><div class="modal-head"><h2>매매계획 작성</h2><p>매수 전에 진입근거, 손절가, 목표가를 확정합니다.</p></div><?php stockFields(); ?><div class="grid three"><label>계획일<input type="date" name="plan_date" value="<?= date('Y-m-d') ?>"></label><label>매수예정가<input name="planned_buy_price" inputmode="decimal"></label><label>예상보유일<input name="expected_holding_days" inputmode="numeric"></label><label>손절가<input name="plan_stop_loss_price" inputmode="decimal"></label><label>1차 목표가<input name="target_price_1" inputmode="decimal"></label><label>2차 목표가<input name="target_price_2" inputmode="decimal"></label></div><label>진입유형<select name="entry_type"><option>눌림목</option><option>돌파</option><option>수급</option><option>재료</option><option>실적</option><option>낙폭과대</option><option>이평선 지지</option></select></label><label>진입근거<textarea name="entry_reason"></textarea></label><label>매수금지 조건<textarea name="no_buy_condition"></textarea></label><label>체크리스트<textarea name="checklist">상승추세인가?
손절가가 명확한가?
목표가 대비 손절폭이 합리적인가?
추격매수는 아닌가?</textarea></label><label>메모<textarea name="memo"></textarea></label><div class="modal-actions"><button type="button" class="btn ghost" data-close-modal>취소</button><button class="btn primary" type="submit">입력</button></div></form></div></div>

<div class="modal-backdrop" id="buyModal" aria-hidden="true"><div class="modal-card"><form class="ajax-form"><input type="hidden" name="action" value="create_buy"><div class="modal-head"><h2>매수 등록</h2><p>실제 체결 내역과 당시 감정을 기록합니다.</p></div><?php stockFields(); ?><div class="grid three"><label>매수일<input type="date" name="buy_date" value="<?= date('Y-m-d') ?>"></label><label>매수가<input name="buy_price" required inputmode="decimal"></label><label>수량<input name="quantity" required inputmode="numeric"></label><label>수수료<input name="fee" value="0" inputmode="decimal"></label><label>매수유형<select name="buy_type"><option>눌림목</option><option>돌파</option><option>수급</option><option>재료</option><option>낙폭과대</option><option>실적기대</option></select></label><label>감정<select name="emotion"><option>차분함</option><option>확신</option><option>불안</option><option>조급함</option><option>놓칠까봐 매수</option><option>복수매매</option></select></label></div><label class="check-line"><input type="checkbox" name="followed_rule" value="1" checked> 원칙을 지킨 매수</label><label>매수근거<textarea name="entry_reason"></textarea></label><label>메모<textarea name="memo"></textarea></label><div class="modal-actions"><button type="button" class="btn ghost" data-close-modal>취소</button><button class="btn primary" type="submit">입력</button></div></form></div></div>

<div class="modal-backdrop" id="sellModal" aria-hidden="true"><div class="modal-card"><form class="ajax-form"><input type="hidden" name="action" value="create_sell"><div class="modal-head"><h2>매도 등록 / 복기</h2><p>보유 포지션 선택 후 매도 결과와 개선점을 기록합니다.</p></div><label>보유 포지션<select name="buy_log_id" required><?php foreach ($holdings as $hld): ?><option value="<?= (int)$hld['buy_log_id'] ?>"><?= h($hld['stock_name']) ?> / 매수가 <?= won($hld['buy_price']) ?> / 잔여 <?= (int)$hld['remain_qty'] ?>주</option><?php endforeach; ?></select></label><div class="grid three"><label>매도일<input type="date" name="sell_date" value="<?= date('Y-m-d') ?>"></label><label>매도가<input name="sell_price" required inputmode="decimal"></label><label>매도수량<input name="quantity" required inputmode="numeric"></label><label>수수료<input name="fee" value="0" inputmode="decimal"></label><label>매도사유<select name="sell_reason"><option>목표가 도달</option><option>손절</option><option>추세 이탈</option><option>재료 소멸</option><option>분할익절</option><option>시간초과</option><option>시장악화</option><option>감정적 매도</option></select></label></div><label class="check-line"><input type="checkbox" name="followed_rule" value="1" checked> 원칙을 지킨 매도</label><label>잘한 점<textarea name="review_good"></textarea></label><label>실수한 점<textarea name="review_bad"></textarea></label><label>다음 개선점<textarea name="improvement"></textarea></label><div class="modal-actions"><button type="button" class="btn ghost" data-close-modal>취소</button><button class="btn primary" type="submit">입력</button></div></form></div></div>

<div id="toast" class="toast"></div>
<script src="https://s3.tradingview.com/tv.js"></script>
<script src="assets/js/app.js"></script>
</body>
</html>
