"""ExactOnline tap class."""

from typing import List

from singer_sdk import Tap, Stream
from singer_sdk import typing as th  # JSON schema typing helpers
# TODO: Import your custom stream types here:
from tap_exact.streams import (
    ExactOnlineStream,
    SalesInvoicesStream,
    PurchaseInvoicesStream,
    GeneralLedgerAccountsStream,
    BankEntryLinesStream,
    CashEntryLinesStream,
    GeneralJournalEntryLinesStream,
    PurchaseEntriesStream,
    SalesEntriesStream,
    CrmAccountsStream,
    # SystemUsersStream
)
# TODO: Compile a list of custom stream types here
#       OR rewrite discover_streams() below with your custom logic.
STREAM_TYPES = [
    SalesInvoicesStream,
    PurchaseInvoicesStream,
    GeneralLedgerAccountsStream,
    BankEntryLinesStream,
    CashEntryLinesStream,
    GeneralJournalEntryLinesStream,
    PurchaseEntriesStream,
    SalesEntriesStream,
    CrmAccountsStream,
    # SystemUsersStream
]


class TapExactOnline(Tap):
    """ExactOnline tap class."""
    name = "tap-exact"

    # TODO: Update this section with the actual config values you expect:
    config_jsonschema = th.PropertiesList(
        th.Property(
            "config_file_location",
            th.StringType,
            required=True,
            description="The config file containing OAuth2 credentials"
        ),
        th.Property(
            "start_date",
            th.DateTimeType,
            description="The earliest record date to sync"
        ),
    ).to_dict()

    def discover_streams(self) -> List[Stream]:
        """Return a list of discovered streams."""
        return [stream_class(tap=self) for stream_class in STREAM_TYPES]


if __name__ == "__main__":
    TapExactOnline.cli()
