/**
 * 内部 app 平台 API 服务（FF AI Workspace "我的 Apps" 页用）
 * 模块: platform_internal_apps
 *
 * 仅 onboarding + 自助管理：token 颁发/撤销/查看状态 + app 列表查看。
 * 日常部署/日志/env/销毁全部走 Claude Code 对话（远程 MCP），本服务不暴露。
 *
 * 详见 docs/modules/internal-app-platform/05-ui-interaction-spec.md + 07-api.md
 */
import apiClient from '@/lib/api-client';

const API_PREFIX = '/internal-apps';

// ==================== Types（与 backend token.service.ts 对齐）====================

export type TokenBackendStatus = 'ACTIVE' | 'EXPIRED' | 'REVOKED';

/** GET /internal-apps/tokens/me 返回（与 token.service.getMyTokenStatus 对齐）*/
export interface TokenStatusResponse {
  hasToken: boolean;
  status: TokenBackendStatus | null;
  prefix: string | null;
  issuedAt: string | null;
  expiresAt: string | null;
  expiringInDays: number | null;
  lastUsedAt: string | null;
}

/** POST /internal-apps/tokens（颁发新 token）返回 */
export interface IssueTokenResponse {
  /** 明文 token——**仅本次响应可见**，复制到剪贴板后置空内存 */
  tokenPlaintext: string;
  /** MCP server endpoint URL */
  mcpEndpoint: string;
  /** 完整 `claude mcp add --transport http ...` 命令模板（含明文 token），员工在 shell 终端粘贴执行 */
  mcpAddCommand: string;
  /** 过期时间 ISO 字符串（serialize 后 Date → string） */
  expiresAt: string;
  employeeSlug: string;
}

export type AppStatus =
  | 'PENDING'
  | 'BUILDING'
  | 'HEALTHY'
  | 'FAILED'
  | 'DISABLED'
  | 'DESTROYED'
  | 'DISABLED_ARCHIVED'
  | 'PURGED';

export interface MyApp {
  id: string;
  appSlug: string;
  displayName: string | null;
  runtime: 'node' | 'static';
  status: AppStatus;
  url: string;
  lastDeployedAt: string | null;
  destroyedAt: string | null;
  retentionUntil: string | null;
}

// ==================== UI-derived helpers ====================

/** UI 显示态：把后端裸状态 + expiringInDays 翻译成 5 档可见态 */
export type TokenUiStatus = 'NONE' | 'ACTIVE' | 'EXPIRING' | 'EXPIRED' | 'REVOKED';

export function deriveTokenUiStatus(s: TokenStatusResponse): TokenUiStatus {
  if (!s.hasToken) return 'NONE';
  if (s.status === 'REVOKED') return 'REVOKED';
  if (s.status === 'EXPIRED') return 'EXPIRED';
  if (s.status === 'ACTIVE') {
    if (s.expiringInDays !== null && s.expiringInDays <= 7) return 'EXPIRING';
    return 'ACTIVE';
  }
  return 'NONE';
}

// ==================== API ====================

export async function getMyTokenStatus(): Promise<TokenStatusResponse> {
  return apiClient.get(`${API_PREFIX}/tokens/me`);
}

export async function issueToken(): Promise<IssueTokenResponse> {
  return apiClient.post(`${API_PREFIX}/tokens`, {});
}

export async function revokeToken(confirmText: 'REVOKE'): Promise<{ revokedAt: string | null }> {
  return apiClient.post(`${API_PREFIX}/tokens/revoke`, { confirmText });
}

export async function listMyApps(includeDestroyed = false): Promise<{ apps: MyApp[] }> {
  return apiClient.get(`${API_PREFIX}/me/apps`, {
    params: includeDestroyed ? { includeDestroyed: 'true' } : undefined,
  });
}
