# credo:disable-for-this-file Credo.Check.Readability.ModuleDoc
defmodule RDF.TestDatatypes do
  defmodule Initials do
    use RDF.XSD.Datatype.Restriction,
      name: "initials",
      id: "http://example.com/initials",
      base: RDF.XSD.String

    def_facet_constraint RDF.XSD.Facets.Length, 2
  end

  defmodule UsZipcode do
    use RDF.XSD.Datatype.Restriction,
      name: "us_zipcode",
      id: "http://example.com/us-zipcode",
      base: RDF.XSD.String

    def_facet_constraint RDF.XSD.Facets.Pattern, "[0-9]{5}(-[0-9]{4})?"
  end

  defmodule AltUsZipcode do
    use RDF.XSD.Datatype.Restriction,
      name: "alt_us_zipcode",
      id: "http://example.com/alt-us-zipcode",
      base: RDF.XSD.String

    def_facet_constraint RDF.XSD.Facets.Pattern, [
      "[0-9]{5}",
      "[0-9]{5}-[0-9]{4}"
    ]
  end

  defmodule Age do
    use RDF.XSD.Datatype.Restriction,
      name: "age",
      id: "http://example.com/Age",
      base: RDF.XSD.PositiveInteger

    def_facet_constraint RDF.XSD.Facets.MaxInclusive, 150

    @impl RDF.XSD.Datatype
    def canonical_mapping(value), do: "#{value} years"
  end

  defmodule DecimalUnitInterval do
    use RDF.XSD.Datatype.Restriction,
      name: "decimal_unit_interval",
      id: "http://example.com/decimalUnitInterval",
      base: RDF.XSD.Decimal

    def_facet_constraint RDF.XSD.Facets.MinInclusive, 0
    def_facet_constraint RDF.XSD.Facets.MaxInclusive, 1
  end

  defmodule DoubleUnitInterval do
    use RDF.XSD.Datatype.Restriction,
      name: "double_unit_interval",
      id: "http://example.com/doubleUnitInterval",
      base: RDF.XSD.Double

    def_facet_constraint RDF.XSD.Facets.MinInclusive, 0
    def_facet_constraint RDF.XSD.Facets.MaxInclusive, 1
  end

  defmodule FloatUnitInterval do
    use RDF.XSD.Datatype.Restriction,
      name: "float_unit_interval",
      id: "http://example.com/floatUnitInterval",
      base: RDF.XSD.Float

    def_facet_constraint RDF.XSD.Facets.MinInclusive, 0
    def_facet_constraint RDF.XSD.Facets.MaxInclusive, 1
  end

  defmodule DateTimeWithTz do
    use RDF.XSD.Datatype.Restriction,
      name: "datetime_with_tz",
      id: "http://example.com/datetime-with-tz",
      base: RDF.XSD.DateTime

    def_facet_constraint RDF.XSD.Facets.ExplicitTimezone, :required
  end

  defmodule DateWithoutTz do
    use RDF.XSD.Datatype.Restriction,
      name: "date_with_tz",
      id: "http://example.com/date-with-tz",
      base: RDF.XSD.Date

    def_facet_constraint RDF.XSD.Facets.ExplicitTimezone, :prohibited
  end

  defmodule CustomTime do
    use RDF.XSD.Datatype.Restriction,
      name: "time_with_tz",
      id: "http://example.com/time-with-tz",
      base: RDF.XSD.Time

    def_facet_constraint RDF.XSD.Facets.ExplicitTimezone, :optional
  end
end
