syntax = "proto3";
package osmosis.poolincentives.v1beta1;

import "gogoproto/gogo.proto";
import "google/api/annotations.proto";
import "google/protobuf/duration.proto";
import "osmosis/incentives/gauge.proto";
import "osmosis/pool-incentives/v1beta1/incentives.proto";

option go_package = "github.com/osmosis-labs/osmosis/v13/x/pool-incentives/types";

service Query {
  // GaugeIds takes the pool id and returns the matching gauge ids and durations
  rpc GaugeIds(QueryGaugeIdsRequest) returns (QueryGaugeIdsResponse) {
    option (google.api.http).get =
        "/osmosis/pool-incentives/v1beta1/gauge-ids/{pool_id}";
  }
  // DistrInfo returns the pool's matching gauge ids and weights.
  rpc DistrInfo(QueryDistrInfoRequest) returns (QueryDistrInfoResponse) {
    option (google.api.http).get =
        "/osmosis/pool-incentives/v1beta1/distr_info";
  }

  // Params returns pool incentives params.
  rpc Params(QueryParamsRequest) returns (QueryParamsResponse) {
    option (google.api.http).get = "/osmosis/pool-incentives/v1beta1/params";
  }

  // LockableDurations returns lock durations for pools.
  rpc LockableDurations(QueryLockableDurationsRequest)
      returns (QueryLockableDurationsResponse) {
    option (google.api.http).get =
        "/osmosis/pool-incentives/v1beta1/lockable_durations";
  }

  // IncentivizedPools returns currently incentivized pools
  rpc IncentivizedPools(QueryIncentivizedPoolsRequest)
      returns (QueryIncentivizedPoolsResponse) {
    option (google.api.http).get =
        "/osmosis/pool-incentives/v1beta1/incentivized_pools";
  }

  // ExternalIncentiveGauges returns external incentive gauges.
  rpc ExternalIncentiveGauges(QueryExternalIncentiveGaugesRequest)
      returns (QueryExternalIncentiveGaugesResponse) {
    option (google.api.http).get =
        "/osmosis/pool-incentives/v1beta1/external_incentive_gauges";
  }
}

message QueryGaugeIdsRequest {
  uint64 pool_id = 1 [ (gogoproto.moretags) = "yaml:\"pool_id\"" ];
}
message QueryGaugeIdsResponse {
  message GaugeIdWithDuration {
    uint64 gauge_id = 1 [ (gogoproto.moretags) = "yaml:\"gauge_id\"" ];
    google.protobuf.Duration duration = 2
        [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ];
    string gauge_incentive_percentage = 3;
  }

  repeated GaugeIdWithDuration gauge_ids_with_duration = 1
      [ (gogoproto.moretags) = "yaml:\"gauge_ids_with_duration\"" ];
}

message QueryDistrInfoRequest {}
message QueryDistrInfoResponse {
  DistrInfo distr_info = 1 [
    (gogoproto.nullable) = false,
    (gogoproto.moretags) = "yaml:\"distr_info\""
  ];
}

message QueryParamsRequest {}
message QueryParamsResponse {
  Params params = 1 [ (gogoproto.nullable) = false ];
}

message QueryLockableDurationsRequest {}
message QueryLockableDurationsResponse {
  repeated google.protobuf.Duration lockable_durations = 1 [
    (gogoproto.nullable) = false,
    (gogoproto.stdduration) = true,
    (gogoproto.moretags) = "yaml:\"lockable_durations\""
  ];
}

message QueryIncentivizedPoolsRequest {}
message IncentivizedPool {
  uint64 pool_id = 1 [ (gogoproto.moretags) = "yaml:\"pool_id\"" ];
  google.protobuf.Duration lockable_duration = 2 [
    (gogoproto.nullable) = false,
    (gogoproto.stdduration) = true,
    (gogoproto.moretags) = "yaml:\"lockable_duration\""
  ];
  uint64 gauge_id = 3 [ (gogoproto.moretags) = "yaml:\"gauge_id\"" ];
}
message QueryIncentivizedPoolsResponse {
  repeated IncentivizedPool incentivized_pools = 1 [
    (gogoproto.nullable) = false,
    (gogoproto.moretags) = "yaml:\"incentivized_pools\""
  ];
}

message QueryExternalIncentiveGaugesRequest {}
message QueryExternalIncentiveGaugesResponse {
  repeated osmosis.incentives.Gauge data = 1 [ (gogoproto.nullable) = false ];
}
