import { z } from "zod"

export const DevToolActionGroupSchema = z.enum([
    "deploy",
    "database",
    "remote-api",
    "remote-front",
    "local-api",
    "local-front",
])

export const DevToolPageSchema = z.enum([
    "build",
    "deploy",
    "releases",
    "database",
    "runtime",
    "profiles",
])

export const DevToolTaskStatusSchema = z.enum([
    "queued",
    "running",
    "succeeded",
    "failed",
])

export const DevToolProcessStatusSchema = z.enum([
    "running",
    "stopped",
    "degraded",
    "unknown",
    "untracked",
    "not-configured",
    "self",
])

export const DevToolProcessActivitySchema = z.enum([
    "idle",
    "checking",
    "starting",
    "stopping",
    "restarting",
])

export const DevToolProcessPresentationSchema = z.enum([
    "runtime-service",
    "static-site",
])

export const DevToolPublicReachabilityStatusSchema = z.enum([
    "reachable",
    "unreachable",
    "untested",
])

export const DevToolPublicReachabilityDetailSchema = z.enum([
    "http-ok",
    "http-error",
    "timeout",
    "network-error",
])

export const DevToolTerminalTargetSchema = z.enum([
    "local-front",
    "local-api",
])

export const DevToolTerminalSessionStatusSchema = z.enum([
    "open",
    "closed",
])

export const DevToolProcessLogsModeSchema = z.enum([
    "snapshot",
    "append",
    "reset",
])

export const DevToolPublicReachabilitySchema = z.object({
    url: z.string().trim().min(1).nullable(),
    status: DevToolPublicReachabilityStatusSchema,
    detail: DevToolPublicReachabilityDetailSchema.nullable(),
    httpStatus: z.number().int().min(100).max(599).nullable(),
    checkedAt: z.string().trim().min(1).nullable(),
})

export const DevToolProcessUrlCheckSchema = z.object({
    key: z.string().trim().min(1),
    label: z.string().trim().min(1),
    url: z.string().trim().min(1),
    kind: z.enum(["direct", "public"]),
    reachability: DevToolPublicReachabilitySchema,
    note: z.string().nullable(),
})

export const DevToolActionSupportSchema = z.object({
    releaseName: z.boolean(),
    projectKeys: z.boolean(),
    skipVerify: z.boolean(),
    skipInstall: z.boolean(),
    skipMigration: z.boolean(),
    confirmDangerous: z.boolean(),
})

export const DevToolBuildProjectSchema = z.object({
    key: z.string().trim().min(1),
    label: z.string().trim().min(1),
    status: z.enum(["missing", "ready"]),
    artifactsPath: z.string().trim().min(1).nullable(),
    sourcePath: z.string().trim().min(1).nullable(),
    note: z.string().nullable(),
})

export const DevToolBuildChannelSchema = z.object({
    channel: z.enum(["api", "front"]),
    label: z.string().trim().min(1),
    requestedReleaseName: z.string().trim().min(1).nullable(),
    releaseName: z.string().trim().min(1).nullable(),
    releaseSelected: z.boolean(),
    buildManifestAvailable: z.boolean(),
    artifactsDirectory: z.string().trim().min(1).nullable(),
    buildManifestPath: z.string().trim().min(1).nullable(),
    builtAt: z.string().trim().min(1).nullable(),
    projects: z.array(DevToolBuildProjectSchema),
    note: z.string().nullable(),
})

export const DevToolBuildSummarySchema = z.object({
    requestedReleaseName: z.string().trim().min(1).nullable(),
    releaseName: z.string().trim().min(1).nullable(),
    releaseSelected: z.boolean(),
    buildManifestAvailable: z.boolean(),
    artifactsDirectory: z.string().trim().min(1).nullable(),
    buildManifestPath: z.string().trim().min(1).nullable(),
    builtAt: z.string().trim().min(1).nullable(),
    projects: z.array(DevToolBuildProjectSchema),
    note: z.string().nullable(),
    simplifiedMode: z.boolean(),
    api: DevToolBuildChannelSchema,
    front: DevToolBuildChannelSchema,
})

