from __future__ import annotations
import os
from pathlib import Path
from datetime import timedelta


# ─────────────────────────────────────────────────────────────
# 경로 기본값
# ─────────────────────────────────────────────────────────────
BASE_DIR = Path(__file__).resolve().parent

# 앱 데이터 루트(로그/업로드/백업 등) → 환경변수 APP_DATA_DIR 우선, 없으면 ./data
DATA_DIR = Path(os.getenv("APP_DATA_DIR", BASE_DIR / "data")).resolve()

# backend/instance 는 항상 유지 (DB 등)
INSTANCE_DIR = BASE_DIR / "backend" / "instance"
INSTANCE_DIR.mkdir(parents=True, exist_ok=True)

# data/ 하위 보조 디렉토리
(DATA_DIR / "logs").mkdir(parents=True, exist_ok=True)
(DATA_DIR / "uploads").mkdir(parents=True, exist_ok=True)
(DATA_DIR / "temp_zips").mkdir(parents=True, exist_ok=True)
(DATA_DIR / "xml").mkdir(parents=True, exist_ok=True)
(DATA_DIR / "scripts").mkdir(parents=True, exist_ok=True)
(DATA_DIR / "idrac_info").mkdir(parents=True, exist_ok=True)
(DATA_DIR / "mac").mkdir(parents=True, exist_ok=True)
(DATA_DIR / "guid_file").mkdir(parents=True, exist_ok=True)
(DATA_DIR / "gpu_serial").mkdir(parents=True, exist_ok=True)
(DATA_DIR / "mac_backup").mkdir(parents=True, exist_ok=True)
(DATA_DIR / "server_list").mkdir(parents=True, exist_ok=True)
(DATA_DIR / "temp_ip").mkdir(parents=True, exist_ok=True)


class Config:
    """
    운영 시에는 환경변수(.env)로 민감정보를 설정하세요.
    DB는 기본적으로 backend/instance/site.db 를 사용합니다.
    """

    # ── 보안
    SECRET_KEY = os.environ.get("SECRET_KEY", "change-me")  # 반드시 환경변수로 고정 권장

    # ── Redfish
    REDFISH_TIMEOUT = int(os.environ.get("REDFISH_TIMEOUT", 15))
    REDFISH_VERIFY_SSL = os.environ.get("REDFISH_VERIFY_SSL", "false").lower() == "true"

    # ── DB (환경변수 DATABASE_URL 있으면 그 값을 우선 사용)
    sqlite_path = (INSTANCE_DIR / "site.db").as_posix()
    SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL", f"sqlite:///{sqlite_path}")
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    # ── Telegram (미설정 시 기능 비활성처럼 동작)
    TELEGRAM_BOT_TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN", "")
    TELEGRAM_CHAT_ID = os.environ.get("TELEGRAM_CHAT_ID", "")

    # ── 앱 폴더 경로 (문자열)
    UPLOAD_FOLDER = (DATA_DIR / "temp_ip").as_posix()
    BACKUP_FOLDER = (DATA_DIR / "backup").as_posix()
    TEMP_ZIP_FOLDER = (DATA_DIR / "temp_zips").as_posix()
    XML_FOLDER = (DATA_DIR / "xml").as_posix()
    SCRIPT_FOLDER = (DATA_DIR / "scripts").as_posix()
    IDRAC_INFO_FOLDER = (DATA_DIR / "idrac_info").as_posix()
    MAC_FOLDER = (DATA_DIR / "mac").as_posix()
    GUID_FOLDER = (DATA_DIR / "guid_file").as_posix()
    GPU_FOLDER = (DATA_DIR / "gpu_serial").as_posix()
    MAC_BACKUP_FOLDER = (DATA_DIR / "mac_backup").as_posix()
    SERVER_LIST_FOLDER = (DATA_DIR / "server_list").as_posix()
    LOG_FOLDER = (DATA_DIR / "logs").as_posix()

    # ── 업로드/파일
    ALLOWED_EXTENSIONS = {"xml"}
    MAX_CONTENT_LENGTH = int(os.getenv("MAX_CONTENT_LENGTH", 10 * 1024 * 1024))  # 10MB

    # ── 페이지네이션/병렬
    FILES_PER_PAGE = int(os.getenv("FILES_PER_PAGE", 35))
    BACKUP_FILES_PER_PAGE = int(os.getenv("BACKUP_FILES_PER_PAGE", 3))
    MAX_WORKERS = int(os.getenv("MAX_WORKERS", 60))

    # ── 세션
    PERMANENT_SESSION_LIFETIME = timedelta(minutes=int(os.getenv("SESSION_MINUTES", 30)))

    # ── SocketIO
    # threading / eventlet / gevent 중 선택. 기본은 threading (Windows 안정)
    SOCKETIO_ASYNC_MODE = os.getenv("SOCKETIO_ASYNC_MODE", "threading")

    # ─────────────────────────────────────────────────────────
    # ✅ 개발 환경에서 쿠키 저장/리다이렉트 문제 방지용 설정
    # 로컬(HTTP)에서도 세션/remember 토큰이 저장되도록 Secure 비활성
    SESSION_COOKIE_SECURE = False
    REMEMBER_COOKIE_SECURE = False
    SESSION_COOKIE_SAMESITE = "Lax"
    SESSION_COOKIE_DOMAIN = None