import APIClient
import Foundation
import StatsigClient

extension BlendedCreatePrompt {
    func asSimpleGenAPI(model: String, lyricsModel: String? = "") -> GenParamsSpec {
        // Simple mode implementation
        GenParamsSpec(
            continueAt: continueAt,
            continueClipId: continueClipId,
            coverClipId: coverClipId,
            generationType: .init(rawValue: generationType.rawValue),
            gptDescriptionPrompt: description,
            includeHistory: includeHistory,
            isRemix: isRemix,
            makeInstrumental: lyricsMode.isInstrumental,
            metadata: GenParamsSpec.makeMetadata(
                createMode: createMode.toString(),
                lyricsModel: lyricsModel // Pass the lyrics model in metadata
            ),
            mv: model,
            prompt: lyricsMode.isInstrumental ? "" : lyrics,
            task: .init(rawValue: task?.rawValue ?? ""),
            title: title,
            token: token
        )
    }

    func asBlendedGenAPI(model: String, lyricsModel: String? = "") -> GenParamsSpec {
        // Blended Simple mode implementation
        return GenParamsSpec(
            continueAt: continueAt,
            continueClipId: continueClipId,
            coverClipId: coverClipId,
            generationType: .init(rawValue: generationType.rawValue),
            gptDescriptionPrompt: description,
            includeHistory: includeHistory,
            isRemix: isRemix,
            makeInstrumental: lyricsMode.isInstrumental,
            metadata: GenParamsSpec.makeMetadata(
                createMode: createMode.toString(),
                lyricsModel: lyricsModel // Pass the lyrics model in metadata
            ),
            mv: model,
            overrideFields: [.prompt],
            prompt: lyricsMode.isInstrumental ? "" : lyrics,
            task: .init(rawValue: task?.rawValue ?? ""),
            title: title,
            token: token
        )
    }

    func asCustomGenAPI(model: String, lyricsModel: String? = "", useSliders: Bool) -> GenParamsSpec {
        let metadata: AnyJSON?
        /// For extra safety
        if useSliders {
            metadata = GenParamsSpec.makeMetadata(
                createMode: createMode.toString(),
                lyricsModel: lyricsModel, // Pass the lyrics model in metadata
                weirdnessConstraint: weirdnessConstraint != BlendedCreatePrompt.defaultSliderValue ? weirdnessConstraint : nil, // Don't send slider values unless they've changed
                styleWeight: styleWeight != BlendedCreatePrompt.defaultSliderValue ? styleWeight : nil, // Don't send slider values unless they've changed
                audioWeight: audioWeight != BlendedCreatePrompt.defaultSliderValue ? audioWeight : nil, // Don't send slider values unless they've changed
                canControlSliders: availableSliders.map { $0.metadataTitle }
            )
        } else {
            metadata = GenParamsSpec.makeMetadata(
                createMode: createMode.toString(),
                lyricsModel: lyricsModel // Pass the lyrics model in metadata
            )
        }
        // Custom mode implementation
        return GenParamsSpec(
            continueAt: continueAt,
            continueClipId: continueClipId,
            coverClipId: coverClipId,
            generationType: .init(rawValue: generationType.rawValue),
            includeHistory: includeHistory,
            isRemix: isRemix,
            makeInstrumental: lyricsMode.isInstrumental,
            metadata: metadata,
            mv: model,
            negativeTags: useNegativeTags ? excludeStyleText : "",
            prompt: lyricsMode.isInstrumental ? "" : lyrics,
            tags: styleText,
            task: .init(rawValue: task?.rawValue ?? ""),
            title: title,
            token: token
        )
    }
}