export const DevToolActionSchema = z.object({
    id: z.string().trim().min(1),
    label: z.string().trim().min(1),
    description: z.string().trim().min(1),
    group: DevToolActionGroupSchema,
    page: DevToolPageSchema,
    available: z.boolean(),
    dangerous: z.boolean(),
    running: z.boolean(),
    note: z.string().nullable(),
    supports: DevToolActionSupportSchema,
})

export const DevToolTaskSchema = z.object({
    id: z.string().trim().min(1),
    actionId: z.string().trim().min(1),
    label: z.string().trim().min(1),
    contextKey: z.string().trim().min(1).nullable(),
    triggeredByTaskId: z.string().trim().min(1).nullable(),
    triggeredByActionId: z.string().trim().min(1).nullable(),
    followUpActionId: z.string().trim().min(1).nullable(),
    followUpTaskId: z.string().trim().min(1).nullable(),
    status: DevToolTaskStatusSchema,
    startedAt: z.string().trim().min(1),
    finishedAt: z.string().trim().min(1).nullable(),
    lastOutputAt: z.string().trim().min(1).nullable(),
    lastHeartbeatAt: z.string().trim().min(1).nullable(),
    exitCode: z.number().int().nullable(),
    currentPhase: z.string().nullable(),
    stdout: z.string(),
    stderr: z.string(),
    summary: z.string().nullable(),
})

export const DevToolProcessSchema = z.object({
    key: z.string().trim().min(1),
    label: z.string().trim().min(1),
    group: DevToolActionGroupSchema,
    status: DevToolProcessStatusSchema,
    activity: DevToolProcessActivitySchema,
    presentation: DevToolProcessPresentationSchema,
    pid: z.number().int().positive().nullable(),
    startedAt: z.string().trim().min(1).nullable(),
    cwd: z.string().trim().min(1).nullable(),
    logFilePath: z.string().trim().min(1).nullable(),
    url: z.string().trim().min(1).nullable(),
    configured: z.boolean(),
    tracked: z.boolean(),
    manageable: z.boolean(),
    reachable: z.boolean().nullable(),
    statusLabel: z.string().trim().min(1),
    statusReason: z.string().nullable(),
    lastCheckAt: z.string().trim().min(1).nullable(),
    statusActionId: z.string().trim().min(1).nullable(),
    startActionId: z.string().trim().min(1).nullable(),
    stopActionId: z.string().trim().min(1).nullable(),
    restartActionId: z.string().trim().min(1).nullable(),
    installActionId: z.string().trim().min(1).nullable(),
    terminalSupported: z.boolean(),
    terminalSessionId: z.string().trim().min(1).nullable(),
    terminalSessionStatus: DevToolTerminalSessionStatusSchema.nullable(),
    publicReachability: DevToolPublicReachabilitySchema.nullable(),
    urlChecks: z.array(DevToolProcessUrlCheckSchema),
    note: z.string().nullable(),
})

export const DevToolProcessLogsSchema = z.object({
    processKey: z.string().trim().min(1),
    lines: z.number().int().min(10).max(500),
    mode: DevToolProcessLogsModeSchema,
    content: z.string(),
    cursor: z.number().int().min(0),
    resetRequired: z.boolean(),
    truncated: z.boolean(),
    updatedAt: z.string().trim().min(1).nullable(),
})

