struct

  type t = {
    name: string;
    parameters: (string * string) list
  }
  let name t = t.name
  let to_json {name; parameters}: Yojson.Basic.json =
    `Assoc [
      "name"`String name;
      "parameters",
      `Assoc (List.map parameters ~f:(fun (a, b) -> a, `String b));
    ]

  let generate_config_file ~path config : KEDSL.Program.t =
    let open KEDSL in
    Program.(
      shf "echo '[user]' > %s" path
      && chain
        (List.map config.parameters (fun (k, v) ->
             shf "echo '%s = %s' >> %s" k v path))
    )

  let default =
    { name = "default";
      parameters = [
        "isSkipDepthFilters""0";
        "maxInputDepth""10000";
        "depthFilterMultiple""3.0";
        "snvMaxFilteredBasecallFrac""0.4";
        "snvMaxSpanningDeletionFrac""0.75";
        "indelMaxRefRepeat""8";
        "indelMaxWindowFilteredBasecallFrac""0.3";
        "indelMaxIntHpolLength""14";
        "ssnvPrior""0.000001";
        "sindelPrior""0.000001";
        "ssnvNoise""0.0000005";
        "sindelNoise""0.0000001";
        "ssnvNoiseStrandBiasFrac""0.5";
        "minTier1Mapq""40";
        "minTier2Mapq""5";
        "ssnvQuality_LowerBound""15";
        "sindelQuality_LowerBound""30";
        "isWriteRealignedBam""0";
        "binSize""25000000";
        "extraStrelkaArguments""--eland-compatibility";
      ]}
  let test1 =
    { name = "test1";
      parameters = [
        "isSkipDepthFilters""0";
        "maxInputDepth""10000";
        "depthFilterMultiple""3.0";
        "snvMaxFilteredBasecallFrac""0.4";
        "snvMaxSpanningDeletionFrac""0.75";
        "indelMaxRefRepeat""8";
        "indelMaxWindowFilteredBasecallFrac""0.3";
        "indelMaxIntHpolLength""14";
        "ssnvPrior""0.000001";
        "sindelPrior""0.000001";
        "ssnvNoise""0.0000005";
        "sindelNoise""0.0000001";
        "ssnvNoiseStrandBiasFrac""0.5";
        "minTier1Mapq""40";
        "minTier2Mapq""5";
        "ssnvQuality_LowerBound""15";
        "sindelQuality_LowerBound""30";
        "isWriteRealignedBam""0";
        "binSize""25000000";
        "extraStrelkaArguments""--eland-compatibility";
        "priorSomaticSnvRate""1e-06";
        "germlineSnvTheta""0.001";
      ]}
  let empty_exome =
    { name = "empty-exome";
      parameters = [
        "isSkipDepthFilters""1";
      ]}
  let exome_default =
    { name = "exome-default";
      parameters = [
        "isSkipDepthFilters""1";
        "maxInputDepth""10000";
        "depthFilterMultiple""3.0";
        "snvMaxFilteredBasecallFrac""0.4";
        "snvMaxSpanningDeletionFrac""0.75";
        "indelMaxRefRepeat""8";
        "indelMaxWindowFilteredBasecallFrac""0.3";
        "indelMaxIntHpolLength""14";
        "ssnvPrior""0.000001";
        "sindelPrior""0.000001";
        "ssnvNoise""0.0000005";
        "sindelNoise""0.0000001";
        "ssnvNoiseStrandBiasFrac""0.5";
        "minTier1Mapq""40";
        "minTier2Mapq""5";
        "ssnvQuality_LowerBound""15";
        "sindelQuality_LowerBound""30";
        "isWriteRealignedBam""0";
        "binSize""25000000";
        "extraStrelkaArguments""--eland-compatibility";
      ]}

end