import sqlalchemy as sa
from sqlalchemy.orm import relationship, declarative_base
from sqlalchemy.dialects.mysql import JSON # Use JSON type for MySQL/MariaDB
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session

Base = declarative_base()

class CompanyFinancials(Base):
    """Stores core and most recent financial data for a company (MySQL/MariaDB compatible)."""
    __tablename__ = 'company_financials'

    # --- Identifiers ---
    isin = sa.Column(sa.String(12), primary_key=True) # ISIN as primary key
    symbol = sa.Column(sa.String(20), index=True)
    exchange_listed = sa.Column(sa.String(50))
    country = sa.Column(sa.String(100))
    country_code_fund = sa.Column(sa.String(10))
    region = sa.Column(sa.String(50)) # e.g., BU, FL, WI
    sector = sa.Column(sa.String(100))
    industry = sa.Column(sa.String(100))
    business_description = sa.Column(sa.Text)
    website_url = sa.Column(sa.String(255))
    ceo = sa.Column(sa.String(100))
    founded = sa.Column(sa.Integer)
    cik_code = sa.Column(sa.Integer, nullable=True) # Specific to US companies (from US9182841000.json)
    location = sa.Column(sa.String(100)) # e.g., Brussels, Miramar, Vienna

    # --- Market Data & Basic Info ---
    market_cap_basic = sa.Column(sa.BigInteger, nullable=True)
    market_cap_calc = sa.Column(sa.Numeric(20, 4), nullable=True)
    float_shares_outstanding = sa.Column(sa.Numeric(20, 4), nullable=True)
    float_shares_outstanding_current = sa.Column(sa.Numeric(20, 4), nullable=True)
    total_shares_outstanding = sa.Column(sa.BigInteger, nullable=True)
    total_shares_outstanding_fundamental = sa.Column(sa.BigInteger, nullable=True)
    total_shares_outstanding_calculated = sa.Column(sa.Numeric(20, 4), nullable=True)
    dividends_yield_current = sa.Column(sa.Numeric(18, 6), nullable=True)
    dividend_yield_recent = sa.Column(sa.Numeric(18, 6), nullable=True)
    price_earnings = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM P/E
    price_book_ratio = sa.Column(sa.Numeric(18, 6), nullable=True) # Current P/B
    price_sales_ratio = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM P/S
    price_revenue_ttm = sa.Column(sa.Numeric(18, 6), nullable=True)
    price_sales_current = sa.Column(sa.Numeric(18, 6), nullable=True)
    price_cash_flow_current = sa.Column(sa.Numeric(18, 6), nullable=True)
    beta_3_year = sa.Column(sa.Numeric(10, 6), nullable=True)
    beta_5_year = sa.Column(sa.Numeric(10, 6), nullable=True)
    popularity = sa.Column(sa.Integer, nullable=True)
    popularity_rank = sa.Column(sa.Numeric(18, 15), nullable=True)
    local_popularity = sa.Column(JSON, nullable=True) # e.g., {"DE": 1, "IN": 1, "US": 5}
    local_popularity_rank = sa.Column(JSON, nullable=True) # e.g., {"US": 8.66...}
    number_of_employees = sa.Column(sa.Integer, nullable=True)
    number_of_shareholders = sa.Column(sa.Integer, nullable=True)

    # --- Valuation & Enterprise Value ---
    enterprise_value_current = sa.Column(sa.Numeric(20, 4), nullable=True)
    enterprise_value_ebitda_current = sa.Column(sa.Numeric(18, 6), nullable=True)
    enterprise_value_ebitda_ttm = sa.Column(sa.Numeric(18, 6), nullable=True)
    enterprise_value_fy = sa.Column(sa.Numeric(20, 4), nullable=True) # Last FY
    enterprise_value_ebitda_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    net_debt = sa.Column(sa.Numeric(20, 4), nullable=True)
    net_debt_fq = sa.Column(sa.Numeric(20, 4), nullable=True) # Last FQ/FH
    net_debt_fy = sa.Column(sa.Numeric(20, 4), nullable=True) # Last FY
    net_debt_to_ebitda_fy = sa.Column(sa.Numeric(18, 6), nullable=True)
    net_debt_to_ebitda_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH

    # --- Per Share Data (Current/TTM/Most Recent) ---
    earnings_per_share_diluted_ttm = sa.Column(sa.Numeric(18, 4), nullable=True)
    earnings_per_share_diluted_fq = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FQ/FH
    earnings_per_share_basic_fq = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FQ/FH
    earnings_per_share_diluted_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FY
    earnings_per_share_basic_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FY
    book_value_per_share_fq = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FQ/FH
    book_value_per_share_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FY
    book_tangible_per_share_fq = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FQ/FH
    book_tangible_per_share_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FY
    revenue_per_share_ttm = sa.Column(sa.Numeric(18, 4), nullable=True)
    revenue_per_share_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FY
    operating_cash_flow_per_share = sa.Column(sa.Numeric(18, 4), nullable=True) # TTM
    free_cash_flow_per_share_fq = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FQ/FH
    free_cash_flow_per_share_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FY
    dps_common_stock_prim_issue_ttm = sa.Column(sa.Numeric(18, 4), nullable=True) # Dividend Per Share
    dps_common_stock_prim_issue_fq = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FQ/FH

    # --- Profitability & Margins (Current/TTM/Most Recent) ---
    net_margin = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM
    net_margin_ttm = sa.Column(sa.Numeric(18, 6), nullable=True)
    net_margin_current = sa.Column(sa.Numeric(18, 6), nullable=True) # Most recent period (FQ/FH)
    net_margin_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    net_margin_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    pre_tax_margin = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM
    pre_tax_margin_ttm = sa.Column(sa.Numeric(18, 6), nullable=True)
    pre_tax_margin_current = sa.Column(sa.Numeric(18, 6), nullable=True) # Most recent period
    pre_tax_margin_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    pre_tax_margin_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    operating_margin = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM
    operating_margin_ttm = sa.Column(sa.Numeric(18, 6), nullable=True)
    operating_margin_current = sa.Column(sa.Numeric(18, 6), nullable=True) # Most recent period
    operating_margin_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    operating_margin_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    gross_margin = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM
    gross_margin_ttm = sa.Column(sa.Numeric(18, 6), nullable=True)
    gross_margin_current = sa.Column(sa.Numeric(18, 6), nullable=True) # Most recent period
    gross_margin_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    gross_margin_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    ebitda_margin_current = sa.Column(sa.Numeric(18, 6), nullable=True) # Most recent period
    ebitda_margin_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    ebitda_margin_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY

    # --- Returns (Current/TTM/Most Recent) ---
    return_on_equity = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM
    return_on_equity_current = sa.Column(sa.Numeric(18, 6), nullable=True) # Most recent period
    return_on_equity_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    return_on_equity_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    return_on_assets = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM
    return_on_assets_current = sa.Column(sa.Numeric(18, 6), nullable=True) # Most recent period
    return_on_assets_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    return_on_assets_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    return_on_invested_capital = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM
    return_on_invested_capital_current = sa.Column(sa.Numeric(18, 6), nullable=True) # Most recent period
    return_on_invested_capital_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    return_on_invested_capital_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    return_on_tang_equity_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    return_on_tang_equity_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    return_on_tang_assets_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    return_on_tang_assets_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    return_on_total_capital_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    return_on_total_capital_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    return_on_capital_employed_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    return_on_capital_employed_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY

    # --- Income Statement (TTM/Most Recent) ---
    total_revenue_ttm = sa.Column(sa.BigInteger, nullable=True)
    total_revenue_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_revenue_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    cost_of_goods_ttm = sa.Column(sa.BigInteger, nullable=True)
    cost_of_goods_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    cost_of_goods_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    cost_of_goods_excl_dep_amort_ttm = sa.Column(sa.BigInteger, nullable=True)
    cost_of_goods_excl_dep_amort_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    cost_of_goods_excl_dep_amort_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    gross_profit_ttm = sa.Column(sa.BigInteger, nullable=True)
    gross_profit_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    gross_profit_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    total_oper_expense_ttm = sa.Column(sa.BigInteger, nullable=True)
    total_oper_expense_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_oper_expense_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    operating_expenses_ttm = sa.Column(sa.BigInteger, nullable=True) # Specific to VSEC
    operating_expenses_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    operating_expenses_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    sell_gen_admin_exp_total_ttm = sa.Column(sa.BigInteger, nullable=True)
    sell_gen_admin_exp_total_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    sell_gen_admin_exp_total_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    sell_gen_admin_exp_other_ttm = sa.Column(sa.BigInteger, nullable=True)
    sell_gen_admin_exp_other_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    sell_gen_admin_exp_other_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_oper_expense_total_ttm = sa.Column(sa.BigInteger, nullable=True)
    other_oper_expense_total_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_oper_expense_total_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    oper_income_ttm = sa.Column(sa.BigInteger, nullable=True)
    oper_income_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    oper_income_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    ebit_ttm = sa.Column(sa.BigInteger, nullable=True)
    ebit_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    ebit_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    ebitda_ttm = sa.Column(sa.BigInteger, nullable=True)
    ebitda_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    ebitda_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    dep_amort_exp_income_s_ttm = sa.Column(sa.BigInteger, nullable=True)
    dep_amort_exp_income_s_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    dep_amort_exp_income_s_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    depreciation_depletion_ttm = sa.Column(sa.BigInteger, nullable=True)
    depreciation_depletion_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    depreciation_depletion_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    amortization_ttm = sa.Column(sa.BigInteger, nullable=True)
    amortization_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    amortization_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    amortization_of_intangibles_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    amortization_of_deferred_charges_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    non_oper_income_ttm = sa.Column(sa.BigInteger, nullable=True)
    non_oper_income_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    non_oper_income_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    non_oper_interest_income_ttm = sa.Column(sa.BigInteger, nullable=True)
    non_oper_interest_income_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    non_oper_interest_income_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    interest_income_ttm = sa.Column(sa.BigInteger, nullable=True)
    interest_income_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    non_oper_interest_exp_ttm = sa.Column(sa.BigInteger, nullable=True)
    non_oper_interest_exp_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    non_oper_interest_exp_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    interest_expense_ttm = sa.Column(sa.BigInteger, nullable=True)
    interest_expense_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    interest_expense_on_debt_ttm = sa.Column(sa.BigInteger, nullable=True)
    interest_expense_on_debt_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    interest_expense_on_debt_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_income_ttm = sa.Column(sa.BigInteger, nullable=True)
    other_income_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_income_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    total_non_oper_income_ttm = sa.Column(sa.BigInteger, nullable=True)
    total_non_oper_income_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_non_oper_income_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    pretax_income_ttm = sa.Column(sa.BigInteger, nullable=True)
    pretax_income_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    pretax_income_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    income_tax_ttm = sa.Column(sa.BigInteger, nullable=True)
    income_tax_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    income_tax_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    income_tax_current_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    income_tax_current_domestic_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    income_tax_current_foreign_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    income_tax_deferred_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    income_tax_deferred_domestic_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    income_tax_deferred_foreign_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    income_tax_credits_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    equity_in_earnings_ttm = sa.Column(sa.BigInteger, nullable=True)
    equity_in_earnings_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    equity_in_earnings_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    pretax_equity_in_earnings_ttm = sa.Column(sa.BigInteger, nullable=True)
    pretax_equity_in_earnings_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    pretax_equity_in_earnings_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    net_income_bef_disc_oper_ttm = sa.Column(sa.BigInteger, nullable=True)
    net_income_bef_disc_oper_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    net_income_bef_disc_oper_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    discontinued_operations_ttm = sa.Column(sa.BigInteger, nullable=True)
    discontinued_operations_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    discontinued_operations_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    net_income_ttm = sa.Column(sa.BigInteger, nullable=True)
    net_income_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    net_income_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    diluted_net_income_ttm = sa.Column(sa.BigInteger, nullable=True)
    diluted_net_income_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    diluted_net_income_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    net_income_starting_line_ttm = sa.Column(sa.BigInteger, nullable=True)
    net_income_starting_line_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    net_income_starting_line_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    minority_interest_exp_ttm = sa.Column(sa.BigInteger, nullable=True)
    minority_interest_exp_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    minority_interest_exp_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    unusual_expense_inc_ttm = sa.Column(sa.BigInteger, nullable=True)
    unusual_expense_inc_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    unusual_expense_inc_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    restructuring_charge_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_exceptional_charges_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    total_extra_items_ttm = sa.Column(sa.BigInteger, nullable=True)
    total_extra_items_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_extra_items_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    after_tax_other_income_ttm = sa.Column(sa.BigInteger, nullable=True)
    after_tax_other_income_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    after_tax_other_income_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    preferred_dividends_ttm = sa.Column(sa.BigInteger, nullable=True)
    preferred_dividends_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    preferred_dividends_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY

    # --- Balance Sheet (Most Recent - FQ/FH or FY) ---
    total_assets = sa.Column(sa.BigInteger, nullable=True)
    total_assets_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_assets_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    total_current_assets = sa.Column(sa.BigInteger, nullable=True)
    total_current_assets_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_current_assets_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    cash_n_equivalents = sa.Column(sa.BigInteger, nullable=True)
    cash_n_equivalents_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    cash_n_equivalents_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    cash_n_short_term_invest = sa.Column(sa.BigInteger, nullable=True)
    cash_n_short_term_invest_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    cash_n_short_term_invest_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    short_term_invest = sa.Column(sa.BigInteger, nullable=True)
    short_term_invest_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    short_term_invest_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    total_receivables_net = sa.Column(sa.BigInteger, nullable=True)
    total_receivables_net_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_receivables_net_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    accounts_receivables_net = sa.Column(sa.BigInteger, nullable=True) # VSEC/AT specific?
    accounts_receivables_net_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    accounts_receivables_net_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    accounts_receivables_gross_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    doubtful_accounts_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_receivables = sa.Column(sa.BigInteger, nullable=True) # VSEC/AT specific?
    other_receivables_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_receivables_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    total_inventory = sa.Column(sa.BigInteger, nullable=True)
    total_inventory_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_inventory_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    inventory_finished_goods = sa.Column(sa.BigInteger, nullable=True)
    inventory_finished_goods_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    inventory_finished_goods_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    inventory_work_in_progress = sa.Column(sa.BigInteger, nullable=True)
    inventory_work_in_progress_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    inventory_work_in_progress_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    inventory_raw_materials = sa.Column(sa.BigInteger, nullable=True)
    inventory_raw_materials_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    inventory_raw_materials_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    inventory_progress_payments = sa.Column(sa.BigInteger, nullable=True) # VSEC/AT specific?
    inventory_progress_payments_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    inventory_progress_payments_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    prepaid_expenses = sa.Column(sa.BigInteger, nullable=True) # VSEC/AT specific?
    prepaid_expenses_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_current_assets_total = sa.Column(sa.BigInteger, nullable=True)
    other_current_assets_total_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_current_assets_total_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    total_non_current_assets = sa.Column(sa.BigInteger, nullable=True)
    total_non_current_assets_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_non_current_assets_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    ppe_total_net = sa.Column(sa.BigInteger, nullable=True)
    ppe_total_net_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    ppe_total_net_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    ppe_total_gross = sa.Column(sa.BigInteger, nullable=True)
    ppe_total_gross_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    ppe_total_gross_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    ppe_gross_land_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    ppe_gross_buildings_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    ppe_gross_machinery_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    ppe_gross_comp_soft_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    ppe_gross_other_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    accum_deprec_total = sa.Column(sa.BigInteger, nullable=True)
    accum_deprec_total_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    accum_deprec_total_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    accum_deprec_other_intang_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    goodwill = sa.Column(sa.BigInteger, nullable=True)
    goodwill_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    goodwill_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    goodwill_gross_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    intangibles_net = sa.Column(sa.BigInteger, nullable=True)
    intangibles_net_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    intangibles_net_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_intangibles_net = sa.Column(sa.BigInteger, nullable=True) # VSEC/AT specific?
    other_intangibles_net_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_intangibles_net_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_intangibles_gross_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    long_term_investments = sa.Column(sa.BigInteger, nullable=True)
    long_term_investments_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    long_term_investments_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    investments_in_unconcsolidate = sa.Column(sa.BigInteger, nullable=True)
    investments_in_unconcsolidate_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    investments_in_unconcsolidate_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_investments = sa.Column(sa.BigInteger, nullable=True)
    other_investments_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_investments_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    long_term_note_receivable = sa.Column(sa.BigInteger, nullable=True) # VSEC/AT specific?
    long_term_note_receivable_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    deferred_tax_assests = sa.Column(sa.BigInteger, nullable=True)
    deferred_tax_assests_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    deferred_tax_assests_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    deferred_charges = sa.Column(sa.BigInteger, nullable=True)
    deferred_charges_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    deferred_charges_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    long_term_other_assets_total = sa.Column(sa.BigInteger, nullable=True)
    long_term_other_assets_total_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    long_term_other_assets_total_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    total_liabilities = sa.Column(sa.BigInteger, nullable=True)
    total_liabilities_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_liabilities_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    total_current_liabilities = sa.Column(sa.BigInteger, nullable=True)
    total_current_liabilities_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_current_liabilities_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    accounts_payable = sa.Column(sa.BigInteger, nullable=True)
    accounts_payable_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    accounts_payable_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    accrued_expenses = sa.Column(sa.BigInteger, nullable=True)
    accrued_expenses_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    accrued_payroll = sa.Column(sa.BigInteger, nullable=True) # VSEC/AT specific?
    accrued_payroll_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    accrued_payroll_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    short_term_debt = sa.Column(sa.BigInteger, nullable=True)
    short_term_debt_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    short_term_debt_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    short_term_debt_excl_current_port = sa.Column(sa.BigInteger, nullable=True) # VSEC/AT specific?
    short_term_debt_excl_current_port_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    short_term_debt_excl_current_port_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_short_term_debt_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    current_port_debt_capital_leases = sa.Column(sa.BigInteger, nullable=True) # VSEC/AT specific?
    current_port_debt_capital_leases_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    current_port_debt_capital_leases_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    income_tax_payable = sa.Column(sa.BigInteger, nullable=True)
    income_tax_payable_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    income_tax_payable_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    dividends_payable = sa.Column(sa.BigInteger, nullable=True)
    dividends_payable_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    deferred_income_current = sa.Column(sa.BigInteger, nullable=True)
    deferred_income_current_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    deferred_income_current_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_current_liabilities = sa.Column(sa.BigInteger, nullable=True)
    other_current_liabilities_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_current_liabilities_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    total_non_current_liabilities = sa.Column(sa.BigInteger, nullable=True)
    total_non_current_liabilities_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_non_current_liabilities_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    long_term_debt = sa.Column(sa.BigInteger, nullable=True)
    long_term_debt_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    long_term_debt_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    long_term_debt_excl_capital_lease = sa.Column(sa.BigInteger, nullable=True)
    long_term_debt_excl_capital_lease_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    long_term_debt_excl_capital_lease_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    capital_lease_obligations = sa.Column(sa.BigInteger, nullable=True)
    capital_lease_obligations_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    capital_lease_obligations_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    operating_lease_liabilities = sa.Column(sa.BigInteger, nullable=True)
    operating_lease_liabilities_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    operating_lease_liabilities_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    capital_operating_lease_obligations = sa.Column(sa.BigInteger, nullable=True)
    capital_operating_lease_obligations_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    capital_operating_lease_obligations_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    deferred_tax_liabilities = sa.Column(sa.BigInteger, nullable=True)
    deferred_tax_liabilities_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    deferred_tax_liabilities_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    deferred_income_non_current = sa.Column(sa.BigInteger, nullable=True)
    deferred_income_non_current_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    provision_f_risks = sa.Column(sa.BigInteger, nullable=True)
    provision_f_risks_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    provision_f_risks_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_liabilities_total = sa.Column(sa.BigInteger, nullable=True)
    other_liabilities_total_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_liabilities_total_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    total_equity = sa.Column(sa.BigInteger, nullable=True)
    total_equity_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_equity_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    common_equity_total = sa.Column(sa.BigInteger, nullable=True)
    common_equity_total_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    common_equity_total_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    shrhldrs_equity = sa.Column(sa.BigInteger, nullable=True) # Synonym for common_equity_total?
    shrhldrs_equity_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    shrhldrs_equity_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    common_stock_par = sa.Column(sa.BigInteger, nullable=True)
    common_stock_par_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    common_stock_par_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    additional_paid_in_capital = sa.Column(sa.BigInteger, nullable=True)
    additional_paid_in_capital_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    additional_paid_in_capital_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    paid_in_capital = sa.Column(sa.BigInteger, nullable=True) # VSEC/AT specific?
    paid_in_capital_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    paid_in_capital_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    retained_earnings = sa.Column(sa.BigInteger, nullable=True)
    retained_earnings_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    retained_earnings_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    treasury_stock_common = sa.Column(sa.BigInteger, nullable=True)
    treasury_stock_common_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    treasury_stock_common_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_common_equity = sa.Column(sa.BigInteger, nullable=True)
    other_common_equity_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_common_equity_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    preferred_stock_carrying_value = sa.Column(sa.BigInteger, nullable=True)
    preferred_stock_carrying_value_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    preferred_stock_carrying_value_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    minority_interest = sa.Column(sa.BigInteger, nullable=True)
    minority_interest_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    minority_interest_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    total_liabilities_shrhldrs_equity = sa.Column(sa.BigInteger, nullable=True)
    total_liabilities_shrhldrs_equity_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_liabilities_shrhldrs_equity_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    tangible_assets = sa.Column(sa.BigInteger, nullable=True) # Calculated: Total Assets - Goodwill - Intangibles
    tangible_assets_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    tangible_assets_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    working_capital = sa.Column(sa.BigInteger, nullable=True) # Calculated: Current Assets - Current Liabilities
    working_capital_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    working_capital_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    invested_capital = sa.Column(sa.BigInteger, nullable=True) # Calculated: Total Debt + Total Equity
    invested_capital_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    invested_capital_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY

    # --- Cash Flow (TTM/Most Recent) ---
    cash_f_operating_activities_ttm = sa.Column(sa.BigInteger, nullable=True)
    cash_f_operating_activities_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    cash_f_operating_activities_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    cash_flow_deprecation_n_amortization_ttm = sa.Column(sa.BigInteger, nullable=True)
    cash_flow_deprecation_n_amortization_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    cash_flow_deprecation_n_amortization_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    non_cash_items_ttm = sa.Column(sa.BigInteger, nullable=True)
    non_cash_items_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    non_cash_items_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    cash_flow_deferred_taxes_ttm = sa.Column(sa.BigInteger, nullable=True)
    cash_flow_deferred_taxes_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    cash_flow_deferred_taxes_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    changes_in_working_capital_ttm = sa.Column(sa.BigInteger, nullable=True)
    changes_in_working_capital_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    changes_in_working_capital_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    change_in_accounts_receivable_ttm = sa.Column(sa.BigInteger, nullable=True)
    change_in_accounts_receivable_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    change_in_accounts_receivable_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    change_in_inventories_ttm = sa.Column(sa.BigInteger, nullable=True)
    change_in_inventories_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    change_in_inventories_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    change_in_accounts_payable_ttm = sa.Column(sa.BigInteger, nullable=True)
    change_in_accounts_payable_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    change_in_accounts_payable_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    change_in_accrued_expenses_ttm = sa.Column(sa.BigInteger, nullable=True)
    change_in_accrued_expenses_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    change_in_accrued_expenses_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    change_in_other_assets_ttm = sa.Column(sa.BigInteger, nullable=True)
    change_in_other_assets_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    change_in_other_assets_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    cash_f_investing_activities_ttm = sa.Column(sa.BigInteger, nullable=True)
    cash_f_investing_activities_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    cash_f_investing_activities_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    capital_expenditures_ttm = sa.Column(sa.BigInteger, nullable=True)
    capital_expenditures_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    capital_expenditures_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    capital_expenditures_fixed_assets_ttm = sa.Column(sa.BigInteger, nullable=True)
    capital_expenditures_fixed_assets_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    capital_expenditures_fixed_assets_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    capital_expenditures_other_assets_ttm = sa.Column(sa.BigInteger, nullable=True)
    capital_expenditures_other_assets_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    capital_expenditures_other_assets_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    capital_expenditures_unchanged_ttm = sa.Column(sa.BigInteger, nullable=True)
    capital_expenditures_unchanged_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    capital_expenditures_unchanged_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    purchase_sale_investments_ttm = sa.Column(sa.BigInteger, nullable=True)
    purchase_sale_investments_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    purchase_sale_investments_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    purchase_of_investments_ttm = sa.Column(sa.BigInteger, nullable=True)
    purchase_of_investments_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    purchase_of_investments_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    sales_of_investments_ttm = sa.Column(sa.BigInteger, nullable=True)
    sales_of_investments_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    sales_of_investments_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    purchase_sale_business_ttm = sa.Column(sa.BigInteger, nullable=True)
    purchase_sale_business_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    purchase_sale_business_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    purchase_of_business_ttm = sa.Column(sa.BigInteger, nullable=True)
    purchase_of_business_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    purchase_of_business_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    sales_of_business_ttm = sa.Column(sa.BigInteger, nullable=True)
    sales_of_business_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    sales_of_business_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_investing_cash_flow_items_total_ttm = sa.Column(sa.BigInteger, nullable=True)
    other_investing_cash_flow_items_total_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_investing_cash_flow_items_total_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_investing_cash_flow_sources_ttm = sa.Column(sa.BigInteger, nullable=True)
    other_investing_cash_flow_sources_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_investing_cash_flow_sources_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_investing_cash_flow_uses_ttm = sa.Column(sa.BigInteger, nullable=True)
    other_investing_cash_flow_uses_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_investing_cash_flow_uses_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    cash_f_financing_activities_ttm = sa.Column(sa.BigInteger, nullable=True)
    cash_f_financing_activities_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    cash_f_financing_activities_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    issuance_of_debt_net_ttm = sa.Column(sa.BigInteger, nullable=True)
    issuance_of_debt_net_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    issuance_of_debt_net_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    issuance_of_long_term_debt_ttm = sa.Column(sa.BigInteger, nullable=True)
    issuance_of_long_term_debt_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    issuance_of_long_term_debt_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    reduction_of_long_term_debt_ttm = sa.Column(sa.BigInteger, nullable=True)
    reduction_of_long_term_debt_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    reduction_of_long_term_debt_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    supplying_of_long_term_debt_ttm = sa.Column(sa.BigInteger, nullable=True)
    supplying_of_long_term_debt_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    supplying_of_long_term_debt_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    issuance_of_short_term_debt_ttm = sa.Column(sa.BigInteger, nullable=True)
    issuance_of_short_term_debt_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    issuance_of_short_term_debt_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    issuance_of_stock_net_ttm = sa.Column(sa.BigInteger, nullable=True)
    issuance_of_stock_net_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    issuance_of_stock_net_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    purchase_of_stock_ttm = sa.Column(sa.BigInteger, nullable=True)
    purchase_of_stock_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    purchase_of_stock_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    sale_of_stock_ttm = sa.Column(sa.BigInteger, nullable=True)
    sale_of_stock_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    sale_of_stock_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    proceeds_from_stock_options_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_proceeds_from_stock_sales_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_proceeds_from_stock_sales_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    total_cash_dividends_paid_ttm = sa.Column(sa.BigInteger, nullable=True)
    total_cash_dividends_paid_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    total_cash_dividends_paid_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    common_dividends_cash_flow_ttm = sa.Column(sa.BigInteger, nullable=True)
    common_dividends_cash_flow_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    common_dividends_cash_flow_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    preferred_dividends_cash_flow_ttm = sa.Column(sa.BigInteger, nullable=True)
    preferred_dividends_cash_flow_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    preferred_dividends_cash_flow_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_financing_cash_flow_items_total_ttm = sa.Column(sa.BigInteger, nullable=True)
    other_financing_cash_flow_items_total_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_financing_cash_flow_items_total_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_financing_cash_flow_sources_ttm = sa.Column(sa.BigInteger, nullable=True)
    other_financing_cash_flow_sources_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_financing_cash_flow_sources_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    other_financing_cash_flow_uses_ttm = sa.Column(sa.BigInteger, nullable=True)
    other_financing_cash_flow_uses_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    other_financing_cash_flow_uses_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    net_chg_in_cash_ttm = sa.Column(sa.BigInteger, nullable=True)
    net_chg_in_cash_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    net_chg_in_cash_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    free_cash_flow_ttm = sa.Column(sa.BigInteger, nullable=True)
    free_cash_flow_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    free_cash_flow_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY
    funds_f_operations_ttm = sa.Column(sa.BigInteger, nullable=True)
    funds_f_operations_fq = sa.Column(sa.BigInteger, nullable=True) # Last FQ/FH
    funds_f_operations_fy = sa.Column(sa.BigInteger, nullable=True) # Last FY

    # --- Ratios & Other Metrics (Current/TTM/Most Recent) ---
    debt_to_equity = sa.Column(sa.Numeric(18, 6), nullable=True) # Current
    debt_to_equity_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    debt_to_equity_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    long_term_debt_to_equity = sa.Column(sa.Numeric(18, 6), nullable=True) # Current
    long_term_debt_to_equity_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    long_term_debt_to_equity_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    debt_to_asset = sa.Column(sa.Numeric(18, 6), nullable=True) # Current
    debt_to_asset_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    debt_to_asset_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    long_term_debt_to_assets = sa.Column(sa.Numeric(18, 6), nullable=True) # Current
    long_term_debt_to_assets_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    long_term_debt_to_assets_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    total_debt_to_capital = sa.Column(sa.Numeric(18, 6), nullable=True) # Current
    total_debt_to_capital_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    total_debt_to_capital_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    current_ratio = sa.Column(sa.Numeric(18, 6), nullable=True) # Current
    current_ratio_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    current_ratio_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    quick_ratio = sa.Column(sa.Numeric(18, 6), nullable=True) # Current
    quick_ratio_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    quick_ratio_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    asset_turnover = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM
    asset_turnover_current = sa.Column(sa.Numeric(18, 6), nullable=True) # Most recent period
    asset_turnover_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    asset_turnover_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    fixed_assets_turnover = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM
    fixed_assets_turnover_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    fixed_assets_turnover_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    invent_turnover = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM
    invent_turnover_current = sa.Column(sa.Numeric(18, 6), nullable=True) # Most recent period
    invent_turnover_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    invent_turnover_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    receivables_turnover = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM
    receivables_turnover_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    receivables_turnover_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    total_assets_to_equity = sa.Column(sa.Numeric(18, 6), nullable=True) # Current
    total_assets_to_equity_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    total_assets_to_equity_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    interst_cover = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM EBIT / Interest Exp
    interst_cover_ttm = sa.Column(sa.Numeric(18, 6), nullable=True)
    interst_cover_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    ebitda_interst_cover = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM EBITDA / Interest Exp
    ebitda_interst_cover_ttm = sa.Column(sa.Numeric(18, 6), nullable=True)
    ebitda_interst_cover_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    ebitda_less_capex_interst_cover = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM (EBITDA - CapEx) / Interest Exp
    ebitda_less_capex_interst_cover_ttm = sa.Column(sa.Numeric(18, 6), nullable=True)
    ebitda_less_capex_interst_cover_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    dividend_payout_ratio = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM
    dividend_payout_ratio_ttm = sa.Column(sa.Numeric(18, 6), nullable=True)
    dividend_payout_ratio_current = sa.Column(sa.Numeric(18, 6), nullable=True) # Most recent period
    dividend_payout_ratio_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH
    dividend_payout_ratio_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    dividend_payout_ratio_percent_fq = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FQ/FH (as %)
    dividend_payout_ratio_percent_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY (as %)
    cash_dividend_coverage_ratio = sa.Column(sa.Numeric(18, 6), nullable=True) # TTM FCF / Dividends Paid
    cash_dividend_coverage_ratio_ttm = sa.Column(sa.Numeric(18, 6), nullable=True)
    cash_dividend_coverage_ratio_fy = sa.Column(sa.Numeric(18, 6), nullable=True) # Last FY
    revenue_per_employee = sa.Column(sa.Numeric(18, 4), nullable=True) # TTM
    revenue_per_employee_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FY
    net_income_per_employee = sa.Column(sa.Numeric(18, 4), nullable=True) # TTM
    net_income_per_employee_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FY
    oper_income_per_employee = sa.Column(sa.Numeric(18, 4), nullable=True) # TTM
    oper_income_per_employee_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FY
    ebitda_per_employee = sa.Column(sa.Numeric(18, 4), nullable=True) # TTM
    ebitda_per_employee_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FY
    free_cash_flow_per_employee = sa.Column(sa.Numeric(18, 4), nullable=True) # TTM
    free_cash_flow_per_employee_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FY
    total_assets_per_employee = sa.Column(sa.Numeric(18, 4), nullable=True) # Current
    total_assets_per_employee_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FY
    total_debt_per_employee = sa.Column(sa.Numeric(18, 4), nullable=True) # Current
    total_debt_per_employee_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Last FY

    # --- Dividends ---
    amount_upcoming = sa.Column(sa.Numeric(18, 8), nullable=True)
    payment_date_upcoming = sa.Column(sa.DateTime, nullable=True)
    ex_dividend_date_upcoming = sa.Column(sa.DateTime, nullable=True)
    amount_recent = sa.Column(sa.Numeric(18, 8), nullable=True)
    payment_date_recent = sa.Column(sa.DateTime, nullable=True)
    ex_dividend_date_recent = sa.Column(sa.DateTime, nullable=True)
    dividend_type = sa.Column(JSON, nullable=True) # From dividend_type_h (stored as JSON array)

    # --- Analyst Estimates & Targets ---
    price_target_average = sa.Column(sa.Numeric(18, 4), nullable=True)
    price_target_median = sa.Column(sa.Numeric(18, 4), nullable=True)
    price_target_high = sa.Column(sa.Numeric(18, 4), nullable=True)
    price_target_low = sa.Column(sa.Numeric(18, 4), nullable=True)
    price_target_estimates_num = sa.Column(sa.Integer, nullable=True)
    price_target_date = sa.Column(sa.Date, nullable=True)
    recommendation_mark = sa.Column(sa.Numeric(4, 1), nullable=True) # e.g., 1.5
    recommendation_buy = sa.Column(sa.Integer, nullable=True)
    recommendation_hold = sa.Column(sa.Integer, nullable=True)
    recommendation_sell = sa.Column(sa.Integer, nullable=True)
    recommendation_under = sa.Column(sa.Integer, nullable=True)
    recommendation_over = sa.Column(sa.Integer, nullable=True)
    recommendation_total = sa.Column(sa.Integer, nullable=True)
    recommendation_date = sa.Column(sa.Date, nullable=True)
    earnings_per_share_forecast_fy = sa.Column(sa.Numeric(18, 4), nullable=True) # Current FY forecast
    earnings_per_share_forecast_next_fy = sa.Column(sa.Numeric(18, 4), nullable=True)
    earnings_per_share_forecast_fq = sa.Column(sa.Numeric(18, 4), nullable=True) # Next FQ/FH forecast
    revenue_forecast_fy = sa.Column(sa.BigInteger, nullable=True) # Current FY forecast
    revenue_forecast_next_fy = sa.Column(sa.BigInteger, nullable=True)
    revenue_forecast_fq = sa.Column(sa.BigInteger, nullable=True) # Next FQ/FH forecast

    # --- Daily Bar Data (Flattened) ---
    daily_bar_close = sa.Column(sa.Numeric(18, 4), nullable=True)
    daily_bar_high = sa.Column(sa.Numeric(18, 4), nullable=True)
    daily_bar_low = sa.Column(sa.Numeric(18, 4), nullable=True)
    daily_bar_open = sa.Column(sa.Numeric(18, 4), nullable=True)
    daily_bar_volume = sa.Column(sa.BigInteger, nullable=True)
    daily_bar_time = sa.Column(sa.DateTime, nullable=True) # Assuming conversion from timestamp
    daily_bar_update_time = sa.Column(sa.DateTime, nullable=True) # Assuming conversion from timestamp
    daily_bar_data_update_time = sa.Column(sa.DateTime, nullable=True) # Assuming conversion from timestamp

    # --- Rates (Flattened) ---
    rates_cf_time = sa.Column(sa.DateTime, nullable=True)
    rates_cf_to_usd = sa.Column(sa.Numeric(18, 8), nullable=True)
    rates_cf_to_eur = sa.Column(sa.Numeric(18, 8), nullable=True)
    # ... other currencies from rates_cf ...
    rates_fq_time = sa.Column(sa.DateTime, nullable=True)
    rates_fq_to_usd = sa.Column(sa.Numeric(18, 8), nullable=True)
    # ... other currencies from rates_fq ...
    rates_fy_time = sa.Column(sa.DateTime, nullable=True)
    rates_fy_to_usd = sa.Column(sa.Numeric(18, 8), nullable=True)
    # ... other currencies from rates_fy ...
    rates_fh_time = sa.Column(sa.DateTime, nullable=True) # From BE/USU json
    rates_fh_to_usd = sa.Column(sa.Numeric(18, 8), nullable=True) # From BE/USU json
    # ... other currencies from rates_fh ...
    rates_pt_to_usd = sa.Column(sa.Numeric(18, 8), nullable=True) # From BE/USU json
    # ... other currencies from rates_pt ...
    rates_dividend_upcoming_to_usd = sa.Column(sa.Numeric(18, 8), nullable=True)
    rates_dividend_recent_to_usd = sa.Column(sa.Numeric(18, 8), nullable=True)

    # --- Metadata & Availability ---
    fiscal_period_fy = sa.Column(sa.String(10), nullable=True) # e.g., "2024"
    fiscal_period_fq = sa.Column(sa.String(10), nullable=True) # e.g., "2024-Q4", "2024-H2"
    fiscal_period_fh = sa.Column(sa.String(10), nullable=True) # e.g., "2024-H2"
    fiscal_period_end_fy = sa.Column(sa.DateTime, nullable=True)
    fiscal_period_end_fq = sa.Column(sa.DateTime, nullable=True) # FQ or FH
    fiscal_period_end_fh = sa.Column(sa.DateTime, nullable=True)
    earnings_release_date_fy = sa.Column(sa.DateTime, nullable=True)
    earnings_release_date_fq = sa.Column(sa.DateTime, nullable=True) # FQ or FH
    earnings_release_trading_date_fy = sa.Column(sa.DateTime, nullable=True)
    earnings_release_trading_date_fq = sa.Column(sa.DateTime, nullable=True) # FQ or FH
    earnings_release_next_date_fy = sa.Column(sa.DateTime, nullable=True)
    earnings_release_next_date_fq = sa.Column(sa.DateTime, nullable=True) # FQ or FH
    earnings_release_next_trading_date_fy = sa.Column(sa.DateTime, nullable=True)
    earnings_release_next_trading_date_fq = sa.Column(sa.DateTime, nullable=True) # FQ or FH
    earnings_release_calendar_date = sa.Column(sa.DateTime, nullable=True) # VSEC specific?
    earnings_release_calendar_date_fq = sa.Column(sa.DateTime, nullable=True) # VSEC specific?
    earnings_release_next_calendar_date = sa.Column(sa.DateTime, nullable=True) # VSEC specific?
    earnings_release_next_calendar_date_fq = sa.Column(sa.DateTime, nullable=True) # VSEC specific?
    earnings_publication_type_fy = sa.Column(sa.Integer, nullable=True)
    earnings_publication_type_fq = sa.Column(sa.Integer, nullable=True) # FQ or FH
    earnings_publication_type_next_fy = sa.Column(sa.Integer, nullable=True)
    earnings_publication_type_next_fq = sa.Column(sa.Integer, nullable=True) # FQ or FH
    financials_availability = sa.Column(sa.Integer, nullable=True)
    earnings_availability = sa.Column(sa.Integer, nullable=True)
    dividends_availability = sa.Column(sa.Integer, nullable=True)
    last_report_frequency = sa.Column(sa.Integer, nullable=True) # 4 for quarterly, 2 for semi-annual
    report_type = sa.Column(sa.String(50), nullable=True) # e.g., "industrial", "other"
    currency = sa.Column(sa.String(3), nullable=True) # e.g., "USD", "EUR"
    currency_id = sa.Column(sa.String(3), nullable=True)
    currency_fund = sa.Column(sa.String(3), nullable=True)

    # --- Fields needing JSON or complex handling (Examples) ---
    # These often contain arrays of objects or structures that vary.
    revenue_seg_by_region_h = sa.Column(JSON, nullable=True)
    revenue_seg_by_business_h = sa.Column(JSON, nullable=True)
    earnings_fq_h = sa.Column(JSON, nullable=True) # Array of objects
    revenues_fq_h = sa.Column(JSON, nullable=True) # Array of objects
    revenues_fy_h = sa.Column(JSON, nullable=True) # Array of objects
    earnings_fy_h = sa.Column(JSON, nullable=True) # Array of objects

    # --- Relationship to Historical Data ---
    historical_data = relationship("HistoricalFinancialData", back_populates="company")

    def __repr__(self):
        return f"<CompanyFinancials(isin='{self.isin}', symbol='{self.symbol}')>"


