// A translation round: the files that came back from translators, how far along they are, what
// breaks a build, and translations put in with the rest of the file left alone.
//
//   quillo run xliff.qwe      then open http://localhost:8080/read, /v2, /todo, /progress, /check, /fill, /write and /broken

use "xliff.qwer"

let V1 = read_file("xliff_sample_12.xlf")
let V2 = read_file("xliff_sample_20.xlf")

route GET /read {
    let d = xliff_read_file("xliff_sample_12.xlf")?
    let f = d.files[0]
    { version: d.version, file: [f.original, f.datatype, f.source_language, f.target_language], ids: f.units | map((u) => u.id), first: f.units[0], cart: [f.units[1].source, f.units[1].source_text, f.units[1].approved] }
}

route GET /v2 {
    let f = xliff_read(V2)?.files[0]
    { langs: [f.source_language, f.target_language], ids: f.units | map((u) => [u.id, u.state, u.translated]), first: f.units[0], placeholder: f.units[1].target, tags: f.units[1].tags }
}

route GET /todo = {
    v1: xliff_untranslated(V1)? | map((u) => [u.id, u.source_text, u.state]),
    v2: xliff_untranslated(V2)? | map((u) => [u.id, u.source_text, u.state]),
}

route GET /progress = { v1: xliff_progress(V1)?, v2: xliff_progress(V2)? }

route GET /check = { v1: xliff_check(V1)?, v2: xliff_check(V2)? }

route GET /fill {
    let one = xliff_fill(V1, { save: "Enregistrer", open: { target: "Ouvrir <bpt id=\"1\">&lt;b&gt;</bpt>maintenant<ept id=\"1\">&lt;/b&gt;</ept>", state: "needs-review-translation" } })?
    let two = xliff_fill(V2, { "u2/s2": "Zweiter.", u4: { target: "Tom &amp; Jerry", state: "final" } })?
    {
        left: xliff_untranslated(one)? | map((u) => u.id),
        open: (xliff_read(one)?.files[0].units | filter((u) => u.id == "open"))[0],
        kept: contains(one, "<header><tool tool-id=\"sample\" tool-name=\"Sample\"/></header>"),
        added: contains(one, "<source>Save</source>\n          <target state=\"translated\">Enregistrer</target>"),
        v2: xliff_read(two)?.files[0].units | map((u) => [u.id, u.state, u.target_text]),
        nothing: xliff_fill(V1, {})? == V1,
        no_id: xliff_fill(V1, { nope: "x" }).error,
        bad_markup: xliff_fill(V1, { save: "a <b" }).error != null,
        bad_state: xliff_fill(V2, { u4: { target: "x", state: "needs-review" } }).error,
    }
}

let DOC = {
    source_language: "en", target_language: "es", original: "app.json",
    units: [
        { id: "a", source_text: "Fish & chips <hot>", target_text: "Pescado & patatas", state: "translated", note: "A <dish>" },
        { id: "b", source: "Hi <ph id=\"1\"/>", },
    ],
}

route GET /write {
    let two = xliff_write(merge(DOC, { version: "2.0" }))?
    let one = xliff_write(merge(DOC, { version: "1.2", units: [merge(DOC.units[0], { state: "signed-off" }), { id: "b", source: "Hi <x id=\"1\"/>" }] }))?
    let a = xliff_read(two)?
    let b = xliff_read(one)?
    {
        two: two,
        a: a.files[0].units | map((u) => [u.id, u.source_text, u.target_text, u.state]),
        b: [b.files[0].source_language, b.files[0].units | map((u) => [u.id, u.source, u.state, u.notes])],
        twice: xliff_write({ source_language: "en", units: [{ id: "a", source: "x" }, { id: "a", source: "y" }] }).error,
        no_source: xliff_write({ source_language: "en", units: [{ id: "a" }] }).error,
        bad_markup: xliff_write({ source_language: "en", units: [{ id: "a", source: "<b>" }] }).error != null,
        bad_version: xliff_write({ version: "1.1", source_language: "en", units: [] }).error,
        bad_state: xliff_write({ source_language: "en", units: [{ id: "a", source: "x", state: "signed-off" }] }).error,
    }
}

route GET /broken = {
    not_xml: xliff_read("<xliff").error != null,
    wrong: xliff_read("<html/>").error,
    no_version: xliff_read("<xliff/>").error,
    old: xliff_read("<xliff version=\"3.0\"/>").error,
    empty: xliff_read("<xliff version=\"1.2\"/>").error,
    entity: xliff_read("<!DOCTYPE x [<!ENTITY a 'b'>]><xliff version=\"1.2\"/>").error != null,
    no_file: xliff_read_file("nothing.xlf").error != null,
}
