import Foundation
import Localization

public struct UploadRequestStatus: Equatable, Identifiable, Sendable {
    public enum Status: String, Sendable {
        case error
        case complete
        case passedArtistModeration = "passed_artist_moderation"
        case passedAudioProcessing = "passed_audio_processing"
        case passedNsfwProcessing = "passed_nsfw_check"
        case passedVideoProcessing = "passed_video_processing"
        case unknown

        public var title: String {
            switch self {
            case .error: L10n.APIClient.error
            case .complete: L10n.APIClient.complete
            case .passedArtistModeration: L10n.APIClient.processing
            case .passedAudioProcessing: L10n.APIClient.processing
            case .passedVideoProcessing: L10n.APIClient.processing
            case .passedNsfwProcessing: L10n.APIClient.processing
            case .unknown: L10n.APIClient.processing
            }
        }
    }

    public let id: String
    public let status: Status
    public let errorMessage: String?
    public let s3Id: String?
    let title: String?
    public let imageUrl: String?

    init(_ remote: Components.Schemas.UploadRequestStatusSchema) {
        self.id = remote.id
        self.status = Status(rawValue: remote.status) ?? .unknown
        self.errorMessage = remote.error_message
        self.s3Id = remote.s3_id
        self.title = remote.title
        self.imageUrl = remote.image_url
    }

    init(id: String, status: UploadRequestStatus.Status, errorMessage: String? = nil, s3Id: String? = nil, title: String? = nil, imageUrl: String? = nil) {
        self.id = id
        self.status = status
        self.errorMessage = errorMessage
        self.s3Id = s3Id
        self.title = title
        self.imageUrl = imageUrl
    }
}

public extension UploadRequestStatus {
    static func complete(id: String, imageUrl: String? = nil) -> Self {
        .init(id: id, status: .complete, imageUrl: imageUrl)
    }
}
