/*
  Сервис сихронизации объектов
*/
syntax = "proto3";

import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/wrappers.proto";
import "keyapis/access_control/v1/keyapis_access_control_access_control_v1.proto";


package keyapis.access_control.v1;

option java_package = "ru.keyapis.access_control.v1";
option java_outer_classname = "KeyapisAccessControlV1Proto";
option java_multiple_files = false;
option java_string_check_utf8 = true;
option go_package = "/keyapis_access_control_v1";
option cc_enable_arenas = true;
option csharp_namespace = "Keyapis.AccessControl.V1";
option objc_class_prefix = "KEYAPISACCESSCONTROLV1";
option php_namespace = "Keyapis\\AccessControl\\V1";
option ruby_package = "Keyapis::AccessControl::V1";
option optimize_for = LITE_RUNTIME;


// Сервис для сихронизации объектов
service SyncService {
  // Метод частичного обновления дома, только данными из DaData.
  // Метод доступен для: admin, service
  rpc PostSyncBuilding(PostSyncBuildingRequest) returns (PostSyncBuildingResponse) {
    option (google.api.http) = {
      post: "/access_control/api/v1/sync/building",
      body: "*"
    };
  }
  // Метод получения списка домов для обновления.
  // Метод доступен для: admin, service
  rpc GetSyncBuildings(GetSyncBuildingsRequest) returns (GetSyncBuildingsResponse) {
    option (google.api.http) = {
      get: "/access_control/api/v1/sync/buildings"
    };
  }
}

// Дом для синхронизации
message BuildingSync {
  // Идентификатор дома
  int32 id = 1 [(google.api.field_behavior) = REQUIRED];
  // ОРПОН
  int64 orpon = 2;
  // Город
  string city = 3;
  // Улица
  string street = 4;
  // Номер дома
  string number = 5;
  // ОРПОН города, в котором находится дом
  int64 city_orpon = 6;
  // ОРПОН региона
  int64 region_orpon = 7;
  // Наименование муниципального района.
  // # Диапазон: 0..64
  google.protobuf.StringValue area = 8;
  // ОРПОН муниципального района.
  // # Диапазон: 0..9999999999
  google.protobuf.Int64Value area_orpon = 9;
  // КЛАДР муниципального района.
  // # Диапазон: 0..32
  google.protobuf.StringValue area_kladr = 10;
  // Признак принадлежности населённого пункта к столичному статусу.
  // 1 — центр района.
  // 2 — центр региона.
  // 3 — центр района и региона.
  // 4 — центральный район региона.
  // 0 — ничего из перечисленного.
  // # Диапазон: 0..4
  google.protobuf.Int32Value capital_marker = 11;
  // КЛАДР-код города.
  // # Диапазон: 0..17
  google.protobuf.StringValue city_kladr = 12;
  // КЛАДР-код строения.
  // # Диапазон: 0..17
  google.protobuf.StringValue kladr = 13;
  // Уровень детализации, до которого адрес найден в ФИАС.
  // 0 — страна.
  // 1 — регион.
  // 3 — район.
  // 4 — город.
  // 5 — район города.
  // 6 — населенный пункт.
  // 7 — улица.
  // 8 — дом.
  // 9 — квартира.
  // 65 — планировочная структура.
  // 90 — доп. территория.
  // 91 — улица в доп. территории.
  // -1 — иностранный или пустой.
  // # Диапазон: -1..99
  google.protobuf.Int32Value fias_level = 14;
  // Уровень детализации, до которого адрес найден в ФИАС.
  // 0 — актуальный.
  // 1-50 — переименован.
  // 51 — переподчинен.
  // 99 — удален.
  // # Диапазон: 0..99
  google.protobuf.Int32Value fias_actuality_state = 15;
  // Координаты: широта
  google.protobuf.DoubleValue geo_lat = 16;
  // Координаты: долгота
  google.protobuf.DoubleValue geo_lon = 17;
  // Код ОКАТО
  google.protobuf.Int64Value okato = 18;
  // Код ОКТМО
  google.protobuf.Int64Value oktmo = 19;
  // Почтовый индекс
  google.protobuf.Int32Value postal_code = 20;
  // Наименование региона.
  // # Диапазон: 0..64
  google.protobuf.StringValue region = 21;
  // КЛАДР-код региона.
  // # Диапазон: 0..32
  google.protobuf.StringValue region_kladr = 22;
  // КЛАДР-код улицы.
  // # Диапазон: 0..32
  google.protobuf.StringValue street_kladr = 23;
  // ОРПОН улицы.
  // # Диапазон: 0..9999999999
  google.protobuf.Int64Value street_orpon = 24;
  // КЛАДР-код дома.
  // # Диапазон: 0..32
  google.protobuf.StringValue house_kladr = 25;
}

// Запрос частичного обновления дома
message PostSyncBuildingRequest {
    // Тип параметра
  oneof type {
    // Передается в случае когда изменения данных не требуются, но необходимо зафиксировать дату синхронизации
    int32 building_id = 1 [(google.api.field_behavior) = REQUIRED];
    // Дом с обновленными данными из DaData
    BuildingSync data = 2 [(google.api.field_behavior) = REQUIRED];
  }
}

// Ответ на запрос частичного обновления дома
message PostSyncBuildingResponse {
  // Ошибка
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
  }
}

// Запрос получения списка домов для обновления
message GetSyncBuildingsRequest {
  // Количество.
  // По умолчанию 10.
  // # Диапазон: 10..5000
  int32 batch_size = 1 [(google.api.field_behavior) = REQUIRED];
  // Дата, старше которой должны вернуться записи для синхронизации
  google.protobuf.Timestamp last_sync_before_at = 2 [(google.api.field_behavior) = REQUIRED];
}
// Ответ на запрос получения списка домов для обновления
message GetSyncBuildingsResponse {
  // Список домов
  message BuildingList {
    // Список домов
    repeated BuildingSync buildings = 1;
  }
  // Ошибка
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип результата
  oneof type {
    // Дома
    BuildingList data = 1;
    // Ошибка
    Error error = 2;
  }
}