namespace java org.pyload.thrift

typedef i32 FileID
typedef i32 PackageID
typedef i32 TaskID
typedef i32 ResultID
typedef i32 InteractionID
typedef list<string> LinkList
typedef string PluginName
typedef byte Progress
typedef byte Priority


enum DownloadStatus {
  Finished
  Offline,
  Online,
  Queued,
  Skipped,
  Waiting,
  TempOffline,
  Starting,
  Failed,
  Aborted,
  Decrypting,
  Custom,
  Downloading,
  Processing,
  Unknown
}

enum Destination {
  Collector,
  Queue
}

enum ElementType {
  Package,
  File
}

// types for user interaction
// some may only be place holder currently not supported
// also all input - output combination are not reasonable, see InteractionManager for further info
enum Input {
  NONE,
  TEXT,
  TEXTBOX,
  PASSWORD,
  BOOL,   // confirm like, yes or no dialog
  CLICK,  // for positional captchas
  CHOICE,  // choice from list
  MULTIPLE,  // multiple choice from list of elements
  LIST, // arbitary list of elements
  TABLE  // table like data structure
}
// more can be implemented by need

// this describes the type of the outgoing interaction
// ensure they can be logcial or'ed
enum Output {
  CAPTCHA = 1,
  QUESTION = 2,
  NOTIFICATION = 4,
}

struct DownloadInfo {
  1: FileID fid,
  2: string name,
  3: i64 speed,
  4: i32 eta,
  5: string format_eta,
  6: i64 bleft,
  7: i64 size,
  8: string format_size,
  9: Progress percent,
  10: DownloadStatus status,
  11: string statusmsg,
  12: string format_wait,
  13: i64 wait_until,
  14: PackageID packageID,
  15: string packageName,
  16: PluginName plugin,
}

struct ServerStatus {
  1: bool pause,
  2: i16 active,
  3: i16 queue,
  4: i16 total,
  5: i64 speed,
  6: bool download,
  7: bool reconnect
}

struct ConfigItem {
  1: string name,
  2: string description,
  3: string value,
  4: string type,
}

struct ConfigSection {
  1: string name,
  2: string description,
  3: list<ConfigItem> items,
  4: optional string outline
}

struct FileData {
  1: FileID fid,
  2: string url,
  3: string name,
  4: PluginName plugin,
  5: i64 size,
  6: string format_size,
  7: DownloadStatus status,
  8: string statusmsg,
  9: PackageID packageID,
  10: string error,
  11: i16 order
}

struct PackageData {
  1: PackageID pid,
  2: string name,
  3: string folder,
  4: string site,
  5: string password,
  6: Destination dest,
  7: i16 order,
  8: optional i16 linksdone,
  9: optional i64 sizedone,
  10: optional i64 sizetotal,
  11: optional i16 linkstotal,
  12: optional list<FileData> links,
  13: optional list<FileID> fids
}

struct InteractionTask {
  1: InteractionID iid,
  2: Input input,
  3: list<string> structure,
  4: list<string> preset,
  5: Output output,
  6: list<string> data,
  7: string title,
  8: string description,
  9: string plugin,
}

struct CaptchaTask {
  1: i16 tid,
  2: binary data,
  3: string type,
  4: string resultType
}

struct EventInfo {
  1: string eventname,
  2: optional i32 id,
  3: optional ElementType type,
  4: optional Destination destination
}

struct UserData {
  1: string name,
  2: string email,
  3: i32 role,
  4: i32 permission,
  5: string templateName
}

struct AccountInfo {
  1: i64 validuntil,
  2: string login,
  3: map<string, list<string>> options,
  4: bool valid,
  5: i64 trafficleft,
  6: i64 maxtraffic,
  7: bool premium,
  8: string type,
}

struct ServiceCall {
    1: PluginName plugin,
    2: string func,
    3: optional list<string> arguments,
    4: optional bool parseArguments,  //default False
}

struct OnlineStatus {
    1: string name,
    2: PluginName plugin,
    3: string packagename,
    4: DownloadStatus status,
    5: i64 size,   // size <= 0 : unknown
}

struct OnlineCheck {
    1: ResultID rid, // -1 -> nothing more to get
    2: map<string, OnlineStatus> data, //url to result
}


// exceptions

exception PackageDoesNotExists{
  1: PackageID pid
}

exception FileDoesNotExists{
  1: FileID fid
}

exception ServiceDoesNotExists{
  1: string plugin
  2: string func
}