export const DevToolDeploySummarySchema = z.object({
    remoteCurrentReleaseName: z.string().trim().min(1).nullable(),
    remotePreviousReleaseName: z.string().trim().min(1).nullable(),
    remoteCurrentPath: z.string().trim().min(1).nullable(),
    remoteActiveReleasePath: z.string().trim().min(1).nullable(),
    channelActivationConfigured: z.boolean(),
    remoteApiCurrentReleaseName: z.string().trim().min(1).nullable(),
    remoteApiPreviousReleaseName: z.string().trim().min(1).nullable(),
    remoteApiCurrentPath: z.string().trim().min(1).nullable(),
    remoteApiActiveReleasePath: z.string().trim().min(1).nullable(),
    remoteApiRollbackAvailable: z.boolean(),
    remoteFrontCurrentReleaseName: z.string().trim().min(1).nullable(),
    remoteFrontPreviousReleaseName: z.string().trim().min(1).nullable(),
    remoteFrontCurrentPath: z.string().trim().min(1).nullable(),
    remoteFrontActiveReleasePath: z.string().trim().min(1).nullable(),
    remoteFrontRollbackAvailable: z.boolean(),
    localLastReleaseName: z.string().trim().min(1).nullable(),
    localLastActivatedReleaseName: z.string().trim().min(1).nullable(),
    rollbackAvailable: z.boolean(),
    rawStatusJson: z.string().nullable(),
    note: z.string().nullable(),
})

export const DevToolDeployPublicUrlsSchema = z.object({
    api: z.string().trim().min(1).nullable(),
    front: z.string().trim().min(1).nullable(),
    socket: z.string().trim().min(1).nullable(),
    releaseApiTemplate: z.string().trim().min(1).nullable(),
    releaseFrontTemplate: z.string().trim().min(1).nullable(),
    releaseSocketTemplate: z.string().trim().min(1).nullable(),
})

export const DevToolDeployProfileItemSchema = z.object({
    name: z.string().trim().min(1),
    active: z.boolean(),
    selected: z.boolean(),
    remoteHost: z.string().trim().min(1).nullable(),
    releaseRoot: z.string().trim().min(1).nullable(),
    currentPath: z.string().trim().min(1).nullable(),
    apiCurrentPath: z.string().trim().min(1).nullable(),
    frontCurrentPath: z.string().trim().min(1).nullable(),
    channelActivationConfigured: z.boolean(),
    apiMode: z.enum(["docker", "host"]).nullable(),
    apiTarget: z.string().trim().min(1).nullable(),
    frontMode: z.enum(["docker", "host"]).nullable(),
    frontTarget: z.string().trim().min(1).nullable(),
    databaseMode: z.enum(["docker", "host"]).nullable(),
    databaseName: z.string().trim().min(1).nullable(),
    publicUrls: DevToolDeployPublicUrlsSchema.nullable(),
    apiBuildStrategy: z.string().trim().min(1).nullable(),
    apiPrepareStrategy: z.string().trim().min(1).nullable(),
    frontBuildStrategy: z.string().trim().min(1).nullable(),
    frontPrepareStrategy: z.string().trim().min(1).nullable(),
    smokeTestsCount: z.number().int().min(0),
})

export const DevToolDeployProfileSummarySchema = z.object({
    configPath: z.string().trim().min(1).nullable(),
    localOverridePath: z.string().trim().min(1).nullable(),
    localOverrideLoaded: z.boolean(),
    activeProfileName: z.string().trim().min(1).nullable(),
    selectedProfileName: z.string().trim().min(1).nullable(),
    envOverrideProfileName: z.string().trim().min(1).nullable(),
    switchWritesTo: z.enum(["base", "local-override"]),
    switchAffectsRuntimeImmediately: z.boolean(),
    profiles: z.array(DevToolDeployProfileItemSchema),
    note: z.string().nullable(),
})

export const DevToolProfileConfigLayerSchema = z.enum(["base", "local-override"])

export const DevToolDeployProfileEditorSectionsSchema = z.object({
    sshJson: z.string(),
    indexatorJson: z.string(),
    remoteJson: z.string(),
    servicesJson: z.string(),
    publicUrlsJson: z.string(),
    releaseRuntimeJson: z.string(),
    databaseJson: z.string(),
    transferJson: z.string(),
    releasesJson: z.string(),
    projectsJson: z.string(),
    smokeTestsJson: z.string(),
})

