syntax = "proto2";

import "google/protobuf/descriptor.proto";

package test;

option cc_generic_services = true;
option (file_option) = 9876543210;

extend google.protobuf.FileOptions {
  optional uint64 file_option = 9585869;
}

extend google.protobuf.FieldOptions {
  optional uint64 field_option = 858769;
}

extend google.protobuf.EnumOptions {
  optional int64 enum_option = 590284;
}

enum StatusType {
  option allow_alias = true;
  option (enum_option) = -789;

  PENDING = 0;
  ENABLED = 1;
  DISABLED = 2;
  DELETED = 3;
  ALIASED = 3;
}

message ResourceFindRequest {
  required string name = 1;
  optional bool active = 2;
  repeated string widgets = 3;
  repeated bytes widget_bytes = 4;
}

message ResourceSleepRequest {
  optional int32 sleep = 1;
}

message Resource {
  extensions 100 to max;

  required string name = 1 [(field_option) = 8765432109, ctype = CORD];
  optional int64 date_created = 2;
  optional StatusType status = 3;
  repeated StatusType repeated_enum = 4;
}

message ResourceWithRequiredField {
  required string foo_is_required = 1;
}

message Searchable {
  enum SearchType {
    FLAT = 1;
    NESTED = 2;
  }

  extend test.Resource {
    optional bool ext_is_searchable = 100;
    optional bool ext_is_hidden = 101;
    optional Searchable.SearchType ext_search_type = 102 [default=FLAT];
  }
}

message MessageParent {
  message MessageChild {
    optional string child1 = 1;
  }
}

message Nested {
  extensions 100 to 110;

  optional string name = 1;
  optional Resource resource = 2;
  repeated Resource multiple_resources = 3;
  optional StatusType status = 4;

  message NestedLevelOne {
    extensions 100 to 101;
    optional bool level_one = 1 [default=true];

    extend Resource {
      optional bool ext_nested_in_level_one = 105;
      optional bool ext_dup_field = 106;
    }
  }

  extend NestedLevelOne {
    optional bool ext_nested_level_one = 100;
  }

//  extend Resource {
//    optional bool ext_dup_field = 107;
//  }
}

extend Nested {
  optional string foo = 100;
  optional int64 bar = 101;
}

extend Nested.NestedLevelOne {
  optional bool ext_nested_level_one_outer = 101;
}

service ResourceService {
  rpc Find (ResourceFindRequest) returns (Resource);
  rpc FindWithRpcFailed (ResourceFindRequest) returns (Resource);
  rpc FindWithSleep (ResourceSleepRequest) returns (Resource);
  rpc FindNotImplemented (ResourceFindRequest) returns (Resource);
}