import { coerceLiveInputIdentifierForStorage } from '@/lib/streams/cloudflareLiveInput'

const STREAM_TOKEN_RE = /^[a-f0-9]{32}$/i
const CLOUDFLARE_STREAM_HOST_RE = /cloudflarestream\.com/i
const VIDEO_UID_RE = /cloudflarestream\.com\/([a-f0-9]{32})\b/i
/** publish URL path 區段：Cloudflare 32 字元 UID 或英數/_- 自訂 key */
const STREAM_KEY_PATH_SEGMENT_RE = /^[a-zA-Z0-9_-]{1,200}$/

function resolveStreamKeyForPath(streamKey: string): string | null {
    const raw = String(streamKey ?? '').trim()
    if (!raw) return null
    return normalizeStreamKey(raw) ?? (STREAM_KEY_PATH_SEGMENT_RE.test(raw) ? raw : null)
}

/** Cloudflare Stream 客戶網域（不含尾端斜線） */
export function getCloudflareStreamOrigin(): string {
    const raw =
        (typeof process !== 'undefined' && process.env.NEXT_PUBLIC_CLOUDFLARE_STREAM_ORIGIN) ||
        ''
    return String(raw).trim().replace(/\/$/, '')
}

/** 從完整 URL 或純 32 字元 token 正規化為 video UID */
export function normalizeStreamToken(input: string): string | null {
    const raw = String(input ?? '').trim()
    if (!raw) return null
    if (STREAM_TOKEN_RE.test(raw)) return raw.toLowerCase()

    if (!CLOUDFLARE_STREAM_HOST_RE.test(raw)) return null

    try {
        const parsed = new URL(raw)
        const parts = parsed.pathname.split('/').filter(Boolean)
        const uid = parts.find((p) => STREAM_TOKEN_RE.test(p))
        return uid ? uid.toLowerCase() : null
    } catch {
        const match = raw.match(VIDEO_UID_RE)
        return match?.[1]?.toLowerCase() ?? null
    }
}

/** @deprecated 請用 normalizeStreamToken */
export function parseCloudflareStreamVideoUid(url: string): string | null {
    return normalizeStreamToken(url)
}

/**
 * WHEP 播放用的 Cloudflare video UID（32 hex）。
 * 不接受完整 live input 金鑰路徑，僅 UID / URL / 65 字元金鑰中的 uid 段。
 */
export function resolveWhepVideoUid(src: string): string | null {
    const raw = String(src ?? '').trim()
    if (!raw) return null
    if (STREAM_TOKEN_RE.test(raw)) return raw.toLowerCase()

    const kSuffix = raw.match(/k([a-f0-9]{32})$/i)
    if (kSuffix?.[1]) return kSuffix[1].toLowerCase()

    return normalizeStreamToken(raw)
}

/** 是否為 Cloudflare Stream 來源（完整 URL 或已設定的純 token） */
export function isCloudflareStreamSource(src: string): boolean {
    const raw = String(src ?? '').trim()
    if (!raw) return false
    if (STREAM_TOKEN_RE.test(raw)) return Boolean(getCloudflareStreamOrigin())
    return CLOUDFLARE_STREAM_HOST_RE.test(raw)
}

function isLocalDevOrigin(origin: string): boolean {
    return /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/i.test(origin)
}

/**
 * 本機是否走 /api/stream/whep 代理。
 * 預設：有 NEXT_PUBLIC_CLOUDFLARE_STREAM_ORIGIN 時改直連 Cloudflare（已支援 CORS），
 * 少一層 localhost → live.gp777s.com 轉發，避免本機播放卡在 loading。
 */
export function shouldUseLocalWhepApiProxy(): boolean {
    if (process.env.NEXT_PUBLIC_WHEP_USE_LOCAL_API_PROXY === '0') return false
    if (process.env.NEXT_PUBLIC_WHEP_USE_LOCAL_API_PROXY === '1') return true
    if (typeof window !== 'undefined' && isLocalDevOrigin(window.location.origin)) {
        if (getCloudflareStreamOrigin()) return false
    }
    if (typeof window !== 'undefined') {
        return isLocalDevOrigin(window.location.origin)
    }
    return false
}

/** 從 stream_token、CF URL 或站點 /webRTC/play/{token} 取出 WHEP 用 token */
function resolveWhepPlaybackToken(src: string): string | null {
    const fromUid = resolveWhepVideoUid(src)
    if (fromUid) return fromUid

    const raw = String(src ?? '').trim()
    if (!raw) return null

    try {
        const pathOnly = (raw.includes('://') ? new URL(raw).pathname : raw).split('?')[0] ?? ''
        const match = pathOnly.match(/\/webRTC\/play\/([^/]+)/i)
        if (!match?.[1]) return null
        const segment = decodeURIComponent(match[1]).trim()
        if (STREAM_TOKEN_RE.test(segment)) return segment.toLowerCase()
        return resolveWhepVideoUid(segment)
    } catch {
        return null
    }
}

function buildLocalWhepApiPlaybackUrl(src: string): string | null {
    const token = resolveWhepPlaybackToken(src)
    if (!token) return null
    if (typeof window === 'undefined') return null
    const origin = window.location.origin.replace(/\/$/, '')
    return `${origin}/api/stream/whep/play/${encodeURIComponent(token)}`
}