export const DevToolDeployProfileEditorSchema = z.object({
    requestedProfileName: z.string().trim().min(1).nullable(),
    profileName: z.string().trim().min(1),
    layer: DevToolProfileConfigLayerSchema,
    availableLayers: z.array(DevToolProfileConfigLayerSchema).min(1),
    availableProfiles: z.array(z.string().trim().min(1)),
    isDefaultProfile: z.boolean(),
    isNewProfile: z.boolean(),
    seedProfileName: z.string().trim().min(1).nullable(),
    existsInLayer: z.boolean(),
    configPath: z.string().trim().min(1).nullable(),
    localOverridePath: z.string().trim().min(1).nullable(),
    activeProfileName: z.string().trim().min(1).nullable(),
    selectedProfileName: z.string().trim().min(1).nullable(),
    summary: DevToolDeployProfileItemSchema.nullable(),
    sections: DevToolDeployProfileEditorSectionsSchema,
    effectiveSections: DevToolDeployProfileEditorSectionsSchema,
    note: z.string().nullable(),
})

export const DevToolSelectedReleaseProjectSchema = z.object({
    key: z.string().trim().min(1),
    add: z.number().int().min(0).nullable(),
    update: z.number().int().min(0).nullable(),
    delete: z.number().int().min(0).nullable(),
    buildStrategy: z.string().trim().min(1).nullable(),
    prepareStrategy: z.string().trim().min(1).nullable(),
})

export const DevToolRuntimeScopeSchema = z.enum(["current", "release"])

export const DevToolRuntimeTargetSummarySchema = z.object({
    scope: DevToolRuntimeScopeSchema,
    requestedReleaseName: z.string().trim().min(1).nullable(),
    releaseName: z.string().trim().min(1).nullable(),
    isolated: z.boolean(),
    configured: z.boolean(),
    apiPublicUrl: z.string().trim().min(1).nullable(),
    frontPublicUrl: z.string().trim().min(1).nullable(),
    socketPublicUrl: z.string().trim().min(1).nullable(),
    databaseName: z.string().trim().min(1).nullable(),
    workingDirectory: z.string().trim().min(1).nullable(),
    note: z.string().nullable(),
})

export const DevToolReleasePreviewSummarySchema = z.object({
    state: z.enum(["unsupported", "unconfigured", "disabled", "missing-release", "missing-artifacts", "ready"]),
    configured: z.boolean(),
    enabled: z.boolean(),
    baseDomain: z.string().trim().min(1).nullable(),
    releaseName: z.string().trim().min(1).nullable(),
    serverName: z.string().trim().min(1).nullable(),
    publicUrl: z.string().trim().min(1).nullable(),
    siteName: z.string().trim().min(1).nullable(),
    configPath: z.string().trim().min(1).nullable(),
    documentRoot: z.string().trim().min(1).nullable(),
    topology: z.enum(["same-origin", "split-domain"]).nullable(),
    apiTarget: z.string().trim().min(1).nullable(),
    plannedFrontPublicUrl: z.string().trim().min(1).nullable(),
    plannedApiPublicUrl: z.string().trim().min(1).nullable(),
    plannedSocketPublicUrl: z.string().trim().min(1).nullable(),
    installActionAvailable: z.boolean(),
    note: z.string().nullable(),
})

export const DevToolSelectedReleaseResolutionSourceSchema = z.enum(["requested", "remote-current", "local-last", "none"])

export const DevToolPromotionContextStatusSchema = z.enum(["split-build", "aligned-build", "remote-only", "unresolved"])

export const DevToolRemotePromotionModeSchema = z.enum(["mono-release", "split-channel"])

export const DevToolPromotionContextSummarySchema = z.object({
    status: DevToolPromotionContextStatusSchema,
    buildReleasesSeparated: z.boolean(),
    buildApiReleaseName: z.string().trim().min(1).nullable(),
    buildFrontReleaseName: z.string().trim().min(1).nullable(),
    combinedBuildReleaseName: z.string().trim().min(1).nullable(),
    remoteRequestedReleaseName: z.string().trim().min(1).nullable(),
    remoteResolvedReleaseName: z.string().trim().min(1).nullable(),
    remoteResolutionSource: DevToolSelectedReleaseResolutionSourceSchema,
    remoteCurrentReleaseName: z.string().trim().min(1).nullable(),
    note: z.string().nullable(),
})

