interface GetParameterOptions {
    /** The name of the script parameter. */
    name: string;
}

interface SetOptions {
    /** Key used to store the runtime.Session. */
    name: string;
    /** Value to associate with the key in the user session. */
    value: string;
}

/** Encapsulates the runtime settings of the currently executing script. */
interface Script {
    /** Returns the value of a script parameter for the currently executing script. */
    getParameter(options: GetParameterOptions): boolean | number | Date | string | string[];
    /** Returns a number value for the usage units remaining for the currently executing script. */
    getRemainingUsage(): number;
    /** The deployment ID for the script deployment on the currently executing script. */
    deploymentId: string;
    /** The script ID for the currently executing script. */
    id: string;
    /** The script logging level for the current script execution. This method is not supported on client scripts. */
    logLevel: string;
    /** The percent complete specified for the current scheduled script execution. The return value will appear in the % Complete column in the Scheduled Script Status page. */
    percentComplete: number;
    /** An Array of bundle IDs for the bundles that include the currently executing script. */
    bundleIds: string[];
}

/** Encapsulates the user session for the currently executing script. */
interface Session {
    /** Returns the user-defined session object value associated with the session object key. */
    get(options: GetParameterOptions): string;
    /** Sets a key and value for a user-defined runtime.Session. */
    set(options: SetOptions): void;
}

/** Encapsulates the properties and preferences for the user of the currently executing script. */
interface User {
    /** Returns a user permission level for the specified permission as a runtime.Permission enumeration. */
    getPermission(options: GetParameterOptions): Permission;
    /** Returns the value of a NetSuite preference. */
    getPreference(options: GetParameterOptions): string;
    /** The internal ID of the currently logged-in contact. If no logged-in entity or other entity than contact is logged in, then 0 is returned as value. */
    readonly contact: number;
    /** The internal ID of the department for the currently logged-in user. */
    department: number;
    /** The email address of the currently logged-in user. */
    email: string;
    /** The internal ID of the currently logged-in user. */
    id: number;
    /** The internal ID of the location of the currently logged-in user. */
    location: number;
    /** The name of the currently logged-in user. */
    name: string;
    /** The internal ID of the role for the currently logged-in user. */
    role: number;
    /** The script ID of the center type, or role center, for the currently logged-in user.
      *  NOTE: The actual behavior of this strays from the documentation. This in practice returns the script id
      *  of the role center as opposed to its internal id. That is why the return type is string | number instead of
      *  what the documentation claims (just number).
      */
    roleCenter: string | number;
    /** The custom scriptId of the role for the currently logged-in user. */
    roleId: string;
    /** The internal ID of the subsidiary for the currently logged-in user. */
    subsidiary: number;
}

interface FeatureOptions {
    /** The internal ID of the feature to check. */
    feature: string;
}

/** The NetSuite account ID for the currently logged-in user. */
export const accountId: string;
/** The country for the current company. Returns the two-letter abbreviation.  For example, US */
export const country: string;
/** The current environment in which the script is executing. This property returns one of the values from the runtime.EnvType enumeration. */
export const envType: EnvType;
/** Returns a runtime.ContextType enumeration that represents what triggered the current script. */
export const executionContext: ContextType;
/** The number of processors available to the currently logged in account.
 SuiteCloud Processors is the current system used to execute (process) scheduled scripts and map/reduce scripts. This property is helpful if you are a SuiteApp developer and your script needs to know the total number of processors available to a deployment.
 For scheduled script deployments that continue to use queues, use runtime.queueCount. With the introduction of SuiteCloud Processors, map/reduce script deployments and new scheduled script deployments no longer use queues, but pre-existing scheduled script deployments continue to use queues until the queues are removed (see SuiteCloud Processors – Supported Task Types).
 Be aware that the number of processors available may not be the same as the number of queues available. For more information, see SuiteCloud Plus Settings.
 */
export const processorCount: number;
/** Returns the number of scheduled script queues in a given account. */
export const queueCount: number;
/** Returns the version of NetSuite that the method is called in. For example, the  runtime.version property in an account running NetSuite 2015.2 is 2015.2. */
export const version: string;
/** Returns a runtime.Script that represents the currently executing script. */
export function getCurrentScript(): Script;
/** Returns a runtime.Session that represents the user session for the currently executing script. */
export function getCurrentSession(): Session;
/** Returns a runtime.User that represents the properties and preferences for the user of the currently executing script. */
export function getCurrentUser(): User;
/** Use this method to determine if a particular feature is enabled in a NetSuite account. These are the features that appear on the Enable Features page at Setup > Company > Setup Tasks > Enable Features. */
export function isFeatureInEffect(options: FeatureOptions): boolean;

/** Enumeration that holds the context information about what triggered the current script. Returned by the runtime.executionContext property of the N/runtime Module. */
export enum ContextType {
    ACTION = "ACTION",
    ADVANCEDREVREC = "ADVANCEDREVREC",
    BANKCONNECTIVITY = "BANKCONNECTIVITY",
    BANKSTATEMENTPARSER = "BANKSTATEMENTPARSER",
    BUNDLE_INSTALLATION = "BUNDLEINSTALLATION",
    CLIENT = "CLIENT",
    CONSOLRATEADJUSTOR = "CONSOLRATEADJUSTOR",
    CSV_IMPORT = "CSVIMPORT",
    CUSTOMGLLINES = "CUSTOMGLLINES",
    CUSTOM_MASSUPDATE = "CUSTOMMASSUPDATE",
    DATASETBUILDER = "DATASETBUILDER",
    DEBUGGER = "DEBUGGER",
    EMAIL_CAPTURE = "EMAILCAPTURE",
    FICONNECTIVITY = "FICONNECTIVITY",
    FIPARSER = "FIPARSER",
    MAP_REDUCE = "MAPREDUCE",
    NONE = "NONE",
    PAYMENTGATEWAY = "PAYMENTGATEWAY",
    PAYMENTPOSTBACK = "PAYMENTPOSTBACK",
    PLATFORMEXTENSION = "PLATFORMEXTENSION",
    PORTLET = "PORTLET",
    PROMOTIONS = "PROMOTIONS",
    RESTLET = "RESTLET",
    REST_WEBSERVICES = "RESTWEBSERVICES",
    SCHEDULED = "SCHEDULED",
    SDF_INSTALLATION = "SDFINSTALLATION",
    SHIPPING_PARTNERS = "SHIPPINGPARTNERS",
    SUITELET = "SUITELET",
    TAX_CALCULATION = "TAXCALCULATION",
    USEREVENT = "USEREVENT",
    USER_INTERFACE = "USERINTERFACE",
    WEBAPPLICATION = "WEBAPPLICATION",
    WEBSERVICES = "WEBSERVICES",
    WEBSTORE = "WEBSTORE",
    WORKBOOKBUILDER = "WORKBOOKBUILDER",
    WORKFLOW = "WORKFLOW"
}

/** Enumeration that holds all possible environment types that the current script can execute in. */
export enum EnvType {
    SANDBOX,
    PRODUCTION,
    BETA,
    INTERNAL,
}
/** Enumeration that holds the user permission level for a specific permission ID. Returned by the User.getPermission(options) method. */
export enum Permission {
    FULL = 4,
    EDIT = 3,
    CREATE = 2,
    VIEW = 1,
    NONE = 0,
}