/** 正式環境可選 Cloudflare 直連；本機一律走站點／Next API 代理 */
function shouldPreferCloudflareWhepDirect(): boolean {
    if (shouldUseLocalWhepApiProxy()) return false
    if (process.env.NEXT_PUBLIC_WHEP_FORCE_SITE_PROXY === '1') return false
    return process.env.NEXT_PUBLIC_WHEP_USE_CLOUDFLARE_DIRECT === '1'
}

/**
 * 經站點代理的 WHEP 播放 URL
 * 例：https://live.gp777s.com/webRTC/play/{token}
 */
export function buildPublicWhepPlaybackUrl(src: string): string | null {
    const token = resolveWhepPlaybackToken(src)
    if (!token) return null

    if (shouldUseLocalWhepApiProxy()) {
        const local = buildLocalWhepApiPlaybackUrl(src)
        if (local) return local
    }

    const origin = getWhipPublishPublicOrigin()
    if (!origin) return null

    return `${origin}/webRTC/play/${token}`
}

/**
 * 客戶端播放：優先站點 WHEP 代理，否則 Cloudflare 直連
 */
export function resolveWhepPlaybackUrl(src: string): string | null {
    const raw = String(src ?? '').trim()
    if (!raw) return null

    if (shouldUseLocalWhepApiProxy()) {
        return buildLocalWhepApiPlaybackUrl(raw)
    }

    const pathOnly = raw.split('?')[0] ?? ''
    if (/\/webRTC\/play\/[^/]+/i.test(pathOnly) && !CLOUDFLARE_STREAM_HOST_RE.test(raw)) {
        try {
            const url = new URL(raw.startsWith('http') ? raw : `https://${raw}`)
            return url.href.replace(/\/$/, '')
        } catch {
            return raw.replace(/\/$/, '')
        }
    }

    const cfDirect = buildCloudflareWhepPlaybackUrl(raw)
    if (
        cfDirect &&
        typeof window !== 'undefined' &&
        isLocalDevOrigin(window.location.origin) &&
        getCloudflareStreamOrigin()
    ) {
        return cfDirect
    }

    if (shouldPreferCloudflareWhepDirect()) {
        if (cfDirect) return cfDirect
    }

    return buildPublicWhepPlaybackUrl(raw) ?? cfDirect
}

/**
 * WHEP 播放端點（Cloudflare 直連）
 * 例：https://customer-xxx.cloudflarestream.com/{token}/webRTC/play
 */
export function buildCloudflareWhepPlaybackUrl(src: string): string | null {
    const raw = String(src ?? '').trim()
    if (!raw) return null

    if (/\/webrtc\/play\/?$/i.test(raw.split('?')[0] ?? '')) {
        try {
            const url = new URL(raw)
            return url.href.replace(/\/$/, '')
        } catch {
            return raw.replace(/\/$/, '')
        }
    }

    const token = resolveWhepVideoUid(raw)
    if (!token) return null

    const origin = getCloudflareStreamOrigin()
    if (origin) {
        return `${origin}/${token}/webRTC/play`
    }

    if (CLOUDFLARE_STREAM_HOST_RE.test(raw)) {
        try {
            const url = new URL(raw)
            return `${url.origin}/${token}/webRTC/play`
        } catch {
            return null
        }
    }

    return null
}

/**
 * lifecycle 輪詢端點
 * 例：https://customer-xxx.cloudflarestream.com/{token}/lifecycle
 */
/** 從完整 publish URL 或純 32 字元 key 正規化為 stream_key */
export function normalizeStreamKey(input: string): string | null {
    const raw = String(input ?? '').trim()
    if (!raw) return null
    if (STREAM_TOKEN_RE.test(raw)) return raw.toLowerCase()

    if (/\/webrtc\/publish\/?$/i.test(raw.split('?')[0] ?? '')) {
        try {
            const parsed = new URL(raw)
            const parts = parsed.pathname.split('/').filter(Boolean)
            const uid = parts.find((p) => STREAM_TOKEN_RE.test(p))
            return uid ? uid.toLowerCase() : null
        } catch {
            const match = raw.match(VIDEO_UID_RE)
            return match?.[1]?.toLowerCase() ?? null
        }
    }

    return normalizeStreamToken(raw)
}

/**
 * 寫入 room_streams.live_input_identifier：優先 Cloudflare 正規化，否則接受 path 安全字串
 */
export function coerceStreamKeyForStorage(input: string): string | null {
    return coerceLiveInputIdentifierForStorage(input) ?? resolveStreamKeyForPath(input)
}

/**
 * WebRTC 推流端點（OBS / WHIP publish）
 * 例：https://customer-xxx.cloudflarestream.com/{stream_key}/webRTC/publish
 */