export const DevToolRemotePromotionSummarySchema = z.object({
    mode: DevToolRemotePromotionModeSchema,
    requestedReleaseName: z.string().trim().min(1).nullable(),
    resolvedReleaseName: z.string().trim().min(1).nullable(),
    currentReleaseName: z.string().trim().min(1).nullable(),
    resolutionSource: DevToolSelectedReleaseResolutionSourceSchema,
    buildReleasesSeparated: z.boolean(),
    channelActivationConfigured: z.boolean(),
    apiCurrentReleaseName: z.string().trim().min(1).nullable(),
    frontCurrentReleaseName: z.string().trim().min(1).nullable(),
    note: z.string().nullable(),
})

export const DevToolSelectedReleaseSummarySchema = z.object({
    requestedReleaseName: z.string().trim().min(1).nullable(),
    resolvedReleaseName: z.string().trim().min(1).nullable(),
    resolutionSource: DevToolSelectedReleaseResolutionSourceSchema,
    exists: z.boolean(),
    manifestAvailable: z.boolean(),
    artifactsDirectory: z.string().trim().min(1).nullable(),
    manifestPath: z.string().trim().min(1).nullable(),
    generatedAt: z.string().trim().min(1).nullable(),
    preparedAt: z.string().trim().min(1).nullable(),
    dryRun: z.boolean().nullable(),
    skipped: z.boolean().nullable(),
    verified: z.boolean().nullable(),
    profileName: z.string().trim().min(1).nullable(),
    localGitCommit: z.string().trim().min(1).nullable(),
    comparisonBaseLabel: z.string().trim().min(1).nullable(),
    comparisonBasePath: z.string().trim().min(1).nullable(),
    remoteBuildAt: z.string().trim().min(1).nullable(),
    remoteBuildTarget: z.string().trim().min(1).nullable(),
    remoteBuildConfiguredBuildStrategy: z.string().trim().min(1).nullable(),
    remoteBuildComposeService: z.string().trim().min(1).nullable(),
    isRemoteCurrent: z.boolean(),
    isLocalLastRelease: z.boolean(),
    isLocalLastActivatedRelease: z.boolean(),
    projects: z.array(DevToolSelectedReleaseProjectSchema),
    previewSummary: DevToolReleasePreviewSummarySchema.nullable(),
    note: z.string().nullable(),
})

export const DevToolDatabaseSummarySchema = z.object({
    configured: z.boolean(),
    profileName: z.string().trim().min(1).nullable(),
    remoteHost: z.string().trim().min(1).nullable(),
    mode: z.enum(["docker", "host"]).nullable(),
    backupWriter: z.enum(["host", "container"]).nullable(),
    credentialMode: z.enum(["defaults-extra-file", "inline-password", "incomplete"]),
    dockerContainerName: z.string().trim().min(1).nullable(),
    host: z.string().trim().min(1).nullable(),
    port: z.number().int().positive().nullable(),
    databaseName: z.string().trim().min(1).nullable(),
    user: z.string().trim().min(1).nullable(),
    passwordConfigured: z.boolean(),
    defaultsExtraFileConfigured: z.boolean(),
    backupDirectory: z.string().trim().min(1).nullable(),
    retentionDays: z.number().int().min(0).nullable(),
    backupFlowNote: z.string().nullable(),
    securityNote: z.string().nullable(),
    note: z.string().nullable(),
})

export const DevToolDatabaseCloneTargetStateSchema = z.enum(["missing", "empty", "replaceable", "problematic"])

export const DevToolDatabaseCloneTargetSummarySchema = z.object({
    state: DevToolDatabaseCloneTargetStateSchema,
    checkedAt: z.string().trim().min(1).nullable(),
    blockingReasons: z.array(z.string()),
    warnings: z.array(z.string()),
    restorationAllowed: z.boolean(),
    preRestoreBackupRequired: z.boolean(),
    context: z.array(z.string()),
})

export const DevToolDatabaseCloneArtifactStatusSchema = z.enum(["missing", "ready", "ambiguous"])

