#!/usr/bin/env python3
"""Initialize the FineCure MySQL schema and tables."""

from __future__ import annotations

import os
import sys
from pathlib import Path

try:
    import pymysql
except ImportError as exc:  # pragma: no cover
    raise SystemExit(
        "PyMySQL is required. Install it with: python -m pip install PyMySQL"
    ) from exc


ROOT_DIR = Path(__file__).resolve().parents[1]
ENV_PATH = ROOT_DIR / ".env"


def load_env_file(path: Path) -> None:
    if not path.exists():
        return

    for raw_line in path.read_text(encoding="utf-8").splitlines():
        line = raw_line.strip()
        if not line or line.startswith("#") or "=" not in line:
            continue
        key, value = line.split("=", 1)
        os.environ.setdefault(key.strip(), value.strip())


def get_config() -> dict[str, object]:
    load_env_file(ENV_PATH)
    return {
        "host": os.getenv("DB_HOST", "officialsite.kr"),
        "port": int(os.getenv("DB_PORT", "23306")),
        "user": os.getenv("DB_USER", "admin"),
        "password": os.getenv("DB_PASSWORD", "dlgks~123"),
        "database": os.getenv("DB_NAME", "fincure"),
        "charset": "utf8mb4",
        "autocommit": True,
        "cursorclass": pymysql.cursors.DictCursor,
    }


def execute_statements(cursor: pymysql.cursors.Cursor, statements: list[str]) -> None:
    for statement in statements:
        cursor.execute(statement)


def ensure_column_exists(
    cursor: pymysql.cursors.Cursor,
    *,
    table_name: str,
    column_name: str,
    add_statement: str,
) -> None:
    cursor.execute(
        """
        SELECT COUNT(*) AS count
        FROM information_schema.columns
        WHERE table_schema = DATABASE()
          AND table_name = %s
          AND column_name = %s
        """,
        (table_name, column_name),
    )
    row = cursor.fetchone()
    if not row or int(row["count"]) == 0:
        cursor.execute(add_statement)


def ensure_index_exists(
    cursor: pymysql.cursors.Cursor,
    *,
    table_name: str,
    index_name: str,
    create_statement: str,
) -> None:
    cursor.execute(
        """
        SELECT COUNT(*) AS count
        FROM information_schema.statistics
        WHERE table_schema = DATABASE()
          AND table_name = %s
          AND index_name = %s
        """,
        (table_name, index_name),
    )
    row = cursor.fetchone()
    if not row or int(row["count"]) == 0:
        cursor.execute(create_statement)


