#include <stdio.h>

#include "../global.h"
#include "shared_news_util.h"

int can_move_msg_up(int uses_folders, MSG_TREE_NODE *head, MSG_TREE_NODE *target_msg)
{

 int prev_is_folder;
 int target_is_folder;
 
 if(!target_msg || (target_msg == head)) /* root of entire tree can't be moved up */
     return 0;
 else 
   if(!uses_folders)  /* groups that don't use folders only move their topics around, so above test is sufficient */
       return 1;
   else   /* we're using folders */
     {
       /* top level messages or folders can always be moved up,
       ** provided it isn't already the root of the tree (this was tested up top)
       */
       if(target_msg->data.info.reply_to == -1)
          return 1;

       /* Can't move up if this is already the first item in the 'next' chain 
       ** Test if the target is a direct reply to the message pointed to by the prev pointer
       */
       if(!target_msg->prev || target_msg->data.info.reply_to == target_msg->prev->data.info.msg_id)
          return 0;
          
          
       /* A folder can be swapped with a folder, or a message can be swapped with a message,
       ** but folders and messages can't be swapped
       */   
       prev_is_folder = is_folder(&(target_msg->prev->data));   /* shared_news_util.c */        
       target_is_folder = is_folder(&(target_msg->data));      /* shared_news_util.c */           

       if( (prev_is_folder && target_is_folder) ||
           (!prev_is_folder && !target_is_folder)  )
                return 1;
       else
                return 0; 

     }   
   
}




int can_move_msg_down(int uses_folders, MSG_TREE_NODE *head, MSG_TREE_NODE *target_msg)
{

 int next_is_folder;
 int target_is_folder;
 
 
 if(!target_msg || (!target_msg -> next)) /* already at end - can't move down */
     return 0;
 else 
   if(!uses_folders)  /* groups that don't use folders only move their topics around, so above test is sufficient */
       return 1;
   else   /* we're using folders */
     {
       /* top level messages or folders can always be moved down,
       ** provided they aren't already at the end of the list (this was tested up top)
       */
       if(target_msg->data.info.reply_to == -1)
          return 1;

          
       /* A folder can be swapped with a folder, or a message can be swapped with a message,
       ** but folders and messages can't be swapped
       */   
       next_is_folder = is_folder(&(target_msg->next->data));   /* shared_news_util.c */        
       target_is_folder = is_folder(&(target_msg->data));      /* shared_news_util.c */           

       if( (next_is_folder && target_is_folder) ||
           (!next_is_folder && !target_is_folder)  )
                return 1;
       else
                return 0; 

     }   
   
}