export const DevToolDatabaseCloneArtifactSummarySchema = z.object({
    status: DevToolDatabaseCloneArtifactStatusSchema,
    releaseName: z.string().trim().min(1).nullable(),
    path: z.string().trim().min(1).nullable(),
    label: z.string().trim().min(1).nullable(),
    note: z.string().nullable(),
})

export const DevToolDatabaseCloneRestoreSummarySchema = z.object({
    restorationAllowed: z.boolean(),
    backupRequired: z.boolean(),
    backupSatisfied: z.boolean(),
    blockingReasons: z.array(z.string()),
})

export const DevToolDatabaseBackupDiagnosticSummarySchema = z.object({
    status: z.enum(["ok", "warn", "error"]),
    checkedAt: z.string().trim().min(1).nullable(),
    errorCount: z.number().int().min(0),
    warnCount: z.number().int().min(0),
    headline: z.string().nullable(),
    remediation: z.string().nullable(),
})

export const DevToolPrismaRuntimeDiagnosticSummarySchema = z.object({
    status: z.enum(["ok", "warn", "error"]),
    checkedAt: z.string().trim().min(1).nullable(),
    releaseName: z.string().trim().min(1).nullable(),
    errorCount: z.number().int().min(0),
    warnCount: z.number().int().min(0),
    headline: z.string().nullable(),
    remediation: z.string().nullable(),
})

export const DevToolApiRuntimeDiagnosticSummarySchema = z.object({
    status: z.enum(["ok", "warn", "error"]),
    checkedAt: z.string().trim().min(1).nullable(),
    errorCount: z.number().int().min(0),
    warnCount: z.number().int().min(0),
    headline: z.string().nullable(),
    remediation: z.string().nullable(),
})

export const DevToolAppRuntimeSummarySchema = z.object({
    configured: z.boolean(),
    profileName: z.string().trim().min(1).nullable(),
    remoteHost: z.string().trim().min(1).nullable(),
    mode: z.enum(["docker", "host"]).nullable(),
    serviceName: z.string().trim().min(1),
    composeService: z.string().trim().min(1).nullable(),
    composeStackDir: z.string().trim().min(1).nullable(),
    dockerContainerName: z.string().trim().min(1).nullable(),
    hostManager: z.enum(["systemd", "pm2", "manual"]).nullable(),
    hostServiceName: z.string().trim().min(1).nullable(),
    hostServiceUnitPath: z.string().trim().min(1).nullable(),
    workingDirectory: z.string().trim().min(1).nullable(),
    startCommand: z.string().trim().min(1).nullable(),
    publicUrl: z.string().trim().min(1).nullable(),
    publicSocketUrl: z.string().trim().min(1).nullable(),
    releasePublicUrlTemplate: z.string().trim().min(1).nullable(),
    releaseSocketUrlTemplate: z.string().trim().min(1).nullable(),
    healthUrl: z.string().trim().min(1).nullable(),
    healthPath: z.string().trim().min(1).nullable(),
    port: z.number().int().positive().nullable(),
    note: z.string().nullable(),
    bootstrapNote: z.string().nullable(),
})

export const DevToolFrontStaticHostDiagnosticSummarySchema = z.object({
    status: z.enum(["ok", "warn", "error"]),
    checkedAt: z.string().trim().min(1).nullable(),
    errorCount: z.number().int().min(0),
    warnCount: z.number().int().min(0),
    headline: z.string().nullable(),
    remediation: z.string().nullable(),
})

export const DevToolFrontApiProxyDiagnosticSummarySchema = z.object({
    status: z.enum(["ok", "warn", "error"]),
    checkedAt: z.string().trim().min(1).nullable(),
    errorCount: z.number().int().min(0),
    warnCount: z.number().int().min(0),
    headline: z.string().nullable(),
    remediation: z.string().nullable(),
})

export const DevToolRemoteStorageDiagnosticSummarySchema = z.object({
    status: z.enum(["ok", "warn", "error"]),
    checkedAt: z.string().trim().min(1).nullable(),
    errorCount: z.number().int().min(0),
    warnCount: z.number().int().min(0),
    headline: z.string().nullable(),
    remediation: z.string().nullable(),
})

