//Please note, in order to use MSHookIvar, this file needs to be .xm
#import <Cephei/HBPreferences.h>
#import <Foundation/Foundation.h>

@interface SBCoverSheetPrimarySlidingViewController : UIViewController
- (void)viewDidDisappear:(BOOL)arg1;
- (void)viewDidAppear:(BOOL)arg1;
@end

@interface SBIconListGridLayoutConfiguration
@property (nonatomic, assign) NSString *location;

- (NSString *)findLocation;
- (NSUInteger)numberOfPortraitColumns;
- (NSUInteger)numberOfPortraitRows;
@end

//Set up variables for use with Cephei
static BOOL tweakEnabled;
static BOOL transparent;
static BOOL hidden;
static double setHeight;
static double customOpacity;
static NSInteger setIconNumber;
//nepeta like drm
BOOL dpkgInvalid = NO;

HBPreferences *preferences;

%group allVersions
%hook SBCoverSheetPrimarySlidingViewController
- (void)viewDidDisappear:(BOOL)arg1 {

    %orig; //  Thanks to Nepeta for the DRM
    if (!dpkgInvalid) return;
		UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Pirate Detected!"
		message:@"Seriously? Pirating a free Tweak is awful!\nPiracy repo's Tweaks could contain Malware if you didn't know that, so go ahead and get Dockify from the official Source https://Burrit0z.github.io/repo/.\nIf you're seeing this but you got it from the official source then make sure to add https://Burrit0z.github.io/repo to Cydia or Sileo."
		preferredStyle:UIAlertControllerStyleAlert];

		UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Aww man" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * action) {

			UIApplication *application = [UIApplication sharedApplication];
			[application openURL:[NSURL URLWithString:@"https://Burrit0z.github.io/repo"] options:@{} completionHandler:nil];

	}];
    [alertController addAction:cancelAction];
		[self presentViewController:alertController animated:YES completion:nil];

}
%end
%end

%group version12
//hook the dock
%hook SBDockView
//ios 12
-(double)dockHeight {
  if (hidden) {
    return (0);
  } else {
    return (%orig*setHeight); //sets custom height if dock is not set to hidden
  }
}
//this deals with everything adjusting opacity/transparency
//ios 12 and 13
-(void)setBackgroundAlpha:(double)arg1 {
    if (transparent == NO && hidden == NO) { //if not transparent and not hidden
      %orig(customOpacity);
    }else if (transparent || hidden) { // Note: || means or in objc
      %orig(0.0); //hides background of the dock (transparent)
    } else {
      NSLog(@"Dock not Transparent/hidden, no custom opacity\n");
    }
}
%end

//NEW HOOK FOR ICON STATE
%hook SBDockIconListView
//ios 12 required piece
+(NSInteger)maxIcons {
  if (hidden) {
    return (0);
  } else {
    return (setIconNumber);
  }
}
%end
%end

//NEW GROUP FOR ios13
%group version13
%hook SBDockView
//ios 13
-(double)dockHeight {
  if (hidden) {
    return (0);
  } else {
    return (%orig*setHeight); //sets custom height if dock is not set to hidden
  }
}
//this deals with everything adjusting opacity/transparency
//ios 12 and 13
-(void)setBackgroundAlpha:(double)arg1 {
    if (transparent == NO && hidden == NO) { //if not transparent and not hidden
      %orig(customOpacity);
    }else if (transparent || hidden) { // Note: || means or in objc
      %orig(0.0); //hides background of the dock (transparent)
    } else {
      NSLog(@"Dock not Transparent/hidden, no custom opacity\n");
    }
}
%end
%hook SBDockIconListView

- (NSUInteger)iconColumnsForCurrentOrientation {
  if (hidden) {
    return (0);
  } else {
    return (setIconNumber);
  }
}
%end
//fix for icons being off the page ios 13
%hook SBIconListGridLayoutConfiguration

%property (nonatomic, assign) NSString *location;

%new //Modeled off of Kritanta's solution with ivars
- (NSString *)findLocation {
    if (self.location) return self.location;
    else {
        NSUInteger rows = MSHookIvar<NSUInteger>(self, "_numberOfPortraitRows");
        NSUInteger columns = MSHookIvar<NSUInteger>(self, "_numberOfPortraitColumns");
        // dock
        if (rows <= 2 && columns == 4) {
            self.location =  @"Dock";
        } else if (rows == 3 && columns == 3) {
            self.location =  @"Folder";
        } else {
            self.location =  @"Root";
        }
    }
    return self.location;
}

- (NSUInteger)numberOfPortraitColumns {
  [self findLocation];
    if ([self.location isEqualToString:@"Dock"]) {
      if (hidden) {
        return (0);
      } else {
        return (setIconNumber);
      }
    } else {
      return (%orig);
    }
}
%end
%end
// Thanks to Nepeta for the DRM, and thanks to Litten as well
%ctor {
  dpkgInvalid = ![[NSFileManager defaultManager] fileExistsAtPath:@"/var/lib/dpkg/info/com.burritoz.dockify.list"];
  if (!dpkgInvalid) dpkgInvalid = ![[NSFileManager defaultManager] fileExistsAtPath:@"/var/lib/dpkg/info/com.burritoz.dockify.md5sums"];


	preferences = [[HBPreferences alloc] initWithIdentifier:@"com.burritoz.dockifyprefs"];
  [preferences registerDefaults:@ { //defaults for prefernces
    @"tweakEnabled": @YES,
    @"setHeight": @1,
    @"customOpacity": @1,
    @"hidden": @NO,
    @"setIconNumber": @4,
	}];
  [preferences registerBool:&tweakEnabled default:YES forKey:@"tweakEnabled"];
	[preferences registerBool:&transparent default:YES forKey:@"transparent"]; //registering transparent as a Boolean
  [preferences registerBool:&hidden default:NO forKey:@"hidden"]; //registering hidden as a Boolean
	[preferences registerDouble:(double *)&setHeight default:1 forKey:@"setHeight"]; //registering setHeigt as a double (number)
  [preferences registerDouble:(double *)&customOpacity default:1 forKey:@"customOpacity"]; //registering customOpacity as a double (number)
  [preferences registerInteger:(NSInteger *)&setIconNumber default:4 forKey:@"setIconNumber"]; //Integer of how many icons to allow
if (tweakEnabled) {
  %init(allVersions);
  if (kCFCoreFoundationVersionNumber < 1600) //This means version < 12
    {
        %init(version12);
    }
    else
    {
        %init(version13);
    }
  }
}