exception ServiceException{
  1: string msg
}

service Pyload {

  //config
  string getConfigValue(1: string category, 2: string option, 3: string section),
  void setConfigValue(1: string category, 2: string option, 3: string value, 4: string section),
  map<string, ConfigSection> getConfig(),
  map<string, ConfigSection> getPluginConfig(),

  // server status
  void pauseServer(),
  void unpauseServer(),
  bool togglePause(),
  ServerStatus statusServer(),
  i64 freeSpace(),
  string getServerVersion(),
  void kill(),
  void restart(),
  list<string> getLog(1: i32 offset),
  bool isTimeDownload(),
  bool isTimeReconnect(),
  bool toggleReconnect(),

  // download preparing

  // packagename - urls
  map<string, LinkList> generatePackages(1: LinkList links),
  map<PluginName, LinkList> checkURLs(1: LinkList urls),
  map<PluginName, LinkList> parseURLs(1: string html, 2: string url),

  // parses results and generates packages
  OnlineCheck checkOnlineStatus(1: LinkList urls),
  OnlineCheck checkOnlineStatusContainer(1: LinkList urls, 2: string filename, 3: binary data)

  // poll results from previosly started online check
  OnlineCheck pollResults(1: ResultID rid),

  // downloads - information
  list<DownloadInfo> statusDownloads(),
  PackageData getPackageData(1: PackageID pid) throws (1: PackageDoesNotExists e),
  PackageData getPackageInfo(1: PackageID pid) throws (1: PackageDoesNotExists e),
  FileData getFileData(1: FileID fid) throws (1: FileDoesNotExists e),
  list<PackageData> getQueue(),
  list<PackageData> getCollector(),
  list<PackageData> getQueueData(),
  list<PackageData> getCollectorData(),
  map<i16, PackageID> getPackageOrder(1: Destination destination),
  map<i16, FileID> getFileOrder(1: PackageID pid)

  // downloads - adding/deleting
  list<PackageID> generateAndAddPackages(1: LinkList links, 2: Destination dest),
  PackageID addPackage(1: string name, 2: LinkList links, 3: Destination dest),
  void addFiles(1: PackageID pid, 2: LinkList links),
  void uploadContainer(1: string filename, 2: binary data),
  void deleteFiles(1: list<FileID> fids),
  void deletePackages(1: list<PackageID> pids),

  // downloads - modifying
  void pushToQueue(1: PackageID pid),
  void pullFromQueue(1: PackageID pid),
  void restartPackage(1: PackageID pid),
  void restartFile(1: FileID fid),
  void recheckPackage(1: PackageID pid),
  void stopAllDownloads(),
  void stopDownloads(1: list<FileID> fids),
  void setPackageName(1: PackageID pid, 2: string name),
  void movePackage(1: Destination destination, 2: PackageID pid),
  void moveFiles(1: list<FileID> fids, 2: PackageID pid),
  void orderPackage(1: PackageID pid, 2: i16 position),
  void orderFile(1: FileID fid, 2: i16 position),
  void setPackageData(1: PackageID pid, 2: map<string, string> data) throws (1: PackageDoesNotExists e),
  list<PackageID> deleteFinished(),
  void restartFailed(),

  //events
  list<EventInfo> getEvents(1: string uuid)
  
  //accounts
  list<AccountInfo> getAccounts(1: bool refresh),
  list<string> getAccountTypes()
  void updateAccount(1: PluginName plugin, 2: string account, 3: string password, 4: map<string, string> options),
  void removeAccount(1: PluginName plugin, 2: string account),
  
  //auth
  bool login(1: string username, 2: string password),
  UserData getUserData(1: string username, 2:string password),
  map<string, UserData> getAllUserData(),

  //services

  // servicename : description
  map<PluginName, map<string, string>> getServices(),
  bool hasService(1: PluginName plugin, 2: string func),
  string call(1: ServiceCall info) throws (1: ServiceDoesNotExists ex, 2: ServiceException e),


  //info
  // {plugin: {name: value}}
  map<PluginName, map<string,string>> getAllInfo(),
  map<string, string> getInfoByPlugin(1: PluginName plugin),

  //scheduler

  // TODO


  // User interaction

  //captcha
  bool isCaptchaWaiting(),
  CaptchaTask getCaptchaTask(1: bool exclusive),
  string getCaptchaTaskStatus(1: TaskID tid),
  void setCaptchaResult(1: TaskID tid, 2: string result),
}