import Foundation
import SwiftData

public struct MiniProfile: Equatable, Hashable, Codable {
    public var displayName: String
    public var handle: String
    public var avatarImageUrl: String?
    public var isFollowing: Bool

    init(_ remote: Components.Schemas.MiniProfileSchema) throws {
        self.displayName = remote.display_name
        self.handle = remote.handle
        self.avatarImageUrl = remote.avatar_image_url
        self.isFollowing = remote.is_following ?? false
    }

    enum CodingKeys: String, CodingKey {
        case displayName = "display_name"
        case handle
        case avatarImageUrl = "avatar_image_url"
        case isFollowing = "is_following"
    }

    public init(from decoder: any Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        displayName = try container.decode(String.self, forKey: .displayName)
        handle = try container.decode(String.self, forKey: .handle)
        avatarImageUrl = try container.decode(String?.self, forKey: .avatarImageUrl)
        isFollowing = try container.decode(Bool.self, forKey: .isFollowing)
    }

    public func encode(to encoder: any Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(displayName, forKey: .displayName)
        try container.encode(handle, forKey: .handle)
        try container.encode(avatarImageUrl, forKey: .avatarImageUrl)
        try container.encode(isFollowing, forKey: .isFollowing)
    }
}
