from pydantic import BaseModel, Field
from typing import Literal, List, Union, Optional

# Base class for CircumstanceType with a discriminator field 'type'
class CircumstanceTypeBase(BaseModel):
    type: str

# Collision with means of transport
class RoadVehicleCollision(CircumstanceTypeBase):
    type: Literal['road_vehicle']
    infrastructure_number: Optional[str] = None
    road_type: Literal['highway', 'main road', 
                       'secondary road', 'local road/path/trail', 
                       'parking lot']

class TrainCollision(CircumstanceTypeBase):
    type: Literal['train']
    infrastructure_number: str

class AircraftCollision(CircumstanceTypeBase):
    type: Literal['aircraft']

class BoatCollision(CircumstanceTypeBase):
    type: Literal['boat']

class OtherTransportCollision(CircumstanceTypeBase):
    type: Literal['other transport collision']

class UnknownTransportCollision(CircumstanceTypeBase):
    type: Literal['unknown transport collision']

# Destruction / Deliberately removed
class HuntingDestruction(CircumstanceTypeBase):
    type: Literal['hunting']
    method: Literal['shooting', 'bow', 'falconry', 
                    'hounds hunting', 'digging up', 
                    "other hunting", "unknow hunting"]

class TrapDestruction(CircumstanceTypeBase):
    type: Literal['trap']
    method: Literal['killing trap', 'pole trap', 'trap cage', 'corvids nasse', 
                    'net', 'cage trap', 'fall-trap', 'glue trap', 'insect trap', 
                    "other trap", "unknown trap"]

class PoisoningDestruction(CircumstanceTypeBase):
    type: Literal['poisoning']

class RemovalDestruction(CircumstanceTypeBase):
    type: Literal['removal or direct capture']
    method: Literal['gassing', 'raptor captured at nest', 'brood destruction', 
                    'traffic/trade', 'capture accident', 'scientific sample',
                    "other removal", "unknown removal"]

class FishingDestruction(CircumstanceTypeBase):
    type: Literal['fishing']
    method: Literal['drowned/tangled', 'beached with capture indications', "other fishing", "unknown fishing"]

class OtherDestruction(CircumstanceTypeBase):
    type: Literal['other destruction']

class UnknownDestruction(CircumstanceTypeBase):
    type: Literal['unknown destruction']

# Indirect destruction
class PylonElectricGridDestruction(CircumstanceTypeBase):
    type: Literal['pylone and electric grid']
    infrastructure: Literal['electric line', 'pole/pylon', "other structure", "unknown structure"]
    cause: Literal['collision', 'electrocution']

class WindfarmDestruction(CircumstanceTypeBase):
    type: Literal['windfarm']

class OtherCollisionDestruction(CircumstanceTypeBase):
    type: Literal['other collision']
    object: Literal['window', 'building', 'lighthouse', 
                    'cable', 'wire fence/barbed wire', 'other crash', 'unknown crash']

class FallDestruction(CircumstanceTypeBase):
    type: Literal['fall']
    location: Literal['chimney', 'empty pole', 'hole/well', 'other fall', 'unknown fall']

class DevelopmentWorkDestruction(CircumstanceTypeBase):
    type: Literal['development work']
    work_type: Literal['transport infrastructure', 'building', 'other work', 'unknown work']

class PollutionContaminationDestruction(CircumstanceTypeBase):
    type: Literal['pollution / contamination']
    pollution_type: Literal['oil pollution', 'chemical pollution', 'heavy metals', 
                            'light', 'noise', 
                            'plastic ingestion', 'other pollution', 'unknown pollution']

class AgriculturalNetProtectionDestruction(CircumstanceTypeBase):
    type: Literal['agricultural net protection']

class VegetalForestWorkDestruction(CircumstanceTypeBase):
    type: Literal['vegetal / forest work']
    work_type: Literal['clearing/mowing/plowing', 'tree felling/pruning', 
                       'other forest work', 'unknown forest work']

class OtherIndirectDestruction(CircumstanceTypeBase):
    type: Literal['other indirect desctruction']

class UnknownIndirectDestruction(CircumstanceTypeBase):
    type: Literal['unknown indirect desctruction']

# Natural cause
class Predation(CircumstanceTypeBase):
    type: Literal['predation']
    predator: Literal['cat', 'dog', 'rooster/hen', 
                      'other domestic animal', 'wild birds', 
                      'wild mammal', 'other predator', 'unknown predator']

class Weather(CircumstanceTypeBase):
    type: Literal['weather']
    condition: Literal['cold wave', 'drought', 'hail', 
                       'lightening', 'storm', 
                       'other weather', 'unknown weather']

class NaturalDisaster(CircumstanceTypeBase):
    type: Literal['natural disaster']
    disaster: Literal['fire', 'avalanche', 'rock fall', 
                      'mudslide', 'volcanic eruption/ashes', 
                      'other natural disaster', 'unknown natural disaster']

class NestFall(CircumstanceTypeBase):
    type: Literal['nest fall']

class StrandingExhaustion(CircumstanceTypeBase):
    type: Literal['stranding due to exhaustion']

class DiseaseParasite(CircumstanceTypeBase):
    type: Literal['disease/parasite']

class AccidentalDrowning(CircumstanceTypeBase):
    type: Literal['accidental drowning']
    drowning_location: Literal['drinking trough', 'pool', 
                               'storm pool', 'irrigation pool', 
                               'natural pool', 'flood', 
                               'other location', 'unknown location']

class OtherNaturalCause(CircumstanceTypeBase):
    type: Literal['other natural cause']

class UnknownNaturalCause(CircumstanceTypeBase):
    type: Literal['unknown natural cause']

# Unknown cause
class UnknownCircumstance(CircumstanceTypeBase):
    type: Literal['unknown']

# Union of all possible CircumstanceTypes with 'type' as the discriminator
CircumstanceType = Union[
    RoadVehicleCollision,
    TrainCollision,
    AircraftCollision,
    BoatCollision,
    OtherTransportCollision,
    UnknownTransportCollision,
    HuntingDestruction,
    TrapDestruction,
    PoisoningDestruction,
    RemovalDestruction,
    FishingDestruction,
    OtherDestruction,
    UnknownDestruction,
    PylonElectricGridDestruction,
    WindfarmDestruction,
    OtherCollisionDestruction,
    FallDestruction,
    DevelopmentWorkDestruction,
    PollutionContaminationDestruction,
    AgriculturalNetProtectionDestruction,
    VegetalForestWorkDestruction,
    OtherIndirectDestruction,
    UnknownIndirectDestruction,
    Predation,
    Weather,
    NaturalDisaster,
    NestFall,
    StrandingExhaustion,
    DiseaseParasite,
    AccidentalDrowning,
    OtherNaturalCause,
    UnknownNaturalCause,
    UnknownCircumstance
]

# Main Circumstance class
class Circumstances(BaseModel):
    circumstance_radio: str  # e.g., "Yes"
    circumstance: Optional[str] = None  # e.g., "COLLISION"
    circumstance_type: Optional[CircumstanceType] = Field(None, discriminator='type')


# Example usage
# json_data = {
#     "circumstance": "COLLISION",
#     "circumstance_radio": "Yes",
#     "circumstance_type": {
#         "type": "Train",
#         "infrastructure_number": "56"
#     }
# }
# circumstance_instance = Circumstance(**json_data)
# circumstance_schema = Circumstance.schema_json(indent=2)