//
//  MockURLProtocol.swift
//  APICore
//
//  Created by Javier Cicchelli on 10/04/2023.
//  Copyright © 2023 Röck+Cöde. All rights reserved.
//

import Foundation

public class MockURLProtocol: URLProtocol {
    
    // MARK: Properties
    
    public static var mockData: [URL: MockURLResponse] = [:]
    
    // MARK: Functions
    
    public override class func canInit(with task: URLSessionTask) -> Bool {
        true
    }
    
    public override class func canInit(with request: URLRequest) -> Bool {
        true
    }
    
    public override class func canonicalRequest(for request: URLRequest) -> URLRequest {
        request
    }
    
    public override func startLoading() {
        guard
            let url = request.url,
            let response = Self.mockData[url]
        else {
            client?.urlProtocolDidFinishLoading(self)
            return
        }
        
        if let data = response.data {
            client?.urlProtocol(self, didLoad: data)
        }
        
        if let httpResponse = HTTPURLResponse(
            url: url,
            statusCode: response.status,
            httpVersion: nil,
            headerFields: response.headers
        ) {
            client?.urlProtocol(
                self,
                didReceive: httpResponse, 
                cacheStoragePolicy: .allowedInMemoryOnly
            )
        }

        client?.urlProtocolDidFinishLoading(self)
    }
    
    public override func stopLoading() {}

}