export const DevToolReleaseLayoutDiagnosticSummarySchema = z.object({
    status: z.enum(["ok", "warn", "error"]),
    checkedAt: z.string().trim().min(1).nullable(),
    releaseName: z.string().trim().min(1).nullable(),
    errorCount: z.number().int().min(0),
    warnCount: z.number().int().min(0),
    headline: z.string().nullable(),
    remediation: z.string().nullable(),
})

export const DevToolTerminalSessionSchema = z.object({
    id: z.string().trim().min(1),
    target: DevToolTerminalTargetSchema,
    processKey: z.string().trim().min(1),
    title: z.string().trim().min(1),
    status: DevToolTerminalSessionStatusSchema,
    pid: z.number().int().positive().nullable(),
    cwd: z.string().trim().min(1),
    createdAt: z.string().trim().min(1),
    lastOutputAt: z.string().trim().min(1).nullable(),
})

export const DevToolTerminalBufferSchema = z.object({
    sessionId: z.string().trim().min(1),
    processKey: z.string().trim().min(1),
    content: z.string(),
    truncated: z.boolean(),
    updatedAt: z.string().trim().min(1).nullable(),
})

export const DevToolsOverviewSchema = z.object({
    enabled: z.boolean(),
    environment: z.string().trim().min(1),
    availableReleaseNames: z.array(z.string().trim().min(1)),
    runtimeTargetSummary: DevToolRuntimeTargetSummarySchema.nullable(),
    buildSummary: DevToolBuildSummarySchema.nullable(),
    promotionContextSummary: DevToolPromotionContextSummarySchema.nullable(),
    remotePromotionSummary: DevToolRemotePromotionSummarySchema.nullable(),
    deploySummary: DevToolDeploySummarySchema.nullable(),
    deployProfileSummary: DevToolDeployProfileSummarySchema.nullable(),
    profileEditor: DevToolDeployProfileEditorSchema.nullable(),
    selectedReleaseSummary: DevToolSelectedReleaseSummarySchema.nullable(),
    databaseSummary: DevToolDatabaseSummarySchema.nullable(),
    databaseCloneArtifactSummary: DevToolDatabaseCloneArtifactSummarySchema.nullable(),
    databaseCloneTargetSummary: DevToolDatabaseCloneTargetSummarySchema.nullable(),
    databaseCloneRestoreSummary: DevToolDatabaseCloneRestoreSummarySchema.nullable(),
    databaseBackupDiagnosticSummary: DevToolDatabaseBackupDiagnosticSummarySchema.nullable(),
    prismaRuntimeDiagnosticSummary: DevToolPrismaRuntimeDiagnosticSummarySchema.nullable(),
    appRuntimeSummary: DevToolAppRuntimeSummarySchema.nullable(),
    apiRuntimeDiagnosticSummary: DevToolApiRuntimeDiagnosticSummarySchema.nullable(),
    frontStaticHostDiagnosticSummary: DevToolFrontStaticHostDiagnosticSummarySchema.nullable(),
    frontApiProxyDiagnosticSummary: DevToolFrontApiProxyDiagnosticSummarySchema.nullable(),
    remoteStorageDiagnosticSummary: DevToolRemoteStorageDiagnosticSummarySchema.nullable(),
    releaseLayoutDiagnosticSummary: DevToolReleaseLayoutDiagnosticSummarySchema.nullable(),
    actions: z.array(DevToolActionSchema),
    tasks: z.array(DevToolTaskSchema),
    processes: z.array(DevToolProcessSchema),
})

export const DevToolActionAcceptedSchema = z.object({
    task: DevToolTaskSchema,
})

export const DevToolActiveProfileAcceptedSchema = z.object({
    activeProfileName: z.string().trim().min(1),
    selectedProfileName: z.string().trim().min(1),
    configPath: z.string().trim().min(1),
    localOverridePath: z.string().trim().min(1).nullable(),
    switchedAt: z.string().trim().min(1),
    note: z.string().nullable(),
})

