(* TODO
   number
     - number is "float", but we probably want int everywhere instead
     - numeric values capped at 2^53 -1 inclusive because json
   time
     - better types
     - issues with "never" = uint64_max *)
open Types

module ErrorDetail = struct
  (* TODO GANA error codes
     https://git.gnunet.org/gana.git/tree/gnu-taler-error-codes/registry.rec *)
  type t = {
    code: int;
    hint: string option;
  }
end

module Timestamp = struct
  type t =
    | Seconds of float
    | Never

  let of_ptime p = Seconds (Ptime.to_float_s p)
end

module RelativeTime = struct
  type t =
    | Microseconds of float
    | Forever
end

module RsaDenominationKey = struct
  type t = {
    age_mask: int;
    rsa_pub: RsaPublicKey.t;
  }
end

(* not implemented *)
module CSDenominationKey = struct
  (* Clause Schnorr *)
  type t = {
    age_mask: int;
    cs_pub: string;
  }
end

module DenominationKey = struct
  type t =
    | Rsa of RsaDenominationKey.t
    | CS of CSDenominationKey.t
end

module FutureSignKey = struct
  type t = {
    key: EddsaPublicKey.t;
    stamp_start: Timestamp.t;
    stamp_expire: Timestamp.t;
    stamp_end: Timestamp.t;
    signkey_secmod_sig: EddsaSignature.t;
  }
end

module FutureDenom = struct
  type t = {
    section_name: string;
    value: Amount.t;
    stamp_start: Timestamp.t;
    stamp_expire_withdraw: Timestamp.t;
    stamp_expire_deposit: Timestamp.t;
    stamp_expire_legal: Timestamp.t;
    denom_pub: DenominationKey.t;
    fee_withdraw: Amount.t;
    fee_deposit: Amount.t;
    fee_refresh: Amount.t;
    fee_refund: Amount.t;
    denom_secmod_sig: EddsaSignature.t;
  }
end

module FutureKeysResponse = struct
  type t = {
    future_denoms: FutureDenom.t list;
    future_signkeys: FutureSignKey.t list;
    master_pub: EddsaPublicKey.t;
    denom_secmod_public_key: EddsaPublicKey.t;
    signkey_secmod_public_key: EddsaPublicKey.t;
  }
end
