# generated by datamodel-codegen:
#   filename:  run-results_v3.json

from __future__ import annotations

from datetime import datetime
from enum import Enum
from typing import Any
from typing import Optional
from typing import Union

from pydantic import ConfigDict

from vendor.dbt_artifacts_parser.parsers.base import BaseParserModel


class BaseArtifactMetadata(BaseParserModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    dbt_schema_version: str
    dbt_version: Optional[str] = "0.21.0rc1"
    generated_at: Optional[datetime] = "2021-09-24T13:29:14.315088Z"
    invocation_id: Optional[str] = None
    env: Optional[dict[str, str]] = {}


class Status(Enum):
    success = "success"
    error = "error"
    skipped = "skipped"


class Status1(Enum):
    pass_ = "pass"
    error = "error"
    fail = "fail"
    warn = "warn"
    skipped = "skipped"


class Status2(Enum):
    pass_ = "pass"
    warn = "warn"
    error = "error"
    runtime_error = "runtime error"


class TimingInfo(BaseParserModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    name: str
    started_at: Optional[datetime] = None
    completed_at: Optional[datetime] = None


class FreshnessMetadata(BaseParserModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    dbt_schema_version: Optional[str] = "https://schemas.getdbt.com/dbt/sources/v2.json"
    dbt_version: Optional[str] = "0.21.0rc1"
    generated_at: Optional[datetime] = "2021-09-24T13:29:14.312598Z"
    invocation_id: Optional[str] = None
    env: Optional[dict[str, str]] = {}


class Status3(Enum):
    runtime_error = "runtime error"


class SourceFreshnessRuntimeError(BaseParserModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    unique_id: str
    error: Optional[Union[str, int]] = None
    status: Status3


class Status4(Enum):
    pass_ = "pass"
    warn = "warn"
    error = "error"
    runtime_error = "runtime error"


class Period(Enum):
    minute = "minute"
    hour = "hour"
    day = "day"


class Time(BaseParserModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    count: int
    period: Period


class RunResultOutput(BaseParserModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    status: Union[Status, Status1, Status2]
    timing: list[TimingInfo]
    thread_id: str
    execution_time: float
    adapter_response: dict[str, Any]
    message: Optional[str] = None
    failures: Optional[int] = None
    unique_id: str


class FreshnessThreshold(BaseParserModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    warn_after: Optional[Time] = None
    error_after: Optional[Time] = None
    filter: Optional[str] = None


class RunResultsV3(BaseParserModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    metadata: BaseArtifactMetadata
    results: list[RunResultOutput]
    elapsed_time: float
    args: Optional[dict[str, Any]] = {}


class SourceFreshnessOutput(BaseParserModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    unique_id: str
    max_loaded_at: datetime
    snapshotted_at: datetime
    max_loaded_at_time_ago_in_s: float
    status: Status4
    criteria: FreshnessThreshold
    adapter_response: dict[str, Any]
    timing: list[TimingInfo]
    thread_id: str
    execution_time: float