export const DevToolProfileConfigSaveRequestSchema = z.object({
    profileName: z.string().trim().min(1).max(64),
    layer: DevToolProfileConfigLayerSchema,
    sections: DevToolDeployProfileEditorSectionsSchema,
})

export const DevToolProfileConfigSavedSchema = z.object({
    profileName: z.string().trim().min(1),
    layer: DevToolProfileConfigLayerSchema,
    savedAt: z.string().trim().min(1),
    note: z.string().nullable(),
})

export const DevToolProfileConfigDeleteRequestSchema = z.object({
    profileName: z.string().trim().min(1).max(64),
    layer: DevToolProfileConfigLayerSchema,
})

export const DevToolProfileConfigDeletedSchema = z.object({
    profileName: z.string().trim().min(1),
    layer: DevToolProfileConfigLayerSchema,
    deletedAt: z.string().trim().min(1),
    note: z.string().nullable(),
})

export const DevToolTerminalSessionAcceptedSchema = z.object({
    session: DevToolTerminalSessionSchema,
})

export const DevToolActionRequestSchema = z.object({
    releaseName: z.string().trim().min(1).max(64).optional(),
    runtimeScope: z.enum(["current", "release"]).optional(),
    contextKey: z.string().trim().min(1).max(256).optional(),
    projectKeys: z.array(z.string().trim().min(1).max(32)).max(10).optional(),
    artifactPath: z.string().trim().min(1).max(512).optional(),
    skipVerify: z.boolean().optional(),
    skipInstall: z.boolean().optional(),
    skipMigration: z.boolean().optional(),
    confirmDangerous: z.boolean().optional(),
})

export const DevToolOverviewQuerySchema = z.object({
    releaseName: z.string().trim().min(1).max(64).optional(),
    buildApiReleaseName: z.string().trim().min(1).max(64).optional(),
    buildFrontReleaseName: z.string().trim().min(1).max(64).optional(),
    runtimeScope: z.enum(["current", "release"]).optional(),
    contextKey: z.string().trim().min(1).max(256).optional(),
    profileName: z.string().trim().min(1).max(64).optional(),
    profileLayer: DevToolProfileConfigLayerSchema.optional(),
})

export const DevToolActiveProfileRequestSchema = z.object({
    profileName: z.string().trim().min(1).max(64),
})

export const DevToolLogsQuerySchema = z.object({
    lines: z.coerce.number().int().min(10).max(500).optional(),
    cursor: z.coerce.number().int().min(0).optional(),
    contextKey: z.string().trim().min(1).max(256).optional(),
})

export const DevToolTerminalCreateSessionSchema = z.object({
    target: DevToolTerminalTargetSchema,
    runDefaultCommand: z.boolean().optional(),
    cols: z.coerce.number().int().min(40).max(400).optional(),
    rows: z.coerce.number().int().min(10).max(160).optional(),
})

export const DevToolTerminalInputSchema = z.object({
    data: z.string().min(1).max(8000),
})

export const DevToolTerminalResizeSchema = z.object({
    cols: z.coerce.number().int().min(40).max(400),
    rows: z.coerce.number().int().min(10).max(160),
})

export type DevToolActionRequestInput = z.infer<typeof DevToolActionRequestSchema>
export type DevToolOverviewQueryInput = z.infer<typeof DevToolOverviewQuerySchema>
export type DevToolActiveProfileRequestInput = z.infer<typeof DevToolActiveProfileRequestSchema>
export type DevToolProfileConfigSaveRequestInput = z.infer<typeof DevToolProfileConfigSaveRequestSchema>
export type DevToolProfileConfigDeleteRequestInput = z.infer<typeof DevToolProfileConfigDeleteRequestSchema>
export type DevToolLogsQueryInput = z.infer<typeof DevToolLogsQuerySchema>
export type DevToolTerminalCreateSessionInput = z.infer<typeof DevToolTerminalCreateSessionSchema>
export type DevToolTerminalInputRequestInput = z.infer<typeof DevToolTerminalInputSchema>
export type DevToolTerminalResizeRequestInput = z.infer<typeof DevToolTerminalResizeSchema>

