# app/services/it_questions.py

from typing import List, Dict, Any

def get_it_questions() -> List[Dict[str, Any]]:
    """
    IT 기초 테스트 20문제 
    - Source 1: 2024년(令和6年) IT 패스포트 기출문제 (IT 기초/네트워크/보안)
    - Source 2: Python/Web 실무 기초 (GOALSKILL 커リキュラム)
    """
    return [
        # ---------------------------------------------------------
        # SECTION 1: IT 패스포트 기출 (2024년 令和6年) - 컴퓨터 기초
        # ---------------------------------------------------------
        {
            "id": 1,
            "category": "Hardware",
            "question": "PCにおいて、電力供給を断つと記憶内容が失われるメモリはどれですか？",
            "options": ["DVD-RAM", "DRAM (メモリ)", "ROM", "フラッシュメモリ"],
            "answer": "DRAM (メモリ)",
            "reason": "DRAMは揮発性メモリであり、電源を切るとデータが消えます。一方、ROMやフラッシュメモリは消えません。"
        },
        {
            "id": 2,
            "category": "Web",
            "question": "Webサイトが、Webブラウザを通じて訪問者のPCにデータを一時的に保存する仕組みはどれですか？",
            "options": ["Cookie (クッキー)", "キャッシュ", "アーカイブ", "ブログ"],
            "answer": "Cookie (クッキー)",
            "reason": "Cookieは、ユーザー情報やログイン状態などをブラウザ側に保存する仕組みです。"
        },
        {
            "id": 3,
            "category": "Network",
            "question": "インターネットで使用される「ドメイン名」の説明として適切なものは？",
            "options": ["通信規約の名前", "コンピュータやネットワークを識別するための名前", "アプリの名前", "メールの件名"],
            "answer": "コンピュータやネットワークを識別するための名前",
            "reason": "ドメイン名（例: google.com）は、人間が覚えやすいようにIPアドレスに名前をつけたものです。"
        },
        {
            "id": 4,
            "category": "Programming",
            "question": "JavaScriptに関する記述として、適切なものはどれですか？",
            "options": ["Webブラウザ上で動的な振る舞いを組み込める", "Webサーバ上だけで動作する", "コンパイルが必要", "Javaのスクリプト版である"],
            "answer": "Webブラウザ上で動的な振る舞いを組み込める",
            "reason": "JavaScriptは主にブラウザ上で動き、ポップアップやアニメーションなどを制御する言語です。"
        },
        {
            "id": 5,
            "category": "Security",
            "question": "PCを廃棄する際、情報漏えいを防ぐための最も適切な方法は？",
            "options": ["ファイルをゴミ箱に入れる", "アプリをアンインストールする", "初期化(フォーマット)する", "専用ソフトで無意味なデータを上書きして消去する"],
            "answer": "専用ソフトで無意味なデータを上書きして消去する",
            "reason": "通常の削除やフォーマットでは復元可能です。データを完全に上書きするか、物理的に破壊する必要があります。"
        },

        # ---------------------------------------------------------
        # SECTION 2: ネットワーク & サーバ (Webエンジニア基礎)
        # ---------------------------------------------------------
        {
            "id": 6,
            "category": "Network",
            "question": "Web通信を暗号化し、安全に通信するためのプロトコル（URLの先頭）は？",
            "options": ["HTTP", "HTTPS", "FTP", "SMTP"],
            "answer": "HTTPS",
            "reason": "HTTPSの「S」はSecureの略で、通信が暗号化されていることを意味します。"
        },
        {
            "id": 7,
            "category": "Network",
            "question": "サーバ上の「メール機能」か「Web機能」かを判別するために使われる番号は？",
            "options": ["IPアドレス", "MACアドレス", "ポート番号", "ホスト名"],
            "answer": "ポート番号",
            "reason": "IPアドレスが「住所」なら、ポート番号は「部屋番号」です（例: Webは80番、メールは25番）。"
        },
        {
            "id": 8,
            "category": "Error",
            "question": "Webページが見つからない時に表示されるエラーコード「404」の意味は？",
            "options": ["Bad Request", "Forbidden", "Not Found", "Internal Server Error"],
            "answer": "Not Found",
            "reason": "404 Not Foundは、リクエストされたページがサーバー上に存在しないことを示します。"
        },
        {
            "id": 9,
            "category": "Web",
            "question": "Webページの「骨組み（構造）」を作るためのマークアップ言語は？",
            "options": ["HTML", "CSS", "Python", "SQL"],
            "answer": "HTML",
            "reason": "HTMLは構造、CSSはデザイン、JavaScriptは動きを担当します。"
        },
        {
            "id": 10,
            "category": "Cloud",
            "question": "物理的なサーバを持たず、インターネット経由でサーバ機能を利用する形態は？",
            "options": ["オンプレミス", "クラウド", "メインフレーム", "スタンドアロン"],
            "answer": "クラウド",
            "reason": "AWSやAzureのように、必要な分だけ借りて使う形態をクラウドと呼びます。"
        },

        # ---------------------------------------------------------
        # SECTION 3: Python プログラミング (GOALSKILL 実務)
        # ---------------------------------------------------------
        {
            "id": 11,
            "category": "Python",
            "question": "Pythonでコンソールに文字を表示するための関数は？",
            "options": ["input()", "print()", "show()", "display()"],
            "answer": "print()",
            "reason": "Pythonでは print('Hello') のようにして文字を出力します。"
        },
        {
            "id": 12,
            "category": "Logic",
            "question": "x = 10 のとき、条件式「if x > 5:」の結果はどうなりますか？",
            "options": ["True (真)", "False (偽)", "Error", "None"],
            "answer": "True (真)",
            "reason": "10は5より大きいため、この条件式は正しい（True）となります。"
        },
        {
            "id": 13,
            "category": "DataTypes",
            "question": "Pythonにおける「文字列」のデータ型は？",
            "options": ["int", "float", "str", "list"],
            "answer": "str",
            "reason": "strはString（文字列）の略です。intは整数、floatは小数を表します。"
        },
        {
            "id": 14,
            "category": "Logic",
            "question": "次のコードの実行結果は？ `a = 3; b = 4; print(a + b)`",
            "options": ["34", "7", "3", "4"],
            "answer": "7",
            "reason": "数値同士の足し算なので、3 + 4 = 7 となります。"
        },
        {
            "id": 15,
            "category": "Array",
            "question": "リスト `data = [10, 20, 30]` の `data[0]` の値は？",
            "options": ["10", "20", "30", "エラー"],
            "answer": "10",
            "reason": "プログラミングの添字（インデックス）は0から始まるため、[0]は最初の要素を指します。"
        },

        # ---------------------------------------------------------
        # SECTION 4: データベース & SQL (バックエンド実務)
        # ---------------------------------------------------------
        {
            "id": 16,
            "category": "Database",
            "question": "データベースからデータを「取得」するためのSQL命令は？",
            "options": ["INSERT", "UPDATE", "DELETE", "SELECT"],
            "answer": "SELECT",
            "reason": "データを検索・抽出するには SELECT 文を使用します。"
        },
        {
            "id": 17,
            "category": "Database",
            "question": "関係データベースにおいて「行」を表す用語は？",
            "options": ["テーブル", "フィールド (カラム)", "レコード", "スキーマ"],
            "answer": "レコード",
            "reason": "表全体をテーブル、縦列をフィールド（カラム）、横行をレコードと呼びます。"
        },
        {
            "id": 18,
            "category": "SQL",
            "question": "SQLで「氏名に『木』を含む人」を探す条件 `LIKE '%木%'` の `%` の意味は？",
            "options": ["1文字だけの任意の文字", "0文字以上の任意の文字列", "数字のみ", "空白のみ"],
            "answer": "0文字以上の任意の文字列",
            "reason": "% はワイルドカードと呼ばれ、どんな文字が何文字きても良いことを表します。"
        },
        {
            "id": 19,
            "category": "Database",
            "question": "データベースへの変更を確定し、保存する処理は？",
            "options": ["コミット (Commit)", "ロールバック", "ロック", "ログ"],
            "answer": "コミット (Commit)",
            "reason": "コミットするまでは変更は仮の状態です。コミットして初めて確定されます。"
        },
        {
            "id": 20,
            "category": "DevTools",
            "question": "ソースコードの変更履歴を管理するためのツールは？",
            "options": ["Git", "Slack", "Excel", "Zoom"],
            "answer": "Git",
            "reason": "Gitはエンジニア必須のバージョン管理システムです。"
        }
    ]


def get_question_by_id(question_id: int) -> Dict[str, Any] | None:
    """
    문제 ID로 문제 조회
    
    Args:
        question_id: 문제 번호 (1~20)
    
    Returns:
        문제 딕셔너리 또는 None
    """
    questions = get_it_questions()
    for q in questions:
        if q["id"] == question_id:
            return q
    return None
