require_relative "sid"

module Win32
  class TaskScheduler
    module TaskSchedulerConstants
      SERVICE_ACCOUNT_USERS = SID::SERVICE_ACCOUNT_USERS

      BUILT_IN_GROUPS = SID::BUILT_IN_GROUPS

      SYSTEM_USERS = SERVICE_ACCOUNT_USERS + BUILT_IN_GROUPS

      # Triggers

      # Trigger is set to run the task a single time
      TASK_TIME_TRIGGER_ONCE = 1

      # Trigger is set to run the task on a daily interval
      TASK_TIME_TRIGGER_DAILY = 2

      # Trigger is set to run the task on specific days of a specific week & month
      TASK_TIME_TRIGGER_WEEKLY = 3

      # Trigger is set to run the task on specific day(s) of the month
      TASK_TIME_TRIGGER_MONTHLYDATE = 4

      # Trigger is set to run the task on specific day(s) of the month
      TASK_TIME_TRIGGER_MONTHLYDOW = 5

      # Trigger is set to run the task if the system remains idle for the amount
      # of time specified by the idle wait time of the task
      TASK_EVENT_TRIGGER_ON_IDLE = 6

      TASK_TRIGGER_REGISTRATION = 7

      # Trigger is set to run the task at system startup
      TASK_EVENT_TRIGGER_AT_SYSTEMSTART = 8

      # Trigger is set to run the task when a user logs on
      TASK_EVENT_TRIGGER_AT_LOGON = 9

      TASK_TRIGGER_SESSION_STATE_CHANGE = 11

      # Daily Tasks

      # The task will run on Sunday
      TASK_SUNDAY = 0x1

      # The task will run on Monday
      TASK_MONDAY = 0x2

      # The task will run on Tuesday
      TASK_TUESDAY = 0x4

      # The task will run on Wednesday
      TASK_WEDNESDAY = 0x8

      # The task will run on Thursday
      TASK_THURSDAY = 0x10

      # The task will run on Friday
      TASK_FRIDAY = 0x20

      # The task will run on Saturday
      TASK_SATURDAY = 0x40

      # Weekly tasks

      # The task will run between the 1st and 7th day of the month
      TASK_FIRST_WEEK = 0x01

      # The task will run between the 8th and 14th day of the month
      TASK_SECOND_WEEK = 0x02

      # The task will run between the 15th and 21st day of the month
      TASK_THIRD_WEEK = 0x04

      # The task will run between the 22nd and 28th day of the month
      TASK_FOURTH_WEEK = 0x08

      # The task will run the last seven days of the month
      TASK_LAST_WEEK = 0x10

      # Monthly tasks

      # The task will run in January
      TASK_JANUARY = 0x1

      # The task will run in February
      TASK_FEBRUARY = 0x2

      # The task will run in March
      TASK_MARCH = 0x4

      # The task will run in April
      TASK_APRIL = 0x8

      # The task will run in May
      TASK_MAY = 0x10

      # The task will run in June
      TASK_JUNE = 0x20

      # The task will run in July
      TASK_JULY = 0x40

      # The task will run in August
      TASK_AUGUST = 0x80

      # The task will run in September
      TASK_SEPTEMBER = 0x100

      # The task will run in October
      TASK_OCTOBER = 0x200

      # The task will run in November
      TASK_NOVEMBER = 0x400

      # The task will run in December
      TASK_DECEMBER = 0x800

      # Flags

      # Used when converting AT service jobs into work items
      TASK_FLAG_INTERACTIVE = 0x1

      # The work item will be deleted when there are no more scheduled run times
      TASK_FLAG_DELETE_WHEN_DONE = 0x2

      # The work item is disabled. Useful for temporarily disabling a task
      TASK_FLAG_DISABLED = 0x4

      # The work item begins only if the computer is not in use at the scheduled
      # start time
      TASK_FLAG_START_ONLY_IF_IDLE = 0x10

      # The work item terminates if the computer makes an idle to non-idle
      # transition while the work item is running
      TASK_FLAG_KILL_ON_IDLE_END = 0x20

      # The work item does not start if the computer is running on battery power
      TASK_FLAG_DONT_START_IF_ON_BATTERIES = 0x40

      # The work item ends, and the associated application quits, if the computer
      # switches to battery power
      TASK_FLAG_KILL_IF_GOING_ON_BATTERIES = 0x80

      # The work item starts only if the computer is in a docking station
      TASK_FLAG_RUN_ONLY_IF_DOCKED = 0x100

      # The work item created will be hidden
      TASK_FLAG_HIDDEN = 0x200

      # The work item runs only if there is a valid internet connection
      TASK_FLAG_RUN_IF_CONNECTED_TO_INTERNET = 0x400

      # The work item starts again if the computer makes a non-idle to idle
      # transition
      TASK_FLAG_RESTART_ON_IDLE_RESUME = 0x800

      # The work item causes the system to be resumed, or awakened, if the
      # system is running on batter power
      TASK_FLAG_SYSTEM_REQUIRED = 0x1000

      # The work item runs only if a specified account is logged on interactively
      TASK_FLAG_RUN_ONLY_IF_LOGGED_ON = 0x2000

      # Triggers

      # The task will stop at some point in time
      TASK_TRIGGER_FLAG_HAS_END_DATE = 0x1

      # The task can be stopped at the end of the repetition period
      TASK_TRIGGER_FLAG_KILL_AT_DURATION_END = 0x2

      # The task trigger is disabled
      TASK_TRIGGER_FLAG_DISABLED = 0x4

      # Run Level Types
      # Tasks will be run with the least privileges
      TASK_RUNLEVEL_LUA      = 0
      # Tasks will be run with the highest privileges
      TASK_RUNLEVEL_HIGHEST  = 1

      # Logon Types
      # Used for non-NT credentials
      TASK_LOGON_NONE                           = 0
      # Use a password for logging on the user
      TASK_LOGON_PASSWORD                       = 1
      # The service will log the user on using Service For User
      TASK_LOGON_S4U                            = 2
      # Task will be run only in an existing interactive session
      TASK_LOGON_INTERACTIVE_TOKEN              = 3
      # Group activation. The groupId field specifies the group
      TASK_LOGON_GROUP                          = 4
      # When Local System, Local Service, or Network Service account is
      # being used as a security context to run the task
      TASK_LOGON_SERVICE_ACCOUNT                = 5
      # Not in use; currently identical to TASK_LOGON_PASSWORD
      TASK_LOGON_INTERACTIVE_TOKEN_OR_PASSWORD  = 6

      TASK_MAX_RUN_TIMES = 1440
      TASKS_TO_RETRIEVE  = 5

      # Task creation

      TASK_VALIDATE_ONLY = 0x1
      TASK_CREATE = 0x2
      TASK_UPDATE = 0x4
      TASK_CREATE_OR_UPDATE = 0x6
      TASK_DISABLE = 0x8
      TASK_DONT_ADD_PRINCIPAL_ACE = 0x10
      TASK_IGNORE_REGISTRATION_TRIGGERS = 0x20

      # Priority classes

      REALTIME_PRIORITY_CLASS     = 0
      HIGH_PRIORITY_CLASS         = 1
      ABOVE_NORMAL_PRIORITY_CLASS = 2 # Or 3
      NORMAL_PRIORITY_CLASS       = 4 # Or 5, 6
      BELOW_NORMAL_PRIORITY_CLASS = 7 # Or 8
      IDLE_PRIORITY_CLASS         = 9 # Or 10

      CLSCTX_INPROC_SERVER = 0x1
      CLSID_CTask = [0x148BD520, 0xA2AB, 0x11CE, 0xB1, 0x1F, 0x00, 0xAA, 0x00, 0x53, 0x05, 0x03].pack("LSSC8")
      CLSID_CTaskScheduler = [0x148BD52A, 0xA2AB, 0x11CE, 0xB1, 0x1F, 0x00, 0xAA, 0x00, 0x53, 0x05, 0x03].pack("LSSC8")
      IID_ITaskScheduler = [0x148BD527, 0xA2AB, 0x11CE, 0xB1, 0x1F, 0x00, 0xAA, 0x00, 0x53, 0x05, 0x03].pack("LSSC8")
      IID_ITask = [0x148BD524, 0xA2AB, 0x11CE, 0xB1, 0x1F, 0x00, 0xAA, 0x00, 0x53, 0x05, 0x03].pack("LSSC8")
      IID_IPersistFile = [0x0000010b, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46].pack("LSSC8")

      # Days of month

      TASK_FIRST = 0x01
      TASK_SECOND = 0x02
      TASK_THIRD = 0x04
      TASK_FOURTH = 0x08
      TASK_FIFTH = 0x10
      TASK_SIXTH = 0x20
      TASK_SEVENTH = 0x40
      TASK_EIGHTH = 0x80
      TASK_NINETH = 0x100
      TASK_TENTH = 0x200
      TASK_ELEVENTH = 0x400
      TASK_TWELFTH = 0x800
      TASK_THIRTEENTH = 0x1000
      TASK_FOURTEENTH = 0x2000
      TASK_FIFTEENTH = 0x4000
      TASK_SIXTEENTH = 0x8000
      TASK_SEVENTEENTH = 0x10000
      TASK_EIGHTEENTH = 0x20000
      TASK_NINETEENTH = 0x40000
      TASK_TWENTIETH = 0x80000
      TASK_TWENTY_FIRST = 0x100000
      TASK_TWENTY_SECOND = 0x200000
      TASK_TWENTY_THIRD = 0x400000
      TASK_TWENTY_FOURTH = 0x800000
      TASK_TWENTY_FIFTH = 0x1000000
      TASK_TWENTY_SIXTH = 0x2000000
      TASK_TWENTY_SEVENTH = 0x4000000
      TASK_TWENTY_EIGHTH = 0x8000000
      TASK_TWENTY_NINTH = 0x10000000
      TASK_THIRTYETH = 0x20000000
      TASK_THIRTY_FIRST = 0x40000000
      TASK_LAST = 0x80000000
    end
  end
end