// Copyright (C) 2003-2026, Foxit Software Inc..
// All Rights Reserved.
//
// http://www.foxitsoftware.com
//
// The following code is copyrighted and contains proprietary information and trade secrets of Foxit Software Inc..
// You cannot distribute any part of Foxit PDF SDK to any third party or general public,
// unless there is a separate license agreement with Foxit Software Inc. which explicitly grants you such rights.
//
// This file contains an example to demonstrate how to use Foxit PDF SDK to export data, import data and reset form for
// XFA document.

#include "FSPDFObjC.h"

NSString *input_path = @"../input_files/";
NSString *output_path = @"../output_files/";

NSString *sn = @"bPxThFlBAYifO3yiW0C51bKbjPap1zHaf5aG5sX378TjFvB7Q0802A==";
NSString *key = @"8f3g1sGNtR8NAgfSNv+BvaJWy2fnrw36NZvzh8GUxYXvs+/YczAk4e34yqlOnmL4asgxGMO7+rlOcSHUSSKagx5g4G7VEXfkYLXnDDx77FOOedZPrFFcOCu1vT4+wOKzy1zkORq9cKtiFf44byH5sfRqf+OvELjep2teT9eF9yPCsSw2vRKljXlPy40DMP9XX1O5OTe+mSG3RvwKUMb0+RpG3YobM87j+/ynTDlJMMXw4vgwuTb1ZuAtlvkTdFz7HDLV81C6TYnn73ddHeGD3qYWBVsD4uJkDwyyH/SWr7QX0HSgVg8HSZqnab1VGdAUYxKY2vGWeOTJdu6qDGb5ZEb9O3kZZg+9LYAmUKzDfCYwfIsYZ8Y9LPC4wMx70kIq7JpNnzPvigrdshV8/ew1F0+qP/P5Z1EB53vDVrp2LVSuL873Wv4g3PzjZlNH+1qgT87hC+Buto4qsSUfP5Y2z0uApu+c/TfttCXbeMLSsw9TY1HQD3mkrZExMaQqRrAuXAcZWdvBnVuG3DCZmm8q0DLxJiCfYfViAU/AkbeKMIGaTJdrvIXBcssfde4nmU6qr0M4x4+Hs2ESddtY2QRtLAUBq/7h7GJlJHkEZr8ueaUy/6D/2vvAWz6wMLgmjlPbDTLqzfnCJylHCPtcJmu1SPPT9v1VreBX3+zNWcIT8HueyHEiUniqzwWkRKaotrnNb/zhnHLPpgaBSwKjyi8rOzzVwu/nY84G9ye4jsVjmkIRItKDrW7z22iS+QQuTwfqLVuMB0OD4jMkPCC2slzPfEeZnuh4+Rewln2qLRJVgI72zJ20OBWAelGSpO1Ii2Y3gOvojdmtUwx6R3Z1qFNWTTB25o9ytcux8BLOtTCkA8T8xaT4N339OTCsu/TmfahIDixKvr8cDa6F2WkBT8SOfv64W9PgiNv5B/BMOD2VWYaAl0N7yD0NkYYg/cDWRC4dfpdeip1jrr0k3mND0oSpIkxC+FicZbaYYwRdtJ9OSVWJ5OE0voLv8HgLze8mw6s4TrN3z+a2NQCveMa2VRN7YcEF7agPrvb/qU+otMwHae/wM7+f+HFAaOW+WTfzfxIVFB8/A1DN0NiEX+em4G7nO5F5ZcvfYPpaaioe8Nn33BbVLtMjXqsOBeM8AXiVfpD6YO75j7BqnBUPnivvD8BxJaaIQZvVSuQmvGm0ynt03IYwE8Rq+jYsunvsZ86jh5BiUR+Nm7sK0Qe9BdZn/7jdqohMv9czfMGUAscX+xBMunFbDpcRbWVpUADcm209L8Ndek2XY7YlCMxPgPVNvfWRF2jxehib9Tpd7zB5ZIDfAEH9zrpLfp29DLvCh2Yx8mH7xxdKG1O9Q0GdHphYHhej6smAcPm68R0GUQaTOLfXqNpueGJC1GAOI3Y4swjyt7jMTWcibnKLzwukWE5rnEDhn5n64JnyUM0ZFkRmtOiV";

@interface CFS_XFAAppHandler : NSObject<FSAppProviderCallback>

@end

@implementation CFS_XFAAppHandler {
}

-(NSString*)getAppInfo:(FSActionCallbackAppInfoType)app_info {
	return @"Foxit SDK";
}

-(void)beep:(FSAppProviderCallbackBeepType)type {
}

-(FSAppProviderCallbackMsgBoxButtonID)msgBox:(NSString*)message title:(NSString*)title icon_type: (FSAppProviderCallbackMsgBoxIconType) icon_type button_type: (FSAppProviderCallbackMsgBoxButtonType)button_type {
	return (FSAppProviderCallbackMsgBoxButtonID)0;
}

-(NSString*)response:(NSString*)question title:(NSString*)title default_answer:(NSString*)default_answer is_mask:(BOOL)is_mask {
	return @"answer";
}

-(id<FSFileReaderCallback>)downLoadUrl:(NSString*)url {
	return nil;
}

-(NSString*)postRequestURL:(NSString*)url data:(NSString*)data content_type:(NSString*)content_type encode:(NSString*)encode header:(NSString*)header {
	return @"PostRequestUrl";
}

-(BOOL)putRequestURL:(NSString*)url data:(NSString*)data encode:(NSString*)encode {
	return YES;
}

