using Foundation;
using ObjCRuntime;
using UIKit;

namespace Shared.IOS.HDLLinphoneSDK
{
	[Static]
    //[Verify(ConstantsInterfaceAssociation)]
    partial interface Constants
	{
		// extern NSString *const _Nonnull HDLLPCallDelegateOpenDoorSuccess;
		[Field("HDLLPCallDelegateOpenDoorSuccess", "__Internal")]
		NSString HDLLPCallDelegateOpenDoorSuccess { get; }
	}

	// @protocol HDLLinphoneCallDelegate <NSObject>
	[Protocol, Model(AutoGeneratedName = true)]
	[BaseType(typeof(NSObject))]
	interface HDLLinphoneCallDelegate
	{
		// @required -(void)onAnswerAction;
		[Abstract]
		[Export("onAnswerAction")]
		void OnAnswerAction();

		// @required -(void)onRejectCallAction;
		[Abstract]
		[Export("onRejectCallAction")]
		void OnRejectCallAction();

		// @required -(void)onUnlockAction;
		[Abstract]
		[Export("onUnlockAction")]
		void OnUnlockAction();

		// @required -(void)onHangUpAction:(int)callDuration;
		[Abstract]
		[Export("onHangUpAction:")]
		void OnHangUpAction(int callDuration);

		// @required -(void)onScreenshotSuccessfulAction:(UIImage * _Nonnull)image;
		[Abstract]
		[Export("onScreenshotSuccessfulAction:")]
		void OnScreenshotSuccessfulAction(UIImage image);

		// @required -(void)onIncomingCall:(NSString * _Nonnull)userName;
		[Abstract]
		[Export("onIncomingCall:")]
		void OnIncomingCall(string userName);
	}

	// @interface HDLLinphoneCallDelegate : NSObject
	//[BaseType(typeof(NSObject))]
	//interface HDLLinphoneCallDelegate
	//{
	//}

	// @interface HDLLinPhoneSDK : NSObject
	[BaseType(typeof(NSObject))]
	interface HDLLinPhoneSDK
	{
		[Wrap("WeakHdlLinphoneCallDelegate")]
		HDLLinphoneCallDelegate HdlLinphoneCallDelegate { get; set; }

		// @property (nonatomic, weak) id<HDLLinphoneCallDelegate> hdlLinphoneCallDelegate;
		[NullAllowed, Export("hdlLinphoneCallDelegate", ArgumentSemantic.Weak)]
		NSObject WeakHdlLinphoneCallDelegate { get; set; }

		// @property (assign, nonatomic) BOOL IsAutoJumpCallView;
		[Export("IsAutoJumpCallView")]
		bool IsAutoJumpCallView { get; set; }

		// @property (assign, nonatomic) BOOL IsIncomingReceivedCallState;
		[Export("IsIncomingReceivedCallState")]
		bool IsIncomingReceivedCallState { get; set; }

		// +(instancetype)instance;
		[Static]
		[Export("instance")]
		HDLLinPhoneSDK Instance();

		// -(void)login:(NSString *)username password:(NSString *)pwd domain:(NSString *)domain;
		[Export("login:password:domain:")]
		void Login(string username, string pwd, string domain);

		// -(void)initalLinPhone;
		[Export("initalLinPhone")]
		void InitalLinPhone();

		// -(void)callWithUserName:(NSString *)username title:(NSString *)title;
		[Export("callWithUserName:title:")]
		void CallWithUserName(string username, string title);

		// -(void)gotoHDLLinphoneIntercomVC:(NSString *)titleName;
		[Export("gotoHDLLinphoneIntercomVC:")]
		void GotoHDLLinphoneIntercomVC(string titleName);

		// -(void)logoutAllLinphoneUser;
		[Export("logoutAllLinphoneUser")]
		void LogoutAllLinphoneUser();

		// -(void)clearAllConfigs;
		[Export("clearAllConfigs")]
		void ClearAllConfigs();
	}
}