// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.cloud.talent.v4beta1;

import "google/api/field_behavior.proto";
import "google/protobuf/timestamp.proto";
import "google/api/annotations.proto";

option go_package = "google.golang.org/genproto/googleapis/cloud/talent/v4beta1;talent";
option java_multiple_files = true;
option java_outer_classname = "EventProto";
option java_package = "com.google.cloud.talent.v4beta1";
option objc_class_prefix = "CTS";

// An event issued when an end user interacts with the application that
// implements Cloud Talent Solution. Providing this information improves the
// quality of results for the API clients, enabling the
// service to perform optimally. The number of events sent must be consistent
// with other calls, such as job searches, issued to the service by the client.
message ClientEvent {
  // Strongly recommended for the best service experience.
  //
  // A unique ID generated in the API responses. It can be found in
  // [ResponseMetadata.request_id][google.cloud.talent.v4beta1.ResponseMetadata.request_id].
  string request_id = 1;

  // Required. A unique identifier, generated by the client application.
  string event_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The timestamp of the event.
  google.protobuf.Timestamp create_time = 4 [(google.api.field_behavior) = REQUIRED];

  // Required.
  //
  // The detail information of a specific event type.
  oneof event {
    // An event issued when a job seeker interacts with the application that
    // implements Cloud Talent Solution.
    JobEvent job_event = 5;

    // An event issued when a profile searcher interacts with the application
    // that implements Cloud Talent Solution.
    ProfileEvent profile_event = 6;
  }

  // Notes about the event provided by recruiters or other users, for example,
  // feedback on why a profile was bookmarked.
  string event_notes = 9;
}

// An event issued when a job seeker interacts with the application that
// implements Cloud Talent Solution.
message JobEvent {
  // An enumeration of an event attributed to the behavior of the end user,
  // such as a job seeker.
  enum JobEventType {
    // The event is unspecified by other provided values.
    JOB_EVENT_TYPE_UNSPECIFIED = 0;

    // The job seeker or other entity interacting with the service has
    // had a job rendered in their view, such as in a list of search results in
    // a compressed or clipped format. This event is typically associated with
    // the viewing of a jobs list on a single page by a job seeker.
    IMPRESSION = 1;

    // The job seeker, or other entity interacting with the service, has
    // viewed the details of a job, including the full description. This
    // event doesn't apply to the viewing a snippet of a job appearing as a
    // part of the job search results. Viewing a snippet is associated with an
    // [impression][google.cloud.talent.v4beta1.JobEvent.JobEventType.IMPRESSION]).
    VIEW = 2;

    // The job seeker or other entity interacting with the service
    // performed an action to view a job and was redirected to a different
    // website for job.
    VIEW_REDIRECT = 3;

    // The job seeker or other entity interacting with the service
    // began the process or demonstrated the intention of applying for a job.
    APPLICATION_START = 4;

    // The job seeker or other entity interacting with the service
    // submitted an application for a job.
    APPLICATION_FINISH = 5;

    // The job seeker or other entity interacting with the service
    // submitted an application for a job with a single click without
    // entering information. If a job seeker performs this action, send only
    // this event to the service. Do not also send
    // [JobEventType.APPLICATION_START][google.cloud.talent.v4beta1.JobEvent.JobEventType.APPLICATION_START] or [JobEventType.APPLICATION_FINISH][google.cloud.talent.v4beta1.JobEvent.JobEventType.APPLICATION_FINISH]
    // events.
    APPLICATION_QUICK_SUBMISSION = 6;

    // The job seeker or other entity interacting with the service
    // performed an action to apply to a job and was redirected to a different
    // website to complete the application.
    APPLICATION_REDIRECT = 7;

    // The job seeker or other entity interacting with the service began the
    // process or demonstrated the intention of applying for a job from the
    // search results page without viewing the details of the job posting.
    // If sending this event, JobEventType.VIEW event shouldn't be sent.
    APPLICATION_START_FROM_SEARCH = 8;

    // The job seeker, or other entity interacting with the service, performs an
    // action with a single click from the search results page to apply to a job
    // (without viewing the details of the job posting), and is redirected
    // to a different website to complete the application. If a candidate
    // performs this action, send only this event to the service. Do not also
    // send [JobEventType.APPLICATION_START][google.cloud.talent.v4beta1.JobEvent.JobEventType.APPLICATION_START],
    // [JobEventType.APPLICATION_FINISH][google.cloud.talent.v4beta1.JobEvent.JobEventType.APPLICATION_FINISH] or [JobEventType.VIEW][google.cloud.talent.v4beta1.JobEvent.JobEventType.VIEW] events.
    APPLICATION_REDIRECT_FROM_SEARCH = 9;

    // This event should be used when a company submits an application
    // on behalf of a job seeker. This event is intended for use by staffing
    // agencies attempting to place candidates.
    APPLICATION_COMPANY_SUBMIT = 10;

    // The job seeker or other entity interacting with the service demonstrated
    // an interest in a job by bookmarking or saving it.
    BOOKMARK = 11;

    // The job seeker or other entity interacting with the service was
    // sent a notification, such as an email alert or device notification,
    // containing one or more jobs listings generated by the service.
    NOTIFICATION = 12;

    // The job seeker or other entity interacting with the service was
    // employed by the hiring entity (employer). Send this event
    // only if the job seeker was hired through an application that was
    // initiated by a search conducted through the Cloud Talent Solution
    // service.
    HIRED = 13;

    // A recruiter or staffing agency submitted an application on behalf of the
    // candidate after interacting with the service to identify a suitable job
    // posting.
    SENT_CV = 14;

    // The entity interacting with the service (for example, the job seeker),
    // was granted an initial interview by the hiring entity (employer). This
    // event should only be sent if the job seeker was granted an interview as
    // part of an application that was initiated by a search conducted through /
    // recommendation provided by the Cloud Talent Solution service.
    INTERVIEW_GRANTED = 15;
  }

  // Required. The type of the event (see [JobEventType][google.cloud.talent.v4beta1.JobEvent.JobEventType]).
  JobEventType type = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The [job name(s)][google.cloud.talent.v4beta1.Job.name] associated with this event.
  // For example, if this is an [impression][google.cloud.talent.v4beta1.JobEvent.JobEventType.IMPRESSION] event,
  // this field contains the identifiers of all jobs shown to the job seeker.
  // If this was a [view][google.cloud.talent.v4beta1.JobEvent.JobEventType.VIEW] event, this field contains the
  // identifier of the viewed job.
  //
  // The format is
  // "projects/{project_id}/tenants/{tenant_id}/jobs/{job_id}", for
  // example, "projects/foo/tenants/bar/jobs/baz".
  repeated string jobs = 2 [(google.api.field_behavior) = REQUIRED];

  // The [profile name][google.cloud.talent.v4beta1.Profile.name] associated with this client event.
  //
  // The format is
  // "projects/{project_id}/tenants/{tenant_id}/profiles/{profile_id}",
  // for example, "projects/foo/tenants/bar/profiles/baz".
  string profile = 3;
}