-(NSString*)loadString:(FSAppProviderCallbackStringID)string_id {
	return @"LoadString";
}

-(NSArray<NSString*>*)showFileDialog:(NSString*)string_title string_filter:(NSString*)string_filter is_openfile_dialog:(BOOL)is_openfile_dialog {
	return [NSArray<NSString*> alloc];
}

@end

@interface CFS_XFADocHandler : NSObject<FSDocProviderCallback>

@end

@implementation CFS_XFADocHandler {
}

-(void)invalidateRect:(int)page_index rect:(FSRectF*)rect flag:(FSDocProviderCallbackInvalidateFlag)flag {
}

-(void)displayCaret:(int)page_index is_visible:(BOOL)is_visible rect:(FSRectF*)rect {
}

-(BOOL)getPopupPos:(int)page_index min_popup:(float)min_popup max_popup:(float)max_popup rect_widget:(FSRectF*)rect_widget inout_rect_popup:(FSRectF*)inout_rect_popup {
	return YES;
}

-(BOOL)popupMenu:(int)page_index rect_popup:(FSPointF*)rect_popup {
	return YES;
}

-(int)getCurrentPage:(FSPDFDoc*) doc {
	return 0;
}

-(void)setCurrentPage:(FSPDFDoc*) doc current_page_index:(int)current_page_index {
}

-(void)setChangeMark:(FSXFADoc*) doc {
}

-(NSString*)getTitle:(FSPDFDoc*) doc {
	return @"title";
}

-(void)setFocus:(FSXFAWidget*)xfa_widget is_relayout:(BOOL)is_relayout {
}

-(void)exportData:(FSPDFDoc*)doc file_path:(NSString*) file_path {
}

-(void)importData:(FSPDFDoc*)doc file_path:(NSString*) file_path {
}

-(void)gotoURL:(FSPDFDoc*)doc url:(NSString*) url {
}

-(void)print:(FSPDFDoc*)doc start_page_index:(int)start_page_index end_page_index:(int)end_page_index options:(int)options {
}

-(int)getHighlightColor:(FSPDFDoc*)doc {
	return 0x500000FF;
}

-(BOOL)submitData:(FSPDFDoc*)doc target:(NSString*)target format:(FSDocProviderCallbackSubmitFormat)format text_encoding:(FSDocProviderCallbackTextEncoding)text_encoding content:(NSString*)content {
	return YES;
}

-(void)pageViewEvent:(int)page_index page_view_event_type:(FSDocProviderCallbackPageViewEventType)page_view_event_type {
}

-(void)widgetEvent:(FSXFAWidget *) xfa_widget widget_event_type:(FSDocProviderCallbackWidgetEventType)widget_event_type {
}

-(void)notifyWidgetChangeInfo:(FSXFADoc*) doc change_info:(FSXFAWidgetModifyInfo*)change_info {
}
@end

int main(int argc, const char *argv[]) {
    @autoreleasepool {
        NSString *output_directory = [output_path stringByAppendingString:@"xfa_form/"];
        NSString *input_file = [input_path stringByAppendingString:@"xfa_dynamic.pdf"];
        NSFileManager *fileManager = [NSFileManager defaultManager];
        BOOL isDir = NO;
        if ([fileManager fileExistsAtPath:output_directory isDirectory:&isDir]) {
            if (!isDir) {
                NSError *error = nil;
                if (![fileManager removeItemAtPath:output_directory error:&error] || error) {
                    return -1;
                }
                if (![fileManager createDirectoryAtPath:output_directory withIntermediateDirectories:YES attributes:nil error:&error] || error) {
                    return -1;
                }
            }
        } else {
            NSError *error = nil;
            if (![fileManager createDirectoryAtPath:output_directory withIntermediateDirectories:YES attributes:nil error:&error] || error) {
                return -1;
            }
        }

        // Initialize library
        FSErrorCode errorCode = [FSLibrary initialize:sn key:key];
        if (errorCode != FSErrSuccess) {
            NSLog(@"Library Initialize Error: %ld", errorCode);
            return -1;
        }

        @try {
            CFS_XFAAppHandler* pXFAAppHandler = [CFS_XFAAppHandler alloc];
            [FSLibrary registerXFAAppProviderCallback:pXFAAppHandler];
            FSPDFDoc *doc = [[FSPDFDoc alloc] initWithPath:input_file];
            errorCode = [doc load:@""];
            if (errorCode != FSErrSuccess) {
                NSLog(@"The Doc [%@] Error: %ld\n", input_file, errorCode);
                return -1;
            }

            CFS_XFADocHandler* pXFADocHandler = [CFS_XFADocHandler alloc];
            FSXFADoc* xfa_doc = [[FSXFADoc alloc] initWithDocument:doc xfa_doc_provider_handler:pXFADocHandler];
            [xfa_doc startLoad:nil];

            [xfa_doc exportData:[output_directory stringByAppendingString:@"xfa_form.xml"] export_type:FSXFADocExportDataTypeXML];
            [xfa_doc resetForm];
            [doc saveAs:[output_directory stringByAppendingString:@"xfa_dynamic_resetform.pdf"] save_flags:FSPDFDocSaveFlagNormal];

            [xfa_doc importData:[output_directory stringByAppendingString:@"xfa_form.xml"]];
            [doc saveAs:[output_directory stringByAppendingString:@"xfa_dynamic_importdata.pdf"] save_flags:FSPDFDocSaveFlagNormal];
            NSLog(@"Xfa test.");
        }
        @catch (NSException *e) {
            NSLog(@"Unknown Exception, %@", e);
        }        
    }
    [FSLibrary destroy];
    return 0;
}
