# API docs: https://www.silfio.com/demo

import requests

# Leave api_key empty to run on the free plan (no key is sent).
api_key = ""
base_url = "https://silfio-production.up.railway.app"

headers = {"X-API-Key": api_key} if api_key else {}

inventory = [
    {
        "property_name_or_address": "Warehouse A, Kyiv",
        "policy_ids": ["POL-001"],
        "property_type": "warehouse",
        "value": 25_000_000,
        "currency": "USD",
        "latitude": 50.4501,
        "longitude": 30.5234,
        "iso3": "UKR",
        "property_sqm": 12_000,
        "building_floors": 2,
        "isic_code": "5210",
    },
    {
        "property_name_or_address": "Office Tower, Warsaw",
        "policy_ids": ["POL-002"],
        "property_type": "office",
        "value": 40_000_000,
        "currency": "EUR",
        "latitude": 52.2297,
        "longitude": 21.0122,
        "iso3": "POL",
        "property_sqm": 18_500,
        "building_floors": 14,
        "building_height_m": 60.0,
        "isic_code": "6820",
    },
]

insurance_policies = [
    {
        "policy_id": "POL-001",
        "policy_name": "Kyiv Warehouse Property Cover",
        "insurer": "Acme Specialty",
        "inception_date": "2026-01-01",
        "expiry_date": "2026-12-31",
        "currency": "USD",
        "insurance": {
            "occurrence_attachment": 1_000_000,
            "occurrence_limit": 20_000_000,
            "deductible_type": "each_and_every_loss",
            "participation_pct": 1.0,
            "coinsurance_pct": 0.8,
        },
    },
    {
        "policy_id": "POL-002",
        "policy_name": "Warsaw Office Property Cover",
        "insurer": "Acme Specialty",
        "inception_date": "2026-01-01",
        "expiry_date": "2026-12-31",
        "currency": "EUR",
        "insurance": {
            "occurrence_attachment": 2_000_000,
            "occurrence_limit": 35_000_000,
            "deductible_type": "each_and_every_loss",
            "participation_pct": 0.5,
        },
    },
]

investments = [
    {
        "asset_class": "Bond",
        "instrument_type": "government_bond",
        "issuer": "Republic of Poland",
        "currency": "EUR",
        "market_value": 5_000_000,
        "iso3": "POL",
        "credit_rating": "A-",
        "duration": 6.5,
    },
    {
        "asset_class": "Equity",
        "instrument_type": "listed_equity",
        "issuer": "Baltic Energy PLC",
        "currency": "USD",
        "market_value": 3_000_000,
        "iso3": "LTU",
        "industry": "utilities",
    },
    {
        "asset_class": "Cash",
        "instrument_type": "deposit",
        "issuer": "Regional Bank",
        "currency": "USD",
        "market_value": 1_500_000,
        "iso3": "UKR",
        "duration": 0.1,
    },
]

event_scenario = {
    "UKR": {"annual_prob": 1.0, "conflict_type": "interstate"},
}

hazard_scenario = {
    "UKR": {"damage": 0.30, "gdp_loss": -0.15, "equity_loss": -0.25},
    "POL": {"damage": 0.05, "equity_loss": -0.08},
}

payload = {
    "inventory": inventory,
    "insurance_policies": insurance_policies,
    "investments": investments,
}

scenario_payload = {
    **payload,
    "event_scenario": event_scenario,
    "hazard_scenario": hazard_scenario,
}

run = requests.post(f"{base_url}/run", json=payload, headers=headers, timeout=300)
open("silfio_run.zip", "wb").write(run.content)

# Scenario testing is an enterprise-only feature. Always send the request; the
# API returns 403 if the key (or session) isn't authorised for it.
scenario = requests.post(
    f"{base_url}/scenario", json=scenario_payload, headers=headers, timeout=300
)
if scenario.ok:
    open("silfio_scenario.zip", "wb").write(scenario.content)
else:
    print(f"Scenario request rejected ({scenario.status_code}): {scenario.text}")
