import http from './http'
import type { LoginRequest, LoginResponse, MeResponse, Scope } from '@/types/auth'
import { mockLogin } from '@/mock/server'

// 是否走前端 Mock。由 VITE_USE_MOCK 控制：
//   - .env.development 默认 'true'  → 本地无后端即可联调
//   - .env.production  默认 'false' → 生产强制走 Platform.Server 真实 API
// 任何不等于字符串 'true' 的取值都视为 false，避免 build 时静态替换出错。
const MOCK = import.meta.env.VITE_USE_MOCK === 'true'

export async function login(req: LoginRequest): Promise<LoginResponse> {
  if (MOCK) return mockLogin(req)
  const { data } = await http.post<LoginResponse>('/auth/login', req)
  return data
}

export async function logout(): Promise<void> {
  if (MOCK) return
  await http.post('/auth/logout')
}

/**
 * AR-6 (会话 45)：服务端切换 scope 并重发 token + perms。
 * 替代过去 stores/auth.ts switchScope 客户端硬编码 allowedOps 的伪权限做法。
 * Mock 模式下退化为本地翻转 scope（mockLogin 已经依据 scope 返回不同 perms）。
 */
export async function switchScope(scope: Scope): Promise<LoginResponse> {
  if (MOCK) {
    // mock 直接复用 mockLogin 的 perm 推算逻辑，伪造一次「免密码登录」。
    return mockLogin({ username: 'mock-user', password: 'mock', scope })
  }
  const { data } = await http.post<LoginResponse>('/auth/switch-scope', { scope })
  return data
}

/**
 * 拿当前 token / Cookie 让后端实校一次身份。成功表示 token 仍被服务端接受，
 * 失败（401）由 http 拦截器统一清 state + 跳 /login。
 *
 * 解决「Platform.Server 随机 secret 重启 → 老 token 失效 → 前端 isAuthed 仍 true 误放行」的窗口。
 */
export async function getMe(): Promise<MeResponse> {
  if (MOCK) {
    // mock 模式下没有 secret 概念，本地 store 里有什么就是什么；直接 throw 让守卫
    // 走「认可本地状态」分支，避免 mock 联调误判为「身份失效」。
    throw new Error('mock-mode-skip-me-validation')
  }
  const { data } = await http.get<MeResponse>('/auth/me')
  return data
}