// An event issued when a profile searcher interacts with the application
// that implements Cloud Talent Solution.
message ProfileEvent {
  // The enum represents types of client events for a candidate profile.
  enum ProfileEventType {
    // Default value.
    PROFILE_EVENT_TYPE_UNSPECIFIED = 0;

    // Send this event when a [ProfileEvent.profiles][google.cloud.talent.v4beta1.ProfileEvent.profiles] was sent as a part of
    // a result set for a CTS API call and was rendered in the end user's UI
    // (that is, the [ProfileEvent.recruiter][google.cloud.talent.v4beta1.ProfileEvent.recruiter]).
    IMPRESSION = 1;

    // The VIEW event records the action of a candidate's profile being
    // viewed by an end user. This is critical to tracking product metrics and
    // should be sent for every profile VIEW that happens in your system,
    // whether the event is associated with an API call (for example, a
    // recruiter making a request for a result set and clicking on a profile)
    // or not (a recruiter using the system to view profile details without
    // making a request).
    //
    // For a VIEW events associated with API calls, the
    // [ClientEvent.request_id][google.cloud.talent.v4beta1.ClientEvent.request_id] should be populated.  If the VIEW is not
    // associated with an API call, [request_id][google.cloud.talent.v4beta1.ClientEvent.request_id] should
    // not be populated.
    //
    // This event requires a valid recruiter and one valid ID in profiles.
    VIEW = 2;

    // The profile is bookmarked.
    BOOKMARK = 3;
  }

  // Required. Type of event.
  ProfileEventType type = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The [profile name(s)][google.cloud.talent.v4beta1.Profile.name] associated with this client event.
  //
  // The format is
  // "projects/{project_id}/tenants/{tenant_id}/profiles/{profile_id}",
  // for example, "projects/foo/tenants/bar/profiles/baz".
  repeated string profiles = 2 [(google.api.field_behavior) = REQUIRED];

  // The [job name(s)][google.cloud.talent.v4beta1.Job.name] associated with this client event. Leave it
  // empty if the event isn't associated with a job.
  //
  // The format is
  // "projects/{project_id}/tenants/{tenant_id}/jobs/{job_id}", for
  // example, "projects/foo/tenants/bar/jobs/baz".
  repeated string jobs = 6;
}
