class Krane::Job

def deploy_failed?

def deploy_failed?
  return false unless deploy_started?
  return true if failed_status_condition
  return false unless @instance_data.dig("spec", "backoffLimit").present?
  (@instance_data.dig("status", "failed") || 0) >= @instance_data.dig("spec", "backoffLimit")
end

def deploy_succeeded?

def deploy_succeeded?
  # Don't block deploys for long running jobs,
  # Instead report success when there is at least 1 active
  return false unless deploy_started?
  done? || running?
end

def done?

def done?
  (@instance_data.dig("status", "succeeded") || 0) == @instance_data.dig("spec", "completions")
end

def failed_status_condition

def failed_status_condition
  @instance_data.dig("status", "conditions")&.detect do |condition|
    condition["type"] == 'Failed' && condition['status'] == "True"
  end
end

def failure_message

def failure_message
  if (condition = failed_status_condition.presence)
    "#{condition['reason']} (#{condition['message']})"
  end
end

def running?

def running?
  now = Time.now.utc
  start_time = @instance_data.dig("status", "startTime")
  # Wait 5 seconds to ensure job doesn't immediately fail.
  return false if !start_time.present? || now - Time.parse(start_time) < 5.second
  (@instance_data.dig("status", "active") || 0) >= 1
end

def status

def status
  if !exists?
    super
  elsif done?
    "Succeeded"
  elsif running?
    "Started"
  elsif deploy_failed?
    "Failed"
  else
    "Unknown"
  end
end