//
//  CreatorCommunityApi.swift
//  SodaLive
//
//  Created by klaus on 2023/12/19.
//

import Foundation
import Moya

enum CreatorCommunityApi {
    case createCommunityPost(parameters: [MultipartFormData])
    case modifyCommunityPost(parameters: [MultipartFormData])
    case getCommunityPostList(creatorId: Int, page: Int, size: Int)
    case getCommunityPostDetail(postId: Int)
    case communityPostLike(postId: Int)
    case createCommunityPostComment(comment: String, postId: Int, parentId: Int?)
    case getCommunityPostCommentList(postId: Int, page: Int, size: Int)
    case getCommentReplyList(commentId: Int, page: Int, size: Int)
    case modifyComment(request: ModifyCommunityPostCommentRequest)
    case getLatestPostListFromCreatorsYouFollow
    case purchaseCommunityPost(postId: Int)
}

extension CreatorCommunityApi: TargetType {
    var baseURL: URL {
        return URL(string: BASE_URL)!
    }
    
    var path: String {
        switch self {
        case .createCommunityPost, .getCommunityPostList, .modifyCommunityPost:
            return "/creator-community"
            
        case .communityPostLike:
            return "/creator-community/like"
            
        case .createCommunityPostComment, .modifyComment:
            return "/creator-community/comment"
            
        case .getCommunityPostCommentList(let postId, _, _):
            return "/creator-community/\(postId)/comment"
            
        case .getCommentReplyList(let commentId, _, _):
            return "/creator-community/comment/\(commentId)"
            
        case .getCommunityPostDetail(let postId):
            return "/creator-community/\(postId)"
            
        case .getLatestPostListFromCreatorsYouFollow:
            return "/creator-community/latest"
            
        case .purchaseCommunityPost:
            return "/creator-community/purchase"
        }
    }
    
    var method: Moya.Method {
        switch self {
        case .createCommunityPost, .communityPostLike, .createCommunityPostComment, .purchaseCommunityPost:
            return .post
            
        case .getCommunityPostList, .getCommunityPostCommentList, .getCommentReplyList, .getCommunityPostDetail, .getLatestPostListFromCreatorsYouFollow:
            return .get
            
        case .modifyComment, .modifyCommunityPost:
            return .put
        }
    }
    
    var task: Moya.Task {
        switch self {
        case .createCommunityPost(let parameters):
            return .uploadMultipart(parameters)
            
        case .modifyCommunityPost(let parameters):
            return .uploadMultipart(parameters)
            
        case .getCommunityPostList(let creatorId, let page, let size):
            let parameters = [
                "creatorId": creatorId,
                "page": page - 1,
                "size": size,
                "timezone": TimeZone.current.identifier
            ] as [String: Any]
            return .requestParameters(parameters: parameters, encoding: URLEncoding.queryString)
            
        case .communityPostLike(let postId):
            let request = PostCommunityPostLikeRequest(postId: postId)
            return .requestJSONEncodable(request)
            
        case .createCommunityPostComment(let comment, let postId, let parentId):
            let request = CreateCommunityPostCommentRequest(comment: comment, postId: postId, parentId: parentId)
            return .requestJSONEncodable(request)
            
        case .getCommunityPostCommentList(_, let page, let size):
            let parameters = [
                "page": page - 1,
                "size": size,
                "timezone": TimeZone.current.identifier
            ] as [String: Any]
            return .requestParameters(parameters: parameters, encoding: URLEncoding.queryString)
            
        case .getCommentReplyList(_, let page, let size):
            let parameters = [
                "page": page - 1,
                "size": size,
                "timezone": TimeZone.current.identifier
            ] as [String: Any]
            return .requestParameters(parameters: parameters, encoding: URLEncoding.queryString)
            
        case .modifyComment(let request):
            return .requestJSONEncodable(request)
        
        case .getCommunityPostDetail:
            let parameters = ["timezone": TimeZone.current.identifier] as [String: Any]
            return .requestParameters(parameters: parameters, encoding: URLEncoding.queryString)
            
        case .getLatestPostListFromCreatorsYouFollow:
            let parameters = ["timezone": TimeZone.current.identifier] as [String: Any]
            return .requestParameters(parameters: parameters, encoding: URLEncoding.queryString)
            
        case .purchaseCommunityPost(let postId):
            return .requestJSONEncodable(PurchasePostRequest(postId: postId))
        }
    }
    
    var headers: [String : String]? {
        return ["Authorization": "Bearer \(UserDefaults.string(forKey: UserDefaultsKey.token))"]
    }
}