import json
import os

import mysql.connector
from mysql.connector import Error


DB_CONFIG = {
    "host": os.environ.get("DB_HOST", "officialsite.kr"),
    "port": int(os.environ.get("DB_PORT", "23306")),
    "user": os.environ.get("DB_USER", "admin"),
    "password": os.environ.get("DB_PASSWORD", ""),
    "database": os.environ.get("DB_NAME", "app_master"),
}


ALTERS = [
    "ALTER TABLE babynote_temperament_tests ADD COLUMN result_page_config JSON NULL AFTER normalization_scale",
    "ALTER TABLE babynote_temperament_types ADD COLUMN result_image_url TEXT NULL AFTER parenting_tips",
    "ALTER TABLE babynote_temperament_types ADD COLUMN result_quote TEXT NULL AFTER result_image_url",
]


BACKFILL_TEST_LINKS = [
    (
        "questions",
        "UPDATE babynote_temperament_questions q "
        "JOIN babynote_temperament_tests t ON t.test_code = q.test_type "
        "SET q.test_id = t.id "
        "WHERE q.test_id IS NULL OR q.test_id = ''",
    ),
    (
        "types",
        "UPDATE babynote_temperament_types tp "
        "JOIN babynote_temperament_tests t ON t.test_code = tp.test_type "
        "SET tp.test_id = t.id "
        "WHERE tp.test_id IS NULL OR tp.test_id = ''",
    ),
    (
        "categories",
        "UPDATE babynote_temperament_categories c "
        "JOIN babynote_temperament_tests t ON t.test_code = c.test_type "
        "SET c.test_id = t.id "
        "WHERE c.test_id IS NULL OR c.test_id = ''",
    ),
]


CREATE_RESULT_CARDS = """
CREATE TABLE IF NOT EXISTS babynote_temperament_result_cards (
  id VARCHAR(36) PRIMARY KEY,
  type_id VARCHAR(36) NOT NULL,
  title VARCHAR(150) NULL,
  description TEXT NOT NULL,
  image_url TEXT NULL,
  order_index INT DEFAULT 0,
  is_active TINYINT(1) DEFAULT 1,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  INDEX idx_result_cards_type_order (type_id, is_active, order_index),
  CONSTRAINT fk_temperament_result_cards_type
    FOREIGN KEY (type_id) REFERENCES babynote_temperament_types(id)
    ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
"""


DEFAULT_RESULT_CONFIG = {
    "pageTitle": "{testName} 결과",
    "badgeText": "{testName} 지도",
    "graphTitle": "{testName} 그래프",
    "topTitle": "TOP 3 경향",
    "topDescription": "가장 또렷하게 나타난 영역이에요.",
    "behaviorTitle": "이런 모습이 자주 보여요",
    "guideTitle": "부모를 위한 맞춤 가이드",
    "journalTitle": "오늘 이렇게 기록해보세요",
    "journalPrompts": [
        "오늘 아이가 가장 많이 웃었던 순간은 언제였나요?",
        "익숙한 루틴 중 특히 좋아하는 것이 있었나요?",
        "어떤 소리나 활동에 눈을 반짝였나요?",
    ],
    "noticeTitle": "참고 안내",
    "noticeText": "이 결과는 아이의 일상 행동 패턴을 바탕으로 정리한 관찰 가이드예요. 아이의 발달은 개인차가 있으며 꾸준한 관찰을 통해 더 정확한 모습을 찾을 수 있어요.",
}


RESULT_CONFIG_OVERRIDES = {
    "growth": {
        "pageTitle": "우리 아기 성향 테스트 결과",
        "badgeText": "우리 아이 기질 지도",
        "graphTitle": "우리 아이 기질 그래프",
    },
    "fetal_movement": {
        "pageTitle": "태동 기질 테스트 결과",
        "badgeText": "우리 아기 태동 지도",
        "graphTitle": "우리 아기 태동 그래프",
        "topTitle": "TOP 3 태동 경향",
        "topDescription": "가장 또렷하게 느껴진 신호예요.",
        "behaviorTitle": "배 속에서 이런 모습이 자주 보여요",
        "guideTitle": "부모를 위한 맞춤 태교 가이드",
        "journalPrompts": [
            "오늘 태동이 가장 또렷했던 순간은 언제였나요?",
            "어떤 소리나 자세에서 반응이 달라졌나요?",
            "함께 나누고 싶은 태담은 무엇이었나요?",
        ],
        "noticeText": "이 결과는 태동 관찰을 바탕으로 만든 감성형 가이드이며 의학적 진단이 아니에요. 태동이 평소와 다르게 느껴지면 의료진과 상담해 주세요.",
    },
    "mind_frequency": {
        "pageTitle": "마음 주파수 체크 결과",
        "badgeText": "마음 주파수 체크 지도",
        "graphTitle": "마음 주파수 체크 그래프",
    },
    "child_interest": {
        "pageTitle": "우리 아이 관심사 테스트 결과",
        "badgeText": "우리 아이 관심사 지도",
        "graphTitle": "우리 아이 관심사 그래프",
        "topTitle": "TOP 3 관심사",
        "topDescription": "우리 아이가 가장 흥미를 보이는 영역이에요.",
    },
}


def build_default_config(test_code, test_name):
    config = json.loads(json.dumps(DEFAULT_RESULT_CONFIG, ensure_ascii=False))
    for key in ("pageTitle", "badgeText", "graphTitle"):
        config[key] = config[key].replace("{testName}", test_name)
    config.update(RESULT_CONFIG_OVERRIDES.get(test_code, {}))
    return config


def run():
    if not DB_CONFIG["password"]:
        raise RuntimeError("DB_PASSWORD environment variable is required")

    conn = None
    cursor = None
    try:
        conn = mysql.connector.connect(**DB_CONFIG)
        cursor = conn.cursor(dictionary=True)
        print("DB Connected")

        for query in ALTERS:
            try:
                cursor.execute(query)
                conn.commit()
                print("OK:", query)
            except Error as error:
                if error.errno == 1060:
                    print("SKIP (already exists):", query)
                else:
                    raise

        cursor.execute(CREATE_RESULT_CARDS)
        conn.commit()
        print("OK: create babynote_temperament_result_cards")

        for label, query in BACKFILL_TEST_LINKS:
            cursor.execute(query)
            print(f"OK: backfill {label} test_id ({cursor.rowcount} rows)")
        conn.commit()

        cursor.execute(
            "SELECT id, test_code, test_name, result_page_config "
            "FROM babynote_temperament_tests"
        )
        for row in cursor.fetchall():
            desired = build_default_config(row["test_code"], row["test_name"])
            if row["result_page_config"]:
                current = row["result_page_config"]
                if isinstance(current, str):
                    current = json.loads(current)
                generic = build_default_config("", row["test_name"])
                changed = False
                for key, value in RESULT_CONFIG_OVERRIDES.get(
                    row["test_code"], {}
                ).items():
                    if current.get(key) in (None, "", generic.get(key)):
                        current[key] = value
                        changed = True
                if not changed:
                    continue
                desired = current
            cursor.execute(
                "UPDATE babynote_temperament_tests "
                "SET result_page_config = %s WHERE id = %s",
                (json.dumps(desired, ensure_ascii=False), row["id"]),
            )
        conn.commit()
        print("OK: backfill default result page configuration")
        print("\n=== temperament result page migration completed ===")
    finally:
        if cursor is not None:
            cursor.close()
        if conn is not None and conn.is_connected():
            conn.close()
            print("DB connection closed")


if __name__ == "__main__":
    run()
