using Newtonsoft.Json.Linq;
using OF_DL.Models;
using OF_DL.Models.Archived;
using OF_DL.Models.Messages;
using OF_DL.Models.Post;
using OF_DL.Models.Purchased;
using OF_DL.Models.Streams;
using OF_DL.Enumerations;
using Spectre.Console;

namespace OF_DL.Services;

public interface IAPIService
{
    Task<string> GetDecryptionKeyCDRMProject(Dictionary<string, string> drmHeaders, string licenceURL, string pssh);
    Task<string> GetDecryptionKeyCDM(Dictionary<string, string> drmHeaders, string licenceURL, string pssh);
    Task<DateTime> GetDRMMPDLastModified(string mpdUrl, string policy, string signature, string kvp);
    Task<string> GetDRMMPDPSSH(string mpdUrl, string policy, string signature, string kvp);
    Task<Dictionary<string, long>> GetLists(string endpoint);
    Task<List<string>> GetListUsers(string endpoint);

    Task<Dictionary<long, string>> GetMedia(MediaType mediatype, string endpoint, string? username, string folder,
        List<long> paid_post_ids);

    Task<PaidPostCollection> GetPaidPosts(string endpoint, string folder, string username, List<long> paid_post_ids,
        StatusContext ctx);

    Task<PostCollection> GetPosts(string endpoint, string folder, List<long> paid_post_ids, StatusContext ctx);
    Task<SinglePostCollection> GetPost(string endpoint, string folder);
    Task<StreamsCollection> GetStreams(string endpoint, string folder, List<long> paid_post_ids, StatusContext ctx);
    Task<ArchivedCollection> GetArchived(string endpoint, string folder, StatusContext ctx);
    Task<MessageCollection> GetMessages(string endpoint, string folder, StatusContext ctx);
    Task<PaidMessageCollection> GetPaidMessages(string endpoint, string folder, string username, StatusContext ctx);
    Task<SinglePaidMessageCollection> GetPaidMessage(string endpoint, string folder);
    Task<Dictionary<string, long>> GetPurchasedTabUsers(string endpoint, Dictionary<string, long> users);
    Task<List<PurchasedTabCollection>> GetPurchasedTab(string endpoint, string folder, Dictionary<string, long> users);
    Task<User> GetUserInfo(string endpoint);
    Task<JObject> GetUserInfoById(string endpoint);
    Dictionary<string, string> GetDynamicHeaders(string path, string queryParam);
    Task<Dictionary<string, long>> GetActiveSubscriptions(string endpoint, bool includeRestrictedSubscriptions);
    Task<Dictionary<string, long>> GetExpiredSubscriptions(string endpoint, bool includeRestrictedSubscriptions);
    Task<string> GetDecryptionKeyOFDL(Dictionary<string, string> drmHeaders, string licenceURL, string pssh);
}
