//
//  Copyright (C) 2021 Greg Landrum
//
//   @@ All Rights Reserved @@
//  This file is part of the RDKit.
//  The contents are covered by the terms of the BSD license
//  which is included in the file license.txt, found at the root
//  of the RDKit source tree.
//

namespace defaults {
// Derived from the transforms in Sitzmann et al.
// https://doi.org/10.1007/s10822-010-9346-4
//	Name	SMARTS	Bonds	Charges
const std::vector<
    std::tuple<std::string, std::string, std::string, std::string>>
    defaultTautomerTransforms{
        std::make_tuple(std::string("1,3 (thio)keto/enol f"),
                        std::string("[CX4!H0R{0-2}]-[C;z{1-2}]=[O,S,Se,Te;X1]"),
                        std::string(""), std::string("")),
        std::make_tuple(std::string("1,3 (thio)keto/enol r"),
                        std::string("[O,S,Se,Te;X2!H0]-[#6;z{1-2}]=[C,cz{0-1}R{0-1}]"),
                        std::string(""), std::string("")),
        std::make_tuple(
            std::string("1,5 (thio)keto/enol f"),
            std::string("[CX4z0,NX3;!H0]-[C]=[C][Cz1H0]=[O,S,Se,Te;X1]"),
            std::string(""), std::string("")),
        std::make_tuple(std::string("1,5 (thio)keto/enol r"),
                        std::string("[O,S,Se,Te;X2!H0]-[Cz1H0]=[C]-[C]=[Cz0,N]"),
                        std::string(""), std::string("")),
        std::make_tuple(std::string("aliphatic imine f"),
                        std::string("[CX4R{0-2}!H0]-[Cz1]=[NX2;N!H0,$(N-a)]"), std::string(""),
                        std::string("")),
        std::make_tuple(std::string("aliphatic imine r"),
                        std::string("[NX3;NH2,$([NH1]-a)]-[C;z{1-2}]=[CX3]"), std::string(""),
                        std::string("")),
        std::make_tuple(std::string("special imine f"),
                        std::string("[Nz0!H0]-[C]=[Cz0X3R0]"), std::string(""),
                        std::string("")),
        std::make_tuple(std::string("special imine r"),
                        std::string("[Cz0R0X4!H0]-[c]=[nz0]"), std::string(""),
                        std::string("")),
        std::make_tuple(std::string("special imine r2"),
                        std::string("[Cz0R0X4!H0]-[cr6](=[cr6])-[nr6H0z0]"),
                        std::string("==-"), std::string("")),
        std::make_tuple(std::string("1,3 aromatic heteroatom H shift f"),
                        std::string("[#7+0!H0]-[#6R1]=[O,#7X2+0]"),
                        std::string(""), std::string("")),
        std::make_tuple(std::string("1,3 aromatic heteroatom H shift "),
                        std::string("[O,#7+0;!H0]-[#6R1]=[#7+0X2]"),
                        std::string(""), std::string("")),
        std::make_tuple(
            std::string("1,3 heteroatom H shift"),
            std::string(
                "[#7+0,S,O,Se,Te;!H0]-[#7X2,#6,#15X3H0]=[#7+0,#16,#8,Se,Te]"),
            std::string(""), std::string("")),
        std::make_tuple(
            std::string("1,5 aromatic heteroatom H shift"),
            std::string(
                "[#7+0,#16,#8;!H0]-[#6,#7]=[#6]-[#6,#7]=[#7+0,#16,#8;H0]"),
            std::string(""), std::string("")),
        std::make_tuple(std::string("1,5 aromatic heteroatom H shift "),
                        std::string("[#7+0,#16,#8,Se,Te;!H0]-[#6,nX2]=[#6,nX2]-"
                                    "[#6,#7X2]=[#7X2+0,S,O,Se,Te]"),
                        std::string(""), std::string("")),
        std::make_tuple(std::string("1,5 aromatic heteroatom H shift r"),
                        std::string("[#7+0,S,O,Se,Te;!H0]-[#6,#7X2]=[#6,nX2]-[#"
                                    "6,nX2]=[#7+0,#16,#8,Se,Te]"),
                        std::string(""), std::string("")),
        std::make_tuple(
            std::string("1,7 aromatic heteroatom H shift f"),
            std::string("[#7+0,#8,#16,Se,Te;!H0]-[#6,#7X2]=[#6,#"
                        "7X2]-[#6,#7X2]=[#6]-[#6,#7X2]=[#7X2+0,S,O,Se,Te,Cz0X3]"),
            std::string(""), std::string("")),
        std::make_tuple(
            std::string("1,7 aromatic heteroatom H shift r"),
            std::string("[#7+0,S,O,Se,Te,Cz0X4;!H0]-[#6,#7X2]=[#6]-[#"
                        "6,#7X2]=[#6,#7X2]-[#6,#7X2]=[NX2,S,O,Se,Te]"),
            std::string(""), std::string("")),
        std::make_tuple(
            std::string("1,9 aromatic heteroatom H shift f"),
            std::string("[#7+0,O;!H0]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]"
                        "=[#6,#7X2]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]=[#7+0,O]"),
            std::string(""), std::string("")),
        std::make_tuple(std::string("1,11 aromatic heteroatom H shift f"),
                        std::string("[#7+0,O;!H0]-[#6,nX2]=[#6,nX2]-[#6,nX2]=[#"
                                    "6,nX2]-[#6,nX2]=[#6,nX2]-[#6,nX2]=[#6,nX2]"
                                    "-[#6,nX2]=[#7X2+0,O]"),
                        std::string(""), std::string("")),
        std::make_tuple(
            std::string("furanone f"),
            std::string("[O,S,N;!H0]-[#6z2r5]=,:[#6X3r5;$([#6]([#6;r5])=,:[#6X3r5])]"),
            std::string(""), std::string("")),
        std::make_tuple(
            std::string("furanone r"),
            std::string("[#6r5!H0;$([#6]([#6r5])[#6r5])][#6z2r5]=[O,S,N]"),
            std::string(""), std::string("")),
        std::make_tuple(std::string("keten/ynol f"),
                        std::string("[C!H0]=[C]=[O,S,Se,Te;X1]"),
                        std::string("#-"), std::string("")),
        std::make_tuple(std::string("keten/ynol r"),
                        std::string("[O,S,Se,Te;!H0X2]-[C]#[C]"),
                        std::string("=="), std::string("")),
        std::make_tuple(std::string("ionic nitro/aci-nitro f"),
                        std::string("[C!H0]-[N+;$([N][O-])]=[O]"),
                        std::string(""), std::string("")),
        std::make_tuple(std::string("ionic nitro/aci-nitro r"),
                        std::string("[O!H0]-[N+;$([N][O-])]=[C]"),
                        std::string(""), std::string("")),
        std::make_tuple(std::string("oxim/nitroso f"),
                        std::string("[O!H0]-[Nz1]=[C]"), std::string(""),
                        std::string("")),
        std::make_tuple(std::string("oxim/nitroso r"),
                        std::string("[C!H0]-[Nz1]=[O]"), std::string(""),
                        std::string("")),
        std::make_tuple(std::string("oxim/nitroso via phenol f"),
                        std::string("[O!H0]-[N]=[C]-[C]=[C]-[C]=[OH0]"),
                        std::string(""), std::string("")),
        std::make_tuple(std::string("oxim/nitroso via phenol r"),
                        std::string("[O!H0]-[c]=,:[c][c]=,:[c]-[N]=[OH0]"),
                        std::string(""), std::string("")),
        std::make_tuple(std::string("cyano/iso-cyanic acid f"),
                        std::string("[O!H0]-[C]#[N]"), std::string("=="),
                        std::string("")),
        std::make_tuple(std::string("cyano/iso-cyanic acid r"),
                        std::string("[N!H0]=[C]=[O]"), std::string("#-"),
                        std::string("")),
        std::make_tuple(std::string("formamidinesulfinic acid f"),
                        std::string("[O,N;!H0]-[C]=[S,Se,Te;v6]=[O]"),
                        std::string("=--"), std::string("")),
        std::make_tuple(std::string("formamidinesulfinic acid r"),
                        std::string("[O!H0]-[S,Se,Te;v4]-[C]=[O,N]"),
                        std::string("==-"), std::string("")),
        std::make_tuple(std::string("isocyanide f"),
                        std::string("[C-0!H0]#[N+0]"), std::string("#"),
                        std::string("-+")),
        std::make_tuple(std::string("isocyanide r"),
                        std::string("[N+!H0]#[C-]"), std::string("#"),
                        std::string("-+")),
        std::make_tuple(std::string("phosphonic acid f"),
                        std::string("[OH]-[PX3H0]"), std::string("="),
                        std::string("")),
        std::make_tuple(std::string("phosphonic acid r"),
                        std::string("[PX4H]=[O]"), std::string("-"),
                        std::string(""))};
}  // namespace defaults