/** 對外 WHIP 代理網域（例：https://live.gp777s.com），供 OBS 使用 */
export function getWhipPublishPublicOrigin(): string {
    const raw =
        (typeof process !== 'undefined' && process.env.NEXT_PUBLIC_WHIP_PUBLISH_ORIGIN) ||
        ''
    const fromEnv = String(raw).trim().replace(/\/$/, '')
    if (fromEnv) return fromEnv

    if (typeof window !== 'undefined' && window.location?.origin) {
        return window.location.origin.replace(/\/$/, '')
    }

    return ''
}

/**
 * 經站點 WHIP 代理的推流 URL（OBS 友善路徑）
 * 例：https://live.gp777s.com/webRTC/publish/{stream_key}
 */
export function buildPublicWhipPublishUrl(streamKey: string): string | null {
    const key = coerceStreamKeyForStorage(streamKey) ?? resolveStreamKeyForPath(streamKey)
    if (!key) return null

    const origin = getWhipPublishPublicOrigin()
    if (!origin) return null

    return `${origin}/webRTC/publish/${key}`
}

/**
 * Dashboard / OBS 推流 URL：優先站點 WHIP 代理，否則 Cloudflare 直連
 */
export function resolveStreamPublishUrl(liveInputIdentifier: string): string {
    const key = coerceStreamKeyForStorage(String(liveInputIdentifier ?? '').trim())
    if (!key) return ''
    return buildPublicWhipPublishUrl(key) ?? buildCloudflareWebrtcPublishUrl(key) ?? ''
}

export function buildCloudflareWebrtcPublishUrl(streamKey: string): string | null {
    const key = resolveStreamKeyForPath(streamKey)
    if (!key) return null

    const origin = getCloudflareStreamOrigin()
    if (origin) {
        return `${origin}/${key}/webRTC/publish`
    }

    const raw = String(streamKey ?? '').trim()
    if (CLOUDFLARE_STREAM_HOST_RE.test(raw) && /\/webrtc\/publish\/?$/i.test(raw.split('?')[0] ?? '')) {
        try {
            const url = new URL(raw)
            return url.href.replace(/\/$/, '')
        } catch {
            return raw.replace(/\/$/, '')
        }
    }

    return null
}

/** @deprecated 直播狀態改由 Cloudflare live_inputs API；請勿再呼叫 /lifecycle */
export function buildCloudflareLifecycleUrl(src: string): string | null {
    const raw = String(src ?? '').trim()
    if (!raw) return null

    const token = normalizeStreamToken(raw)
    if (!token) return null

    const origin = getCloudflareStreamOrigin()
    if (origin) {
        return `${origin}/${token}/lifecycle`
    }

    if (CLOUDFLARE_STREAM_HOST_RE.test(raw)) {
        try {
            const url = new URL(raw)
            return `${url.origin}/${token}/lifecycle`
        } catch {
            return null
        }
    }

    return null
}

export function isWhepPlaybackUrl(src: string): boolean {
    const pathOnly = String(src ?? '').split('?')[0] ?? ''
    return (
        /\/webrtc\/play\/?$/i.test(pathOnly) ||
        /\/webRTC\/play\/[^/]+/i.test(pathOnly)
    )
}

function resolveThumbnailStreamKey(src: string): string | null {
    const raw = String(src ?? '').trim()
    if (!raw) return null
    return (
        resolveWhepVideoUid(raw) ??
        coerceStreamKeyForStorage(raw) ??
        normalizeStreamKey(raw) ??
        resolveStreamKeyForPath(raw)
    )
}

export type CloudflareStreamThumbnailOptions = {
    height?: number
}

/** Cloudflare 直連縮圖（僅伺服器／代理內部使用） */
function buildCloudflareStreamThumbnailUrlDirect(
    src: string,
    options: CloudflareStreamThumbnailOptions = {}
): string | null {
    const token = resolveThumbnailStreamKey(src)
    if (!token) return null

    const height = options?.height ?? 240
    const query = height > 0 ? `?height=${Math.round(height)}` : ''

    const origin = getCloudflareStreamOrigin()
    if (origin) {
        return `${origin}/${token}/thumbnails/thumbnail.jpg${query}`
    }

    const raw = String(src ?? '').trim()
    if (CLOUDFLARE_STREAM_HOST_RE.test(raw)) {
        try {
            const url = new URL(raw.startsWith('http') ? raw : `https://${raw}`)
            return `${url.origin}/${token}/thumbnails/thumbnail.jpg${query}`
        } catch {
            return null
        }
    }

    return null
}

/**
 * 直播列表佔位縮圖：經站點代理，瀏覽器不直連 Cloudflare
 * 例：https://live.gp777s.com/stream/thumbnails/{stream_token}/thumbnail.jpg?height=240
 */
export function buildCloudflareStreamThumbnailUrl(
    src: string,
    options: CloudflareStreamThumbnailOptions = {}
): string | null {
    const token = resolveThumbnailStreamKey(src)
    if (!token) return null

    const height = options?.height ?? 240
    const query = height > 0 ? `?height=${Math.round(height)}` : ''

    const publicOrigin = getWhipPublishPublicOrigin()
    if (publicOrigin) {
        return `${publicOrigin}/stream/thumbnails/${encodeURIComponent(token)}/thumbnail.jpg${query}`
    }

    return buildCloudflareStreamThumbnailUrlDirect(src, options)
}
