/**
 * Example: Update Article Status
 * 
 * Demonstrates how to update article status using the RedAI Zalo SDK
 */

import { ZaloSDK, ArticleStatus, CommentStatus } from '../src';

async function updateArticleStatusExample() {
  // Initialize SDK
  const sdk = new ZaloSDK();
  
  // Your access token
  const accessToken = 'YOUR_ACCESS_TOKEN';
  
  // Article ID to update
  const articleId = 'YOUR_ARTICLE_ID';

  try {
    console.log('🔄 Updating article status...');

    // Example 1: Update status to 'show' (publish)
    const publishResult = await sdk.article.updateArticleStatus(
      accessToken,
      articleId,
      ArticleStatus.SHOW
    );
    
    console.log('✅ Article published successfully!');
    console.log('Update token:', publishResult.token);

    // Wait a moment before next update
    await new Promise(resolve => setTimeout(resolve, 2000));

    // Example 2: Update status to 'hide' (unpublish) and disable comments
    const hideResult = await sdk.article.updateArticleStatus(
      accessToken,
      articleId,
      ArticleStatus.HIDE,
      CommentStatus.HIDE
    );
    
    console.log('✅ Article hidden successfully!');
    console.log('Update token:', hideResult.token);

    // Example 3: Check update progress
    console.log('🔍 Checking update progress...');
    const progress = await sdk.article.checkArticleProcess(
      accessToken,
      hideResult.token
    );
    
    console.log('Update progress:', progress);

    // Example 4: Get updated article details to verify changes
    console.log('📄 Getting updated article details...');
    const updatedArticle = await sdk.article.getArticleDetail(
      accessToken,
      articleId
    );
    
    console.log('Updated article status:', updatedArticle.status);
    console.log('Updated comment status:', updatedArticle.comment);

  } catch (error) {
    console.error('❌ Error updating article status:', error);
    
    if (error instanceof Error) {
      console.error('Error message:', error.message);
    }
  }
}

// Advanced example: Batch status update
async function batchUpdateArticleStatus() {
  const sdk = new ZaloSDK();
  const accessToken = 'YOUR_ACCESS_TOKEN';
  
  // List of article IDs to update
  const articleIds = ['ARTICLE_ID_1', 'ARTICLE_ID_2', 'ARTICLE_ID_3'];
  
  console.log('🔄 Batch updating article statuses...');
  
  const results = [];
  
  for (const articleId of articleIds) {
    try {
      console.log(`Updating article ${articleId}...`);
      
      const result = await sdk.article.updateArticleStatus(
        accessToken,
        articleId,
        ArticleStatus.SHOW,
        CommentStatus.SHOW
      );
      
      results.push({
        articleId,
        success: true,
        token: result.token
      });
      
      console.log(`✅ Article ${articleId} updated successfully`);
      
      // Add delay to avoid rate limiting
      await new Promise(resolve => setTimeout(resolve, 1000));
      
    } catch (error) {
      console.error(`❌ Failed to update article ${articleId}:`, error);
      
      results.push({
        articleId,
        success: false,
        error: error instanceof Error ? error.message : 'Unknown error'
      });
    }
  }
  
  console.log('📊 Batch update results:', results);
  return results;
}

// Example with error handling and retry logic
async function updateArticleStatusWithRetry() {
  const sdk = new ZaloSDK();
  const accessToken = 'YOUR_ACCESS_TOKEN';
  const articleId = 'YOUR_ARTICLE_ID';
  const maxRetries = 3;
  
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      console.log(`🔄 Attempt ${attempt}/${maxRetries}: Updating article status...`);
      
      const result = await sdk.article.updateArticleStatus(
        accessToken,
        articleId,
        ArticleStatus.SHOW
      );
      
      console.log('✅ Article status updated successfully!');
      console.log('Update token:', result.token);
      
      return result;
      
    } catch (error) {
      console.error(`❌ Attempt ${attempt} failed:`, error);
      
      if (attempt === maxRetries) {
        console.error('🚫 All retry attempts failed');
        throw error;
      }
      
      // Wait before retry (exponential backoff)
      const delay = Math.pow(2, attempt) * 1000;
      console.log(`⏳ Waiting ${delay}ms before retry...`);
      await new Promise(resolve => setTimeout(resolve, delay));
    }
  }
}

// Run examples
if (require.main === module) {
  console.log('🚀 Running Article Status Update Examples...\n');
  
  // Uncomment the example you want to run:
  
  // updateArticleStatusExample();
  // batchUpdateArticleStatus();
  // updateArticleStatusWithRetry();
  
  console.log('\n💡 Remember to replace YOUR_ACCESS_TOKEN and YOUR_ARTICLE_ID with actual values!');
}

export {
  updateArticleStatusExample,
  batchUpdateArticleStatus,
  updateArticleStatusWithRetry
};
