import { defineModule, defineRoute } from "../../shared/define-module"
import type {
  SubscriptionBatchRequest,
  SubscriptionBatchResponse,
  SubscriptionCreateRequest,
  SubscriptionCreateResponse,
  SubscriptionDeleteRequest,
  SubscriptionDeleteResponse,
  SubscriptionExportQuery,
  SubscriptionExportResponse,
  SubscriptionGetQuery,
  SubscriptionGetResponse,
  SubscriptionImportResponse,
  SubscriptionParseOpmlResponse,
  SubscriptionUpdateRequest,
  SubscriptionUpdateResponse,
} from "./types"

/**
 * Subscriptions module definition with nested routes
 */
export const subscriptionsModule = defineModule({
  name: "subscriptions",
  prefix: "/subscriptions",
  routes: {
    // Basic subscription operations
    get: defineRoute<SubscriptionGetQuery, SubscriptionGetResponse>("GET", "/"),

    create: defineRoute<SubscriptionCreateRequest, SubscriptionCreateResponse>(
      "POST",
      "/",
    ),

    update: defineRoute<SubscriptionUpdateRequest, SubscriptionUpdateResponse>(
      "PATCH",
      "/",
    ),

    delete: defineRoute<SubscriptionDeleteRequest, SubscriptionDeleteResponse>(
      "DELETE",
      "/",
    ),

    // Batch patch operations
    batchUpdate: defineRoute<
      SubscriptionBatchRequest,
      SubscriptionBatchResponse
    >("PATCH", "/batch"),

    // OPML operations
    /**
     * FormData:
     * file: File
     * items: string
     */
    import: defineRoute<FormData, SubscriptionImportResponse>(
      "POST",
      "/import",
      {
        requestType: "formData",
      },
    ),

    export: defineRoute<SubscriptionExportQuery, SubscriptionExportResponse>(
      "GET",
      "/export",
    ),

    parseOpml: defineRoute<ArrayBuffer, SubscriptionParseOpmlResponse>(
      "POST",
      "/parse-opml",
      {
        requestType: "arrayBuffer",
      },
    ),
  },
})

// Export the API type
export type SubscriptionsAPI = typeof subscriptionsModule.api

// Re-export types for external consumption
export type * from "./types"
