#use "topfind";;
#thread;;
#require "threads";;
#require "stringext";;
#require "lwt";;
#require "lwt.unix";;
#require "zarith";;
#require "re";;
#require "hacl";;
#require "calendar";;
#mod_use "../src/lib_stdlib/tzString.ml";;
#mod_use "../src/lib_stdlib/option.ml";;
#mod_use "../src/lib_stdlib/tzList.ml";;
#mod_use "../src/lib_stdlib/utils.ml";;
#mod_use "../src/lib_crypto/base58.ml";;

open Lwt.Infix;;

let prefix = "BLockGenesisGenesisGenesisGenesisGenesis"
let rec genesis () =
  let date =
    Lwt_main.run
      (Lwt_process.pread_line (Lwt_process.shell "TZ='AAA+1' date +%FT%TZ")) in
  let suffix = String.sub Digest.(to_hex (string date)) 0 5 in
  match Base58.raw_decode (prefix ^ suffix ^ "crcCRC") with
  | None -> genesis ()
  | Some p ->
      let p = String.sub p 0 (String.length p - 4) in
      Base58.safe_encode p, date

let genesis, date = genesis ()

let () =
  Lwt_main.run @@
  let stream = Lwt_io.lines_of_file "alphanet_version" in
  Lwt_stream.to_list stream >>= function
  | [] | _ :: _ :: _ -> failwith "bad alphanet_version file"
  | [ line ] -> match String.split_on_char 'Z' line with
    | [ _ ; branch ] ->
        let contents = if String.trim branch = "" then date else date ^ branch in
        Lwt_io.lines_to_file "alphanet_version" (Lwt_stream.of_list [ contents ])
    | _ -> failwith "bad alphanet_version file"

let sed =
  Format.sprintf
    "sed -i.old \
     -e 's/Time.of_notation_exn \"[^\\\"]*\"/Time.of_notation_exn \"%s\"/' \
     -e 's/BLockGenesisGenesisGenesisGenesisGenesis.........../%s/' \
     ../src/bin_node/node_run_command.ml"
    date
    genesis

let () =
  Lwt_main.run (Lwt_process.exec (Lwt_process.shell sed) >>= fun _ ->
                Lwt_unix.unlink "../src/bin_node/node_run_command.ml.old")

let sed =
  Format.sprintf
    "sed -E -i.old \
     -e 's/name = \"(TEZOS[_A-Z]+)[^\"]*\" ;/name = \"\\1%s\" ;/' \
     ../src/lib_shell/distributed_db_message.ml"
    date

let () =
  Lwt_main.run (Lwt_process.exec (Lwt_process.shell sed) >>= fun _ ->
                Lwt_unix.unlink "../src/lib_shell/distributed_db_message.ml.old")
