import Foundation
import StatsigClient

public struct SunoModelUserAccess: Equatable {
    public static let defaultLimitedAccess = SunoModelUserAccess(
        remasterAccess: .freeUserWithoutFreeLifetimeGenerationsLeft,
        v4Access: .freeUserWithoutFreeLifetimeGenerationsLeft
    )

    public static let paidUser = SunoModelUserAccess(
        remasterAccess: .paidUser,
        v4Access: .paidUser
    )

    public let remasterAccess: UserRemasterAccessCategory
    public let v4Access: UserV4AccessCategory

    public init(
        remasterAccess: UserRemasterAccessCategory,
        v4Access: UserV4AccessCategory
    ) {
        self.remasterAccess = remasterAccess
        self.v4Access = v4Access
    }
}

public enum UserRemasterAccessCategory: Equatable {
    case freeUserWithFreeLifetimeGenerationsLeft(_ count: Int)
    case freeUserWithoutFreeLifetimeGenerationsLeft
    case paidUser

    public var hasAccess: Bool {
        switch self {
        case .paidUser:
            return true
        case .freeUserWithoutFreeLifetimeGenerationsLeft,
             .freeUserWithFreeLifetimeGenerationsLeft:
            return false
        }
    }
}

public enum UserV4AccessCategory: Equatable {
    case freeUserWithFreeLifetimeGenerationsLeft(_ count: Int)
    case freeUserWithoutFreeLifetimeGenerationsLeft
    case paidUser
}
