//
//  InstanceSelector.swift
//  Pachyderm
//
//  Created by Shadowfacts on 9/15/19.
//  Copyright © 2019 Shadowfacts. All rights reserved.
//

import Foundation

public class InstanceSelector {
    
    private static let decoder = JSONDecoder()
    
    public static func getInstances(category: String?, completion: @escaping (Result<[Instance], Client.ErrorType>) -> Void) {
        let url: URL
        if let category = category {
            url = URL(string: "https://api.joinmastodon.org/servers?category=\(category)")!
        } else {
            url = URL(string: "https://api.joinmastodon.org/servers")!
        }
        let request = URLRequest(url: url)
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            if let error = error {
                completion(.failure(.networkError(error)))
                return
            }
            guard let data = data,
                let response = response as? HTTPURLResponse else {
                    completion(.failure(.invalidResponse))
                    return
            }
            guard response.statusCode == 200 else {
                completion(.failure(.unexpectedStatus(response.statusCode)))
                return
            }
            let result: [Instance]
            do {
                result = try decoder.decode([Instance].self, from: data)
            } catch {
                completion(.failure(.invalidModel(error)))
                return
            }
            completion(.success(result))
        }
        task.resume()
    }
    
}

public extension InstanceSelector {
    struct Instance: Codable {
        public let domain: String
        public let description: String
        public let proxiedThumbnailURL: URL
        public let language: String
        public let category: String
        
        enum CodingKeys: String, CodingKey {
            case domain
            case description
            case proxiedThumbnailURL = "proxied_thumbnail"
            case language
            case category
        }
    }
}
