lib/naiveical.ex

defmodule Naiveical do
  @moduledoc """
  Public façade of the core Naiveical helpers so users can stay at `Naiveical` instead of digging
  through nested namespaces.

  ## Calendar builders
  - `create_vcalendar/0-2`
  - `create_vevent/6`
  - `create_vtodo/3-4`
  - `create_valert/2`
  - `create_valarm/2`
  - `build_aggregated_vcalendar/3`

  ## VCARD builders
  - `create_vcard/2`
  - `create_categories/2`
  - `create_note/2`
  - `create_nickname/2`
  - `create_title/2`
  - `create_role/2`
  - `create_organization/2`
  - `create_special_date/3`
  - `create_kind/2`
  - `create_email/2`
  - `create_display_name/3`
  - `create_address/2`
  - `create_website/2`
  - `create_full_name/6`
  - `create_telephone/2`

  ## Mutation helpers
  - `insert_into/3-4`
  - `change_value/3`
  - `change_values/2`
  - `delete_all/2`
  - `delete_all!/2`
  - `add_timezone_info/1`

  ## Extraction helpers
  - `extract_sections_by_tag/2`
  - `remove_sections_by_tag/2`
  - `extract_contentline_by_tag/2`
  - `extract_raw_contentline_by_tag/2`
  - `extract_datetime_contentline_by_tag/2`
  - `extract_datetime_contentline_by_tag!/2`
  - `extract_date_contentline_by_tag/2`
  - `extract_date_contentline_by_tag!/2`
  - `extract_attribute/2`
  - `detect_component_type/1`

  ## Text and date helpers
  - `unfold/1`
  - `fold/1-2`
  - `parse_datetime/1-2`
  - `parse_datetime!/1-2`
  - `parse_date/1`
  - `parse_date!/1`
  - `is_fullday/2`
  - `parse_icalendar_datetime/1`
  - `parse_icalendar_datetime!/1`
  - `format_icalendar_datetime/1`
  - `format_icalendar_date/1`
  - `parse_icalendar_date/1`
  - `parse_icalendar_date!/1`
  """

  alias Naiveical.Creator.{Icalendar, Vcard}
  alias Naiveical.{Extractor, Helpers, Modificator}

  ## Calendar builders
  defdelegate create_vcalendar(method \\ "PUBLISH", prod_id \\ "Excalt"), to: Icalendar

  defdelegate create_vevent(
                summary,
                dtstart,
                dtend,
                location \\ "",
                description \\ "",
                class \\ "PUBLIC"
              ),
              to: Icalendar

  defdelegate create_vtodo(summary, due, dtstamp \\ DateTime.utc_now(), opts \\ []), to: Icalendar
  defdelegate create_valert(description, trigger), to: Icalendar
  defdelegate create_valarm(description, trigger), to: Icalendar

  defdelegate build_aggregated_vcalendar(components, vtimezones, displayname \\ nil),
    to: Icalendar

  ## VCARD builders
  defdelegate create_vcard(uuid, opts \\ []), to: Vcard
  defdelegate create_categories(categories, opts \\ []), to: Vcard
  defdelegate create_note(note, opts \\ []), to: Vcard
  defdelegate create_nickname(nickname, opts \\ []), to: Vcard
  defdelegate create_title(title, opts \\ []), to: Vcard
  defdelegate create_role(role, opts \\ []), to: Vcard
  defdelegate create_organization(org, opts \\ []), to: Vcard
  defdelegate create_special_date(date, type, opts \\ []), to: Vcard
  defdelegate create_kind(kind, opts \\ []), to: Vcard
  defdelegate create_email(address, opts \\ []), to: Vcard

  defdelegate create_display_name(display_name \\ "", first_name \\ "", last_name \\ ""),
    to: Vcard

  defdelegate create_address(address, opts \\ []), to: Vcard
  defdelegate create_website(url, opts \\ []), to: Vcard

  defdelegate create_full_name(prefix, first_name, middle_name, last_name, suffix, opts \\ []),
    to: Vcard

  defdelegate create_telephone(tel, opts \\ []), to: Vcard

  ## Mutation helpers
  defdelegate insert_into(ical_text, new_content, element, opts \\ []), to: Modificator
  defdelegate change_value(ical_text, tag, new_value), to: Modificator
  defdelegate change_values(ical_text, tag_values), to: Modificator
  defdelegate delete_all(ical_text, tag), to: Modificator
  defdelegate delete_all!(ical_text, tag), to: Modificator
  defdelegate add_timezone_info(ical_text), to: Modificator

  ## Extraction helpers
  defdelegate extract_sections_by_tag(ical_text, tag), to: Extractor
  defdelegate remove_sections_by_tag(ical_text, tag), to: Extractor
  defdelegate extract_contentline_by_tag(ical_text, tag), to: Extractor
  defdelegate extract_raw_contentline_by_tag(ical_text, tag), to: Extractor
  defdelegate extract_datetime_contentline_by_tag(ical_text, tag), to: Extractor
  defdelegate extract_datetime_contentline_by_tag!(ical_text, tag), to: Extractor
  defdelegate extract_date_contentline_by_tag(ical_text, tag), to: Extractor
  defdelegate extract_date_contentline_by_tag!(ical_text, tag), to: Extractor
  defdelegate extract_attribute(attribute_list_str, attr), to: Extractor
  defdelegate detect_component_type(ical_data), to: Extractor

  ## Text and date helpers
  defdelegate unfold(ical_text), to: Helpers
  defdelegate fold(line, max_size \\ 75), to: Helpers
  defdelegate parse_datetime(datetime_str), to: Helpers
  defdelegate parse_datetime!(datetime_str), to: Helpers
  defdelegate parse_datetime(datetime_str, timezone), to: Helpers
  defdelegate parse_datetime!(datetime_str, timezone), to: Helpers
  defdelegate parse_date(date_str), to: Helpers
  defdelegate parse_date!(date_str), to: Helpers
  defdelegate is_fullday(attributes, datetime_str), to: Helpers
  defdelegate parse_icalendar_datetime(datetime_str), to: Helpers
  defdelegate parse_icalendar_datetime!(datetime_str), to: Helpers
  defdelegate format_icalendar_datetime(datetime), to: Helpers
  defdelegate format_icalendar_date(date), to: Helpers
  defdelegate parse_icalendar_date(date_str), to: Helpers
  defdelegate parse_icalendar_date!(date_str), to: Helpers
end