class HistoricalFinancialData(Base):
    """Stores historical time series data points for a company (MySQL/MariaDB compatible)."""
    __tablename__ = 'historical_financial_data'

    id = sa.Column(sa.Integer, primary_key=True) # Auto-incrementing ID
    company_isin = sa.Column(sa.String(12), sa.ForeignKey('company_financials.isin'), index=True, nullable=False)
    period_type = sa.Column(sa.Enum('FY', 'FQ', 'FH', name='period_type_enum'), nullable=False) # Fiscal Year, Quarter, Half-year
    period_end_date = sa.Column(sa.Date, nullable=False) # Date marking the end of the period
    fiscal_period_label = sa.Column(sa.String(20), nullable=False, index=True) # e.g., "2023", "2023-Q4", "2023-H2"

    # --- Add columns for each field found with '_h' suffix in JSON ---
    # --- Balance Sheet History ---
    total_assets = sa.Column(sa.BigInteger, nullable=True)
    total_liabilities = sa.Column(sa.BigInteger, nullable=True)
    total_equity = sa.Column(sa.BigInteger, nullable=True)
    common_equity_total = sa.Column(sa.BigInteger, nullable=True)
    shrhldrs_equity = sa.Column(sa.BigInteger, nullable=True)
    total_debt = sa.Column(sa.BigInteger, nullable=True)
    long_term_debt = sa.Column(sa.BigInteger, nullable=True)
    short_term_debt = sa.Column(sa.BigInteger, nullable=True)
    cash_n_equivalents = sa.Column(sa.BigInteger, nullable=True)
    cash_n_short_term_invest = sa.Column(sa.BigInteger, nullable=True)
    total_receivables_net = sa.Column(sa.BigInteger, nullable=True)
    total_inventory = sa.Column(sa.BigInteger, nullable=True)
    ppe_total_net = sa.Column(sa.BigInteger, nullable=True)
    intangibles_net = sa.Column(sa.BigInteger, nullable=True)
    goodwill = sa.Column(sa.BigInteger, nullable=True)
    # ... add other historical balance sheet items as needed ...

    # --- Income Statement History ---
    total_revenue = sa.Column(sa.BigInteger, nullable=True)
    gross_profit = sa.Column(sa.BigInteger, nullable=True)
    total_oper_expense = sa.Column(sa.BigInteger, nullable=True)
    oper_income = sa.Column(sa.BigInteger, nullable=True)
    ebit = sa.Column(sa.BigInteger, nullable=True)
    ebitda = sa.Column(sa.BigInteger, nullable=True)
    pretax_income = sa.Column(sa.BigInteger, nullable=True)
    income_tax = sa.Column(sa.BigInteger, nullable=True)
    net_income = sa.Column(sa.BigInteger, nullable=True)
    diluted_net_income = sa.Column(sa.BigInteger, nullable=True)
    # ... add other historical income statement items ...

    # --- Cash Flow History ---
    cash_f_operating_activities = sa.Column(sa.BigInteger, nullable=True)
    cash_f_investing_activities = sa.Column(sa.BigInteger, nullable=True)
    cash_f_financing_activities = sa.Column(sa.BigInteger, nullable=True)
    free_cash_flow = sa.Column(sa.BigInteger, nullable=True)
    capital_expenditures = sa.Column(sa.BigInteger, nullable=True)
    total_cash_dividends_paid = sa.Column(sa.BigInteger, nullable=True)
    # ... add other historical cash flow items ...

    # --- Per Share History ---
    earnings_per_share_diluted = sa.Column(sa.Numeric(18, 4), nullable=True)
    earnings_per_share_basic = sa.Column(sa.Numeric(18, 4), nullable=True)
    book_value_per_share = sa.Column(sa.Numeric(18, 4), nullable=True)
    dps_common_stock_prim_issue = sa.Column(sa.Numeric(18, 4), nullable=True)
    total_shares_outstanding = sa.Column(sa.BigInteger, nullable=True)
    basic_shares_outstanding = sa.Column(sa.BigInteger, nullable=True)
    diluted_shares_outstanding = sa.Column(sa.BigInteger, nullable=True)
    float_shares_outstanding = sa.Column(sa.Numeric(20, 4), nullable=True)
    # ... add other historical per share items ...

    # --- Ratio History ---
    price_sales = sa.Column(sa.Numeric(18, 6), nullable=True)
    price_book = sa.Column(sa.Numeric(18, 6), nullable=True)
    price_earnings = sa.Column(sa.Numeric(18, 6), nullable=True)
    price_cash_flow = sa.Column(sa.Numeric(18, 6), nullable=True)
    dividend_yield = sa.Column(sa.Numeric(18, 6), nullable=True)
    dividend_payout_ratio = sa.Column(sa.Numeric(18, 6), nullable=True)
    ebitda_margin = sa.Column(sa.Numeric(18, 6), nullable=True)
    operating_margin = sa.Column(sa.Numeric(18, 6), nullable=True)
    net_margin = sa.Column(sa.Numeric(18, 6), nullable=True)
    return_on_equity = sa.Column(sa.Numeric(18, 6), nullable=True)
    return_on_assets = sa.Column(sa.Numeric(18, 6), nullable=True)
    return_on_invested_capital = sa.Column(sa.Numeric(18, 6), nullable=True)
    debt_to_equity = sa.Column(sa.Numeric(18, 6), nullable=True)
    long_term_debt_to_equity = sa.Column(sa.Numeric(18, 6), nullable=True)
    debt_to_asset = sa.Column(sa.Numeric(18, 6), nullable=True)
    long_term_debt_to_assets = sa.Column(sa.Numeric(18, 6), nullable=True)
    enterprise_value_ebitda = sa.Column(sa.Numeric(18, 6), nullable=True)
    # ... add other historical ratios ...

    # --- Other Historical ---
    number_of_employees = sa.Column(sa.Integer, nullable=True)
    # ... add any other relevant historical fields ...

    # --- Relationship back to Company ---
    company = relationship("CompanyFinancials", back_populates="historical_data")

    # --- Constraints ---
    __table_args__ = (
        sa.UniqueConstraint('company_isin', 'fiscal_period_label', name='uq_historical_period'),
    )

    def __repr__(self):
        return f"<HistoricalFinancialData(isin='{self.company_isin}', period='{self.fiscal_period_label}')>"



# Database configuration - adjust as needed
DB_URL = "sqlite:///tradingview.db"  # Default to SQLite for ease of setup
# Uncomment and configure for MySQL/MariaDB
# DB_URL = "mysql+mysqlconnector://username:password@localhost:3306/tradingview"

# Create database engine and session factory
engine = create_engine(DB_URL)
session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)

# Create tables if they don't exist
Base.metadata.create_all(engine)