import { ApiTFOption } from "../type";

export type BaseCommandProps =
  | {
      command: "Fileman";
      subcommand:
        | "list_files"
        | "upload_files"
        | "get_file_information"
        | "get_file_content"
        | "save_file_content";
    }
  | { command: "SubDomain"; subcommand: "addsubdomain" }
  | { command: "DomainInfo"; subcommand: "domains_data" }
  | { command: "Mime"; subcommand: "add_redirect" | "delete_redirect" }
  | { command: "SSL"; subcommand: "toggle_ssl_redirect_for_domains" };

// Fileman List Files

type MimeType =
  | string
  | "application/javascript"
  | "application/json"
  | "application/octet-stream"
  | "application/pdf"
  | "application/x-font-ttf"
  | "application/xhtml+xml"
  | "application/xml"
  | "image/bmp"
  | "image/gif"
  | "image/jpeg"
  | "image/png"
  | "image/svg+xml"
  | "image/webp"
  | "text/css"
  | "text/html"
  | "text/javascript"
  | "text/plain";

export type FilemanFileListProps = {
  dir: string;
  check_for_leaf_directories?: ApiTFOption;
  include_hash?: ApiTFOption;
  include_mime?: ApiTFOption;
  include_permissions?: ApiTFOption;
  limit_to_list?: ApiTFOption;
  mime_types?: MimeType;
};

// Fileman Upload Files

export type FilemanUploadFilesProps = {
  dir: string;
  body: FormData;
  method?: "POST";
};

// Fileman Get File Information

export type FilemanGetFileInformationProps = {
  path: string;
  check_for_leaf_directories?: ApiTFOption;
  include_hash?: ApiTFOption;
  include_mime?: ApiTFOption;
  include_permissions?: ApiTFOption;
  show_hidden?: ApiTFOption;
};

// Fileman Get File Content

export type FilemanGetFileContentProps = {
  dir: string;
  file: string;
  from_charset?: string;
  to_charset?: string;
  update_html_document_encoding?: ApiTFOption;
};

// Fileman Save File Content
export type FilemanSaveFileContentProps = {
  file: string;
  content?: string;
  dir?: string;
  fallback?: ApiTFOption;
  from_charset?: string;
  to_charset?: string;
}

// DomainsInfo Domain Data

export type DomainsInfoDomainDataProps = {
  format: "hash" | "list";
  return_https_redirects_status?: ApiTFOption;
};

// Mime Delete Redirect

export type MimeDeleteRedirectProps = {
  domain: string;
  args?: string;
  docroot?: string;
  src?: string;
};

// Mime Add Redirect
export type MimeAddRedirectProps = {
  domain: string;
  redirect: string;
  redirect_wildcard?: ApiTFOption;
  redirect_www?: ApiTFOption | 2;
  src?: string;
  type?: string;
};
