/**
 * Cookie 迁移准备（P6 硬化）
 *
 * - migrateTokenToCookie() - 将 localStorage token 迁移到 httpOnly cookie
 * - checkCookieSupport() - 检测浏览器是否支持 Secure + SameSite cookie
 * - isCookieMigrationEnabled() - 检查是否启用迁移（环境变量）
 * - 迁移状态枚举
 *
 * 注意：实际迁移在 iam refresh cookie 端点就绪后启用，此处仅做准备。
 * 关联：project_rules §4 安全规范（Cookie: httpOnly + Secure + SameSite=Strict）
 *       02-architecture-design.md §2.1 会话状态
 */

import { getObservabilityConfig } from "@/lib/observability/env";

/**
 * 迁移状态枚举。
 */
export enum CookieMigrationStatus {
  /** 未启用迁移 */
  Disabled = "disabled",
  /** 浏览器不支持必要的 Cookie 特性 */
  Unsupported = "unsupported",
  /** localStorage 中无 token，无需迁移 */
  NoToken = "no_token",
  /** 迁移进行中 */
  InProgress = "in_progress",
  /** 迁移成功 */
  Completed = "completed",
  /** 迁移失败（iam 端点未就绪或网络错误） */
  Failed = "failed",
}

/**
 * localStorage 中存储的 token key（与 auth.ts 保持一致）。
 *
 * 注意：此处直接引用 key 字符串，不导入 auth.ts，避免循环依赖。
 * auth.ts 使用 "edu_access_token"。
 */
const LEGACY_TOKEN_KEY = "edu_access_token";

/** iam refresh cookie 端点（端点就绪后启用） */
const IAM_REFRESH_COOKIE_ENDPOINT = "/api/v1/iam/auth/refresh-cookie";

/**
 * 检查是否启用 Cookie 迁移（通过环境变量控制）。
 *
 * 实际迁移在 iam refresh cookie 端点就绪后由运维开启。
 *
 * @returns 是否启用迁移
 */
export function isCookieMigrationEnabled(): boolean {
  return getObservabilityConfig().cookieMigrationEnabled;
}

/**
 * 检测浏览器是否支持 Secure + SameSite=Strict cookie。
 *
 * 通过设置测试 cookie 并读回验证。仅在浏览器环境运行。
 *
 * @returns 是否支持必要的 Cookie 特性
 */
export function checkCookieSupport(): boolean {
  if (typeof document === "undefined") return false;

  try {
    // 测试 Secure + SameSite=Strict cookie
    const testCookie = "edu_cookie_test=1; Secure; SameSite=Strict; max-age=1";
    document.cookie = testCookie;

    // 检查是否能读回（不支持 Secure 时 HTTPS 以外环境设置会失败）
    const supported = document.cookie.includes("edu_cookie_test");

    // 清理测试 cookie
    document.cookie =
      "edu_cookie_test=; Secure; SameSite=Strict; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT";

    return supported;
  } catch {
    return false;
  }
}

/**
 * 检测是否为 HTTPS 安全上下文（Secure cookie 需要）。
 */
export function isSecureContext(): boolean {
  if (typeof window === "undefined") return false;
  // window.isSecureContext 是标准 API
  return (
    typeof window.isSecureContext === "boolean" ? window.isSecureContext : false
  );
}

/**
 * 从 localStorage 读取 legacy token（仅检查是否存在，不暴露 token 值）。
 */
function hasLegacyToken(): boolean {
  if (typeof window === "undefined") return false;
  try {
    return localStorage.getItem(LEGACY_TOKEN_KEY) !== null;
  } catch {
    return false;
  }
}

/**
 * 将 localStorage token 迁移到 httpOnly cookie。
 *
 * 流程：
 * 1. 检查是否启用迁移（环境变量）
 * 2. 检查浏览器 Cookie 支持
 * 3. 检查 localStorage 是否有 token
 * 4. 调用 iam refresh cookie 端点（服务端设置 httpOnly cookie）
 * 5. 成功后清除 localStorage token
 *
 * 注意：iam refresh cookie 端点未就绪时返回 Failed，不影响现有功能。
 *
 * @returns 迁移状态
 */
export async function migrateTokenToCookie(): Promise<CookieMigrationStatus> {
  // 1. 检查是否启用迁移
  if (!isCookieMigrationEnabled()) {
    return CookieMigrationStatus.Disabled;
  }

  // 2. 检查浏览器 Cookie 支持
  if (!checkCookieSupport()) {
    return CookieMigrationStatus.Unsupported;
  }

  // 3. 检查 localStorage 是否有 token
  if (!hasLegacyToken()) {
    return CookieMigrationStatus.NoToken;
  }

  // 4. 调用 iam refresh cookie 端点
  // 端点未就绪时返回 Failed（不抛异常，不影响现有功能）
  try {
    const response = await fetch(IAM_REFRESH_COOKIE_ENDPOINT, {
      method: "POST",
      credentials: "include",
      headers: { "Content-Type": "application/json" },
    });

    if (!response.ok) {
      // iam 端点未就绪（404）或认证失败（401），返回 Failed
      return CookieMigrationStatus.Failed;
    }

    const data = (await response.json()) as { success?: boolean };
    if (!data.success) {
      return CookieMigrationStatus.Failed;
    }

    // 5. 成功后清除 localStorage token（httpOnly cookie 已由服务端设置）
    if (typeof window !== "undefined") {
      try {
        localStorage.removeItem(LEGACY_TOKEN_KEY);
      } catch {
        // 清除失败不影响迁移成功状态（cookie 已生效）
      }
    }

    return CookieMigrationStatus.Completed;
  } catch {
    // 网络错误或端点不可达
    return CookieMigrationStatus.Failed;
  }
}

/**
 * 检查迁移状态（非破坏性，不调用 iam 端点）。
 *
 * 用于在应用启动时判断是否需要提示用户或执行迁移。
 */
export function getMigrationStatus(): CookieMigrationStatus {
  if (!isCookieMigrationEnabled()) {
    return CookieMigrationStatus.Disabled;
  }
  if (!checkCookieSupport()) {
    return CookieMigrationStatus.Unsupported;
  }
  if (!hasLegacyToken()) {
    return CookieMigrationStatus.NoToken;
  }
  // 有 token 且环境支持，等待迁移
  return CookieMigrationStatus.InProgress;
}
