// Copyright 2019 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/cloud/talent/v4beta1/common.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 = "CompanyResourceProto";
option java_package = "com.google.cloud.talent.v4beta1";
option objc_class_prefix = "CTS";

// A Company resource represents a company in the service. A company is the
// entity that owns job postings, that is, the hiring entity responsible for
// employing applicants for the job position.
message Company {
  // Derived details about the company.
  message DerivedInfo {
    // A structured headquarters location of the company, resolved from
    // [Company.hq_location][] if provided.
    Location headquarters_location = 1;
  }

  // Required during company update.
  //
  // The resource name for a company. This is generated by the service when a
  // company is created.
  //
  // The format is
  // "projects/{project_id}/tenants/{tenant_id}/companies/{company_id}", for
  // example, "projects/api-test-project/tenants/foo/companies/bar".
  //
  // Tenant id is optional and the default tenant is used if unspecified, for
  // example, "projects/api-test-project/companies/bar".
  string name = 1;

  // Required.
  //
  // The display name of the company, for example, "Google, LLC".
  string display_name = 2;

  // Required.
  //
  // Client side company identifier, used to uniquely identify the
  // company.
  //
  // The maximum number of allowed characters is 255.
  string external_id = 3;

  // Optional.
  //
  // The employer's company size.
  CompanySize size = 4;

  // Optional.
  //
  // The street address of the company's main headquarters, which may be
  // different from the job location. The service attempts
  // to geolocate the provided address, and populates a more specific
  // location wherever possible in [DerivedInfo.headquarters_location][google.cloud.talent.v4beta1.Company.DerivedInfo.headquarters_location].
  string headquarters_address = 5;

  // Optional.
  //
  // Set to true if it is the hiring agency that post jobs for other
  // employers.
  //
  // Defaults to false if not provided.
  bool hiring_agency = 6;

  // Optional.
  //
  // Equal Employment Opportunity legal disclaimer text to be
  // associated with all jobs, and typically to be displayed in all
  // roles.
  //
  // The maximum number of allowed characters is 500.
  string eeo_text = 7;

  // Optional.
  //
  // The URI representing the company's primary web site or home page,
  // for example, "https://www.google.com".
  //
  // The maximum number of allowed characters is 255.
  string website_uri = 8;

  // Optional.
  //
  // The URI to employer's career site or careers page on the employer's web
  // site, for example, "https://careers.google.com".
  string career_site_uri = 9;

  // Optional.
  //
  // A URI that hosts the employer's company logo.
  string image_uri = 10;

  // Optional.
  //
  // A list of keys of filterable [Job.custom_attributes][google.cloud.talent.v4beta1.Job.custom_attributes], whose
  // corresponding `string_values` are used in keyword searches. Jobs with
  // `string_values` under these specified field keys are returned if any
  // of the values match the search keyword. Custom field values with
  // parenthesis, brackets and special symbols are not searchable as-is,
  // and those keyword queries must be surrounded by quotes.
  repeated string keyword_searchable_job_custom_attributes = 11;

  // Output only. Derived details about the company.
  DerivedInfo derived_info = 12;

  // Output only. Indicates whether a company is flagged to be suspended from
  // public availability by the service when job content appears suspicious,
  // abusive, or spammy.
  bool suspended = 13;
}
