"""New read-only adapter for the recovered accounts/positions/dispositions schema."""
from pathlib import Path
from decimal import Decimal, localcontext
import sqlite3
from infinbot_common import Rejected, number, instant, timestamp, readonly_db


def performance(rows):
    values=[number(r['economic_pnl']) for r in rows]
    wins=sum(v>0 for v in values);losses=sum(v<0 for v in values)
    profits=sum((v for v in values if v>0),Decimal(0));gross_losses=-sum((v for v in values if v<0),Decimal(0))
    return {'closed_dispositions':len(values),'wins':wins,'losses':losses,'breakeven':sum(v==0 for v in values),
            'win_rate_pct':str(Decimal(wins)*100/len(values)) if values else None,
            'gross_profits':str(profits),'gross_losses':str(gross_losses),'net_pnl':str(profits-gross_losses),
            'live_executions_verified':False}


def read_snapshot(path):
    try:
        with readonly_db(path) as c, localcontext() as ctx:
            ctx.prec=80
            account=c.execute('SELECT * FROM accounts WHERE id=1').fetchone()
            if account is None:raise Rejected('No recorded account; no funding default')
            account=dict(account)
            if account['halted'] not in (0,1):raise Rejected('Invalid recorded halt state')
            cash=number(account['cash']);number(account['session_equity'],True);instant(account['started_at'])
            if cash<0:raise Rejected('Borrowed/negative cash requires a different reviewed ledger adapter')
            positions=[dict(r) for r in c.execute('SELECT * FROM positions')]
            value=Decimal(0)
            for row in positions:
                quantity=number(row['quantity'],True);mark=number(row['mark'],True)
                if not row['symbol']:raise Rejected('Missing position symbol')
                instant(row['quote_at']);value+=quantity*mark
            rows=c.execute('SELECT d.*,o.execution_tag FROM dispositions d LEFT JOIN orders o ON o.id=d.sell_order_id').fetchall()
            dispositions=[]
            for record in rows:
                row=dict(record)
                if not isinstance(row['execution_tag'],str) or not row['execution_tag'].strip():raise Rejected('Missing recorded worker attribution')
                if instant(row['sold_at'])<instant(row['acquired_at']):raise Rejected('Reversed disposition dates')
                if number(row['economic_pnl'])!=number(row['proceeds'])-number(row['basis']):raise Rejected('Disposition arithmetic mismatch')
                dispositions.append(row)
            origin='RECORDED_LOCAL_SIMULATION_UNVERIFIED_PROVENANCE'
            if c.execute("SELECT 1 FROM sqlite_master WHERE name='sandbox_core_metadata'").fetchone():origin='SYNTHETIC_FIXTURE'
            return {'observed_at':timestamp(),'database_path':str(Path(path).resolve()),'account':account,
                    'positions':positions,'dispositions':dispositions,'cash':str(cash),'equity':str(cash+value),
                    'open_market_value':str(value),'data_origin':origin,'live_clearance_granted':False}
    except (sqlite3.Error,ValueError,KeyError,TypeError,OSError):
        raise Rejected('Current ledger missing, incompatible or unreconciled; no fallback data') from None