def main() -> int:
    config = get_config()
    database_name = str(config["database"])
    base_config = {key: value for key, value in config.items() if key != "database"}

    print(f"Connecting to MySQL {config['host']}:{config['port']} as {config['user']}...")

    with pymysql.connect(**base_config) as connection:
        with connection.cursor() as cursor:
            cursor.execute(
                f"CREATE DATABASE IF NOT EXISTS `{database_name}` "
                "CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
            )
            cursor.execute(f"USE `{database_name}`")

            statements = [
                """
                CREATE TABLE IF NOT EXISTS users (
                  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
                  email VARCHAR(255) NOT NULL,
                  password VARCHAR(255) NOT NULL,
                  name VARCHAR(100) NOT NULL,
                  phone VARCHAR(50) NULL,
                  business_registration_number VARCHAR(50) NOT NULL,
                  firm_name VARCHAR(255) NOT NULL,
                  address VARCHAR(500) NOT NULL,
                  specialization VARCHAR(255) NOT NULL,
                  license_number VARCHAR(100) NOT NULL,
                  subscription_status ENUM('INACTIVE', 'ACTIVE', 'EXPIRED', 'CANCELLED') NOT NULL DEFAULT 'INACTIVE',
                  subscription_end_date DATETIME NULL,
                  role ENUM('USER', 'ADMIN') NOT NULL DEFAULT 'USER',
                  is_active BOOLEAN NOT NULL DEFAULT TRUE,
                  reset_token VARCHAR(255) NULL,
                  reset_token_expires DATETIME NULL,
                  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
                  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                  PRIMARY KEY (id),
                  UNIQUE KEY uq_users_email (email),
                  KEY idx_users_subscription (subscription_status),
                  KEY idx_users_active (is_active)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
                COMMENT='회원 계정, 인증, 구독 상태를 관리하는 사용자 기본 정보 테이블'
                """,
                """
                CREATE TABLE IF NOT EXISTS cases (
                  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
                  user_id BIGINT UNSIGNED NOT NULL,
                  title VARCHAR(255) NULL,
                  client_name VARCHAR(255) NULL,
                  case_type ENUM('recovery', 'bankruptcy') NOT NULL,
                  applicant_name VARCHAR(255) NOT NULL,
                  applicant_birth_year VARCHAR(4) NULL,
                  applicant_phone VARCHAR(50) NULL,
                  case_number VARCHAR(100) NULL,
                  document_id BIGINT UNSIGNED NULL,
                  memo TEXT NULL,
                  registration_date DATE NOT NULL,
                  recovery_status VARCHAR(50) NULL DEFAULT 'NEW',
                  bankruptcy_status VARCHAR(50) NULL DEFAULT 'NEW',
                  has_manual_edit BOOLEAN NOT NULL DEFAULT FALSE,
                  has_differential_plan BOOLEAN NOT NULL DEFAULT FALSE,
                  differential_plan_data LONGTEXT NULL,
                  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
                  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                  PRIMARY KEY (id),
                  KEY idx_cases_user_created (user_id, created_at),
                  KEY idx_cases_case_number (case_number),
                  CONSTRAINT fk_cases_user
                    FOREIGN KEY (user_id) REFERENCES users(id)
                    ON DELETE CASCADE
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
                COMMENT='개인회생 및 파산 사건의 기본 정보와 진행 상태를 관리하는 사건 테이블'
                """,
                """
                CREATE TABLE IF NOT EXISTS documents (
                  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
                  title VARCHAR(255) NOT NULL,
                  document_type VARCHAR(100) NOT NULL,
                  case_id BIGINT UNSIGNED NULL,
                  content LONGTEXT NOT NULL,
                  user_id BIGINT UNSIGNED NOT NULL,
                  status ENUM('DRAFT', 'REVIEW', 'APPROVED', 'SUBMITTED') NOT NULL DEFAULT 'DRAFT',
                  version INT NOT NULL DEFAULT 1,
                  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
                  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                  PRIMARY KEY (id),
                  KEY idx_documents_user_created (user_id, created_at),
                  KEY idx_documents_case (case_id),
                  CONSTRAINT fk_documents_user
                    FOREIGN KEY (user_id) REFERENCES users(id)
                    ON DELETE CASCADE,
                  CONSTRAINT fk_documents_case
                    FOREIGN KEY (case_id) REFERENCES cases(id)
                    ON DELETE SET NULL
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
                COMMENT='사용자가 생성한 문서 본문, 상태, 버전을 관리하는 문서 저장 테이블'
                """,
                """
                CREATE TABLE IF NOT EXISTS document_drafts (
                  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
                  user_id BIGINT UNSIGNED NOT NULL,
                  document_type VARCHAR(100) NOT NULL,
                  page_number INT NOT NULL,
                  form_data LONGTEXT NOT NULL,
                  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
                  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                  PRIMARY KEY (id),
                  UNIQUE KEY uq_document_drafts_user_type_page (user_id, document_type, page_number),
                  CONSTRAINT fk_document_drafts_user
                    FOREIGN KEY (user_id) REFERENCES users(id)
                    ON DELETE CASCADE
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
                COMMENT='문서 작성 중 페이지별 임시저장 데이터를 관리하는 드래프트 테이블'
                """,
                """
                CREATE TABLE IF NOT EXISTS document_page_drafts (
                  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
                  user_id BIGINT UNSIGNED NOT NULL,
                  case_id BIGINT UNSIGNED NOT NULL,
                  document_type VARCHAR(100) NOT NULL,
                  page_id VARCHAR(50) NOT NULL,
                  form_data LONGTEXT NOT NULL,
                  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
                  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                  PRIMARY KEY (id),
                  UNIQUE KEY uq_document_page_drafts_case_type_page (case_id, document_type, page_id),
                  KEY idx_document_page_drafts_user_case (user_id, case_id),
                  CONSTRAINT fk_document_page_drafts_user
                    FOREIGN KEY (user_id) REFERENCES users(id)
                    ON DELETE CASCADE,
                  CONSTRAINT fk_document_page_drafts_case
                    FOREIGN KEY (case_id) REFERENCES cases(id)
                    ON DELETE CASCADE
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
                COMMENT='사건별 문서 작성 페이지 데이터를 페이지 단위로 저장하는 드래프트 테이블'
                """,
                """
                CREATE TABLE IF NOT EXISTS money_lender_directory (
                  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
                  sequence_no INT NULL,
                  registration_number VARCHAR(100) NULL,
                  company_name VARCHAR(255) NOT NULL,
                  search_name VARCHAR(255) NOT NULL,
                  search_registration_number VARCHAR(100) NULL,
                  corporate_registration_number VARCHAR(100) NULL,
                  head_office_flag VARCHAR(50) NULL,
                  business_description VARCHAR(255) NULL,
                  representative_name VARCHAR(100) NULL,
                  lot_address VARCHAR(500) NULL,
                  road_address VARCHAR(500) NULL,
                  phone_number VARCHAR(255) NULL,
                  advertising_phone_number VARCHAR(255) NULL,
                  search_phone VARCHAR(255) NULL,
                  registration_authority VARCHAR(100) NULL,
                  operating_status VARCHAR(100) NULL,
                  source_file_name VARCHAR(255) NULL,
                  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
                  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                  PRIMARY KEY (id)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
                COMMENT='등록대부업체 통합조회 엑셀 원본을 기반으로 문서작성 자동완성에 사용하는 대부업체 디렉터리'
                """,
                """
                CREATE TABLE IF NOT EXISTS payments (
                  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
                  user_id BIGINT UNSIGNED NOT NULL,
                  amount INT NOT NULL,
                  subscription_months INT NOT NULL,
                  status ENUM('PENDING', 'COMPLETED', 'FAILED', 'CANCELED') NOT NULL DEFAULT 'PENDING',
                  transaction_id VARCHAR(255) NULL,
                  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
                  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                  PRIMARY KEY (id),
                  KEY idx_payments_user_created (user_id, created_at),
                  KEY idx_payments_status (status),
                  CONSTRAINT fk_payments_user
                    FOREIGN KEY (user_id) REFERENCES users(id)
                    ON DELETE CASCADE
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
                COMMENT='구독 결제 생성, 승인, 이력 관리를 위한 결제 테이블'
                """,
                """
                ALTER TABLE users
                  MODIFY COLUMN id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '회원 고유 ID',
                  MODIFY COLUMN email VARCHAR(255) NOT NULL COMMENT '로그인 및 식별용 이메일 주소',
                  MODIFY COLUMN password VARCHAR(255) NOT NULL COMMENT 'bcrypt 해시 비밀번호',
                  MODIFY COLUMN name VARCHAR(100) NOT NULL COMMENT '회원 이름',
                  MODIFY COLUMN phone VARCHAR(50) NULL COMMENT '회원 연락처',
                  MODIFY COLUMN business_registration_number VARCHAR(50) NOT NULL COMMENT '사업자등록번호',
                  MODIFY COLUMN firm_name VARCHAR(255) NOT NULL COMMENT '사무소 또는 법인명',
                  MODIFY COLUMN address VARCHAR(500) NOT NULL COMMENT '사업장 주소',
                  MODIFY COLUMN specialization VARCHAR(255) NOT NULL COMMENT '전문 분야',
                  MODIFY COLUMN license_number VARCHAR(100) NOT NULL COMMENT '등록 또는 면허 번호',
                  MODIFY COLUMN subscription_status ENUM('INACTIVE', 'ACTIVE', 'EXPIRED', 'CANCELLED') NOT NULL DEFAULT 'INACTIVE' COMMENT '구독 상태',
                  MODIFY COLUMN subscription_end_date DATETIME NULL COMMENT '구독 만료 일시',
                  MODIFY COLUMN role ENUM('USER', 'ADMIN') NOT NULL DEFAULT 'USER' COMMENT '권한 역할',
                  MODIFY COLUMN is_active BOOLEAN NOT NULL DEFAULT TRUE COMMENT '계정 활성 여부',
                  MODIFY COLUMN reset_token VARCHAR(255) NULL COMMENT '비밀번호 재설정 토큰 해시',
                  MODIFY COLUMN reset_token_expires DATETIME NULL COMMENT '비밀번호 재설정 토큰 만료 일시',
                  MODIFY COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 일시',
                  MODIFY COLUMN updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
                  COMMENT = '회원 계정, 인증, 구독 상태를 관리하는 사용자 기본 정보 테이블'
                """,
                """
                ALTER TABLE cases
                  MODIFY COLUMN id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '사건 고유 ID',
                  MODIFY COLUMN user_id BIGINT UNSIGNED NOT NULL COMMENT '사건 소유 회원 ID',
                  MODIFY COLUMN title VARCHAR(255) NULL COMMENT '사건 제목',
                  MODIFY COLUMN client_name VARCHAR(255) NULL COMMENT '의뢰인 표시명',
                  MODIFY COLUMN case_type ENUM('recovery', 'bankruptcy') NOT NULL COMMENT '사건 유형',
                  MODIFY COLUMN applicant_name VARCHAR(255) NOT NULL COMMENT '신청인 이름',
                  MODIFY COLUMN applicant_birth_year VARCHAR(4) NULL COMMENT '신청인 출생연도',
                  MODIFY COLUMN applicant_phone VARCHAR(50) NULL COMMENT '신청인 연락처',
                  MODIFY COLUMN case_number VARCHAR(100) NULL COMMENT '법원 사건번호',
                  MODIFY COLUMN document_id BIGINT UNSIGNED NULL COMMENT '대표 연결 문서 ID',
                  MODIFY COLUMN memo TEXT NULL COMMENT '사건 메모',
                  MODIFY COLUMN registration_date DATE NOT NULL COMMENT '사건 등록일',
                  MODIFY COLUMN recovery_status VARCHAR(50) NULL DEFAULT 'NEW' COMMENT '개인회생 진행 상태',
                  MODIFY COLUMN bankruptcy_status VARCHAR(50) NULL DEFAULT 'NEW' COMMENT '파산 진행 상태',
                  MODIFY COLUMN has_manual_edit BOOLEAN NOT NULL DEFAULT FALSE COMMENT '수기 수정 여부',
                  MODIFY COLUMN has_differential_plan BOOLEAN NOT NULL DEFAULT FALSE COMMENT '차등 변제 계획 여부',
                  MODIFY COLUMN differential_plan_data LONGTEXT NULL COMMENT '차등 변제 계획 상세 데이터 JSON',
                  MODIFY COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 일시',
                  MODIFY COLUMN updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
                  COMMENT = '개인회생 및 파산 사건의 기본 정보와 진행 상태를 관리하는 사건 테이블'
                """,
                """
                ALTER TABLE documents
                  MODIFY COLUMN id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '문서 고유 ID',
                  MODIFY COLUMN title VARCHAR(255) NOT NULL COMMENT '문서 제목',
                  MODIFY COLUMN document_type VARCHAR(100) NOT NULL COMMENT '문서 유형',
                  MODIFY COLUMN case_id BIGINT UNSIGNED NULL COMMENT '연결된 사건 ID',
                  MODIFY COLUMN content LONGTEXT NOT NULL COMMENT '문서 본문 JSON 데이터',
                  MODIFY COLUMN user_id BIGINT UNSIGNED NOT NULL COMMENT '문서 작성자 회원 ID',
                  MODIFY COLUMN status ENUM('DRAFT', 'REVIEW', 'APPROVED', 'SUBMITTED') NOT NULL DEFAULT 'DRAFT' COMMENT '문서 상태',
                  MODIFY COLUMN version INT NOT NULL DEFAULT 1 COMMENT '문서 버전',
                  MODIFY COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 일시',
                  MODIFY COLUMN updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
                  COMMENT = '사용자가 생성한 문서 본문, 상태, 버전을 관리하는 문서 저장 테이블'
                """,
                """
                ALTER TABLE document_drafts
                  MODIFY COLUMN id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '임시저장 고유 ID',
                  MODIFY COLUMN user_id BIGINT UNSIGNED NOT NULL COMMENT '임시저장 소유 회원 ID',
                  MODIFY COLUMN document_type VARCHAR(100) NOT NULL COMMENT '문서 유형',
                  MODIFY COLUMN page_number INT NOT NULL COMMENT '작성 페이지 번호',
                  MODIFY COLUMN form_data LONGTEXT NOT NULL COMMENT '페이지별 임시저장 JSON 데이터',
                  MODIFY COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 일시',
                  MODIFY COLUMN updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
                  COMMENT = '문서 작성 중 페이지별 임시저장 데이터를 관리하는 드래프트 테이블'
                """,
                """
                ALTER TABLE document_page_drafts
                  MODIFY COLUMN id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '페이지 임시저장 고유 ID',
                  MODIFY COLUMN user_id BIGINT UNSIGNED NOT NULL COMMENT '페이지 임시저장 소유 회원 ID',
                  MODIFY COLUMN case_id BIGINT UNSIGNED NOT NULL COMMENT '연결된 사건 ID',
                  MODIFY COLUMN document_type VARCHAR(100) NOT NULL COMMENT '문서 유형',
                  MODIFY COLUMN page_id VARCHAR(50) NOT NULL COMMENT '페이지 식별자',
                  MODIFY COLUMN form_data LONGTEXT NOT NULL COMMENT '페이지별 임시저장 JSON 데이터',
                  MODIFY COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 일시',
                  MODIFY COLUMN updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
                  COMMENT = '사건별 문서 작성 페이지 데이터를 페이지 단위로 저장하는 드래프트 테이블'
                """,
                """
                ALTER TABLE money_lender_directory
                  MODIFY COLUMN id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '대부업체 디렉터리 고유 ID',
                  MODIFY COLUMN sequence_no INT NULL COMMENT '원본 엑셀 순번',
                  MODIFY COLUMN registration_number VARCHAR(100) NULL COMMENT '등록증번호',
                  MODIFY COLUMN company_name VARCHAR(255) NOT NULL COMMENT '업체명',
                  MODIFY COLUMN search_name VARCHAR(255) NOT NULL COMMENT '공백/구분문자 제거 검색용 업체명',
                  MODIFY COLUMN search_registration_number VARCHAR(100) NULL COMMENT '공백/구분문자 제거 검색용 등록증번호',
                  MODIFY COLUMN corporate_registration_number VARCHAR(100) NULL COMMENT '법인등록번호',
                  MODIFY COLUMN head_office_flag VARCHAR(50) NULL COMMENT '본점 여부',
                  MODIFY COLUMN business_description VARCHAR(255) NULL COMMENT '사업내용',
                  MODIFY COLUMN representative_name VARCHAR(100) NULL COMMENT '대표자',
                  MODIFY COLUMN lot_address VARCHAR(500) NULL COMMENT '소재지(지번주소)',
                  MODIFY COLUMN road_address VARCHAR(500) NULL COMMENT '소재지(도로명)',
                  MODIFY COLUMN phone_number VARCHAR(255) NULL COMMENT '전화번호',
                  MODIFY COLUMN advertising_phone_number VARCHAR(255) NULL COMMENT '광고용 전화번호',
                  MODIFY COLUMN search_phone VARCHAR(255) NULL COMMENT '공백/구분문자 제거 검색용 전화번호',
                  MODIFY COLUMN registration_authority VARCHAR(100) NULL COMMENT '등록기관',
                  MODIFY COLUMN operating_status VARCHAR(100) NULL COMMENT '운영상태',
                  MODIFY COLUMN source_file_name VARCHAR(255) NULL COMMENT '원본 파일명',
                  MODIFY COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 일시',
                  MODIFY COLUMN updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
                  COMMENT = '등록대부업체 통합조회 엑셀 원본을 기반으로 문서작성 자동완성에 사용하는 대부업체 디렉터리'
                """,
                """
                ALTER TABLE payments
                  MODIFY COLUMN id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '결제 고유 ID',
                  MODIFY COLUMN user_id BIGINT UNSIGNED NOT NULL COMMENT '결제 회원 ID',
                  MODIFY COLUMN amount INT NOT NULL COMMENT '결제 금액',
                  MODIFY COLUMN subscription_months INT NOT NULL COMMENT '구독 개월 수',
                  MODIFY COLUMN status ENUM('PENDING', 'COMPLETED', 'FAILED', 'CANCELED') NOT NULL DEFAULT 'PENDING' COMMENT '결제 상태',
                  MODIFY COLUMN transaction_id VARCHAR(255) NULL COMMENT '외부 결제사 거래 키',
                  MODIFY COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 일시',
                  MODIFY COLUMN updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
                  COMMENT = '구독 결제 생성, 승인, 이력 관리를 위한 결제 테이블'
                """,
            ]

            execute_statements(cursor, statements)
            ensure_column_exists(
                cursor,
                table_name="cases",
                column_name="last_draft_page",
                add_statement="""
                ALTER TABLE cases
                  ADD COLUMN last_draft_page VARCHAR(50) NULL
                  COMMENT '마지막으로 작성 또는 열람한 문서 페이지 ID'
                  AFTER differential_plan_data
                """,
            )
            ensure_index_exists(
                cursor,
                table_name="cases",
                index_name="idx_cases_user_type_created",
                create_statement="""
                CREATE INDEX idx_cases_user_type_created
                ON cases (user_id, case_type, created_at)
                """,
            )
            ensure_index_exists(
                cursor,
                table_name="documents",
                index_name="idx_documents_user_case_type_updated",
                create_statement="""
                CREATE INDEX idx_documents_user_case_type_updated
                ON documents (user_id, case_id, document_type, updated_at)
                """,
            )
            ensure_index_exists(
                cursor,
                table_name="documents",
                index_name="idx_documents_case_updated",
                create_statement="""
                CREATE INDEX idx_documents_case_updated
                ON documents (case_id, updated_at)
                """,
            )
            ensure_index_exists(
                cursor,
                table_name="document_page_drafts",
                index_name="idx_document_page_drafts_lookup",
                create_statement="""
                CREATE INDEX idx_document_page_drafts_lookup
                ON document_page_drafts (user_id, case_id, document_type, page_id, updated_at)
                """,
            )
            ensure_index_exists(
                cursor,
                table_name="money_lender_directory",
                index_name="idx_money_lender_company_name",
                create_statement="""
                CREATE INDEX idx_money_lender_company_name
                ON money_lender_directory (company_name)
                """,
            )
            ensure_index_exists(
                cursor,
                table_name="money_lender_directory",
                index_name="idx_money_lender_search_name",
                create_statement="""
                CREATE INDEX idx_money_lender_search_name
                ON money_lender_directory (search_name)
                """,
            )
            ensure_index_exists(
                cursor,
                table_name="money_lender_directory",
                index_name="idx_money_lender_registration_number",
                create_statement="""
                CREATE INDEX idx_money_lender_registration_number
                ON money_lender_directory (registration_number)
                """,
            )
            ensure_index_exists(
                cursor,
                table_name="money_lender_directory",
                index_name="idx_money_lender_operating_status",
                create_statement="""
                CREATE INDEX idx_money_lender_operating_status
                ON money_lender_directory (operating_status)
                """,
            )

    print(f"Database `{database_name}` is ready.")
    return 0


if __name__ == "__main__":
    sys.exit(main())
