/**
 * Example: Using POST method to get user list
 * Demonstrates the new postUserList method in UserService
 */

import { ZaloSDK, UserListRequest } from "../src/index";

async function demonstratePostUserList() {
  // Initialize SDK
  const zalo = new ZaloSDK({
    appId: "your-app-id",
    appSecret: "your-app-secret"
  });

  const accessToken = "your-access-token";

  try {
    console.log("=== POST User List Example ===\n");

    // Example 1: Basic user list with POST method
    console.log("1. Getting user list with POST method:");
    const basicRequest: UserListRequest = {
      offset: 0,
      count: 10
    };

    const basicResult = await zalo.user.postUserList(accessToken, basicRequest);
    console.log("Basic POST result:", {
      total: basicResult.total,
      userCount: basicResult.users.length,
      users: basicResult.users.map(user => ({
        user_id: user.user_id,
        display_name: user.display_name,
        user_is_follower: user.user_is_follower
      }))
    });

    // Example 2: Filtered user list with tag
    console.log("\n2. Getting users with specific tag (POST method):");
    const taggedRequest: UserListRequest = {
      offset: 0,
      count: 20,
      tag_name: "VIP_CUSTOMER"
    };

    const taggedResult = await zalo.user.postUserList(accessToken, taggedRequest);
    console.log("Tagged users POST result:", {
      total: taggedResult.total,
      userCount: taggedResult.users.length,
      tag_filter: "VIP_CUSTOMER"
    });

    // Example 3: Followers only with POST method
    console.log("\n3. Getting followers only (POST method):");
    const followersRequest: UserListRequest = {
      offset: 0,
      count: 15,
      is_follower: true
    };

    const followersResult = await zalo.user.postUserList(accessToken, followersRequest);
    console.log("Followers POST result:", {
      total: followersResult.total,
      userCount: followersResult.users.length,
      followers_only: true
    });

    // Example 4: Users with recent interaction (POST method)
    console.log("\n4. Getting users with recent interaction (POST method):");
    const recentRequest: UserListRequest = {
      offset: 0,
      count: 25,
      last_interaction_period: "7d" // Last 7 days
    };

    const recentResult = await zalo.user.postUserList(accessToken, recentRequest);
    console.log("Recent interaction POST result:", {
      total: recentResult.total,
      userCount: recentResult.users.length,
      interaction_period: "7d"
    });

    // Example 5: Compare GET vs POST methods
    console.log("\n5. Comparing GET vs POST methods:");
    
    const compareRequest: UserListRequest = {
      offset: 0,
      count: 5
    };

    // GET method
    const getResult = await zalo.user.getUserList(accessToken, compareRequest);
    console.log("GET method result:", {
      total: getResult.total,
      userCount: getResult.users.length,
      method: "GET"
    });

    // POST method
    const postResult = await zalo.user.postUserList(accessToken, compareRequest);
    console.log("POST method result:", {
      total: postResult.total,
      userCount: postResult.users.length,
      method: "POST"
    });

    console.log("Results should be identical:", {
      totals_match: getResult.total === postResult.total,
      counts_match: getResult.users.length === postResult.users.length
    });

  } catch (error) {
    console.error("Error in POST user list example:", error);
    
    if (error instanceof Error) {
      console.error("Error details:", {
        name: error.name,
        message: error.message,
        stack: error.stack
      });
    }
  }
}

// Example usage with pagination using POST method
async function demonstratePaginationWithPost() {
  const zalo = new ZaloSDK({
    appId: "your-app-id",
    appSecret: "your-app-secret"
  });

  const accessToken = "your-access-token";

  try {
    console.log("\n=== POST Method Pagination Example ===\n");

    let offset = 0;
    const count = 10;
    let allUsers: any[] = [];
    let totalUsers = 0;

    do {
      const request: UserListRequest = {
        offset,
        count
      };

      const result = await zalo.user.postUserList(accessToken, request);
      
      console.log(`Page ${Math.floor(offset / count) + 1}:`, {
        offset,
        returned: result.users.length,
        total: result.total
      });

      allUsers.push(...result.users);
      totalUsers = result.total;
      offset += count;

      // Break if we've got all users or no more users returned
      if (result.users.length < count || allUsers.length >= totalUsers) {
        break;
      }

    } while (true);

    console.log("\nPagination complete:", {
      total_users: totalUsers,
      fetched_users: allUsers.length,
      method: "POST"
    });

  } catch (error) {
    console.error("Error in POST pagination example:", error);
  }
}

// Run examples
if (require.main === module) {
  demonstratePostUserList()
    .then(() => demonstratePaginationWithPost())
    .then(() => console.log("\n✅ POST User List examples completed!"))
    .catch(error => console.error("❌ Example failed:", error));
}

export { demonstratePostUserList, demonstratePaginationWithPost };
