#!/usr/bin/env bash
# ============================================================
# SysDock 行数カウントツール v1.0
#
# ソースコードの総行数を計測し、SysDockの料金プランの目安を表示します。
# このスクリプトはファイルの読み取りのみ行い、変更・送信は一切しません。
# ============================================================

set -euo pipefail

# --- 色定義 ---
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
RED='\033[0;31m'
BOLD='\033[1m'
NC='\033[0m'

# --- ヘッダー ---
echo ""
echo -e "${CYAN}╔════════════════════════════════════════════╗${NC}"
echo -e "${CYAN}║  ${BOLD}SysDock 行数カウントツール${NC}${CYAN}                ║${NC}"
echo -e "${CYAN}╚════════════════════════════════════════════╝${NC}"
echo ""

# --- 対象ディレクトリ ---
TARGET="${1:-.}"

if [ ! -d "$TARGET" ]; then
  echo -e "${RED}エラー: ディレクトリ '$TARGET' が見つかりません。${NC}"
  echo "使い方: bash sysdock-linecount.sh [対象ディレクトリ]"
  exit 1
fi

echo -e "${BOLD}対象:${NC} $(cd "$TARGET" && pwd)"
echo ""

# --- 除外パターン ---
EXCLUDES=(
  -path '*/.git/*'
  -o -path '*/node_modules/*'
  -o -path '*/.next/*'
  -o -path '*/dist/*'
  -o -path '*/build/*'
  -o -path '*/.cache/*'
  -o -path '*/vendor/*'
  -o -path '*/__pycache__/*'
  -o -path '*/.venv/*'
  -o -path '*/venv/*'
  -o -path '*/target/*'
  -o -path '*/bin/*'
  -o -path '*/obj/*'
  -o -path '*/.idea/*'
  -o -path '*/.vscode/*'
  -o -path '*/coverage/*'
  -o -path '*/.terraform/*'
  -o -name '*.min.js'
  -o -name '*.min.css'
  -o -name '*.map'
  -o -name 'package-lock.json'
  -o -name 'yarn.lock'
  -o -name 'pnpm-lock.yaml'
  -o -name 'composer.lock'
  -o -name 'Gemfile.lock'
  -o -name 'Cargo.lock'
  -o -name '*.png' -o -name '*.jpg' -o -name '*.jpeg'
  -o -name '*.gif' -o -name '*.svg' -o -name '*.ico'
  -o -name '*.woff' -o -name '*.woff2' -o -name '*.ttf' -o -name '*.eot'
  -o -name '*.mp4' -o -name '*.pdf' -o -name '*.zip' -o -name '*.tar.gz'
)

# --- 拡張子リスト ---
EXTENSIONS="ts tsx js jsx mjs cjs php java kt kts scala py rb erb go cs cshtml razor vue svelte html htm css scss sass less sql sh bash yaml yml json toml rs swift dart pl pm ex exs lua r R c h cpp hpp"

# --- ファイル数カウント ---
FILE_COUNT=$(find "$TARGET" \( "${EXCLUDES[@]}" \) -prune -o -type f -print 2>/dev/null | wc -l | tr -d ' ')

# --- 拡張子別の行数カウント（連想配列なし） ---
echo -e "${BOLD}拡張子別の行数:${NC}"
echo "──────────────────────────────────────"

TOTAL_LINES=0
RESULTS_FILE=$(mktemp)

for ext in $EXTENSIONS; do
  count=$(find "$TARGET" \( "${EXCLUDES[@]}" \) -prune -o -name "*.${ext}" -type f -print 2>/dev/null | xargs wc -l 2>/dev/null | tail -1 | awk '{print $1}')
  if [ -n "$count" ] && [ "$count" -gt 0 ] 2>/dev/null; then
    echo "$count *.${ext}" >> "$RESULTS_FILE"
  fi
done

# --- ソート表示 ---
sort -rn "$RESULTS_FILE" | while read lines ext; do
  printf "  %-20s %'10d 行\n" "$ext" "$lines"
done

# 合計算出
TOTAL_LINES=$(awk '{s+=$1} END {print s+0}' "$RESULTS_FILE")
rm -f "$RESULTS_FILE"

echo "──────────────────────────────────────"
printf "  ${BOLD}%-20s %'10d 行${NC}\n" "合計" "$TOTAL_LINES"
echo ""

# --- ファイル数 ---
printf "${BOLD}総ファイル数:${NC} %'d 件\n" "$FILE_COUNT"
echo ""

# --- プラン判定 ---
echo -e "${BOLD}料金プラン目安:${NC}"
echo "──────────────────────────────────────"

if [ "$TOTAL_LINES" -le 50000 ]; then
  echo -e "  ${GREEN}▶ ライト（¥30万）${NC}"
  echo "    〜5万行"
elif [ "$TOTAL_LINES" -le 100000 ]; then
  echo -e "  ${YELLOW}▶ スタンダード（¥50万）おすすめ${NC}"
  echo "    〜10万行"
elif [ "$TOTAL_LINES" -le 150000 ]; then
  echo -e "  ${RED}▶ プレミアム（¥80万）${NC}"
  echo "    〜15万行 / 大規模システム"
else
  echo -e "  ${RED}▶ 15万行を超えています${NC}"
  echo "    個別お見積もりとなります。無料ヒアリングにてご相談ください。"
fi

echo ""
echo "──────────────────────────────────────"
echo -e "${CYAN}無料ヒアリングのお申し込み:${NC}"
echo "  https://sysdock.com/#contact"
echo ""
echo "※ この結果はあくまで目安です。正確な見積は無料ヒアリングにてお伝えします。"
echo "※ このスクリプトはファイル読み取りのみ行い、外部への送信は一切行いません。"
echo ""
