"""InFinBot bounded lifetime and durable zero-entry allocation."""
from datetime import datetime,timezone
from decimal import Decimal
import os
import time
from infinbot_common import Rejected,number
from risk_state import RiskState


class WorkerControls:
    def __init__(self,timeout_hours=6,*,clock=time.monotonic,state_path=None):
        hours=number(timeout_hours,True)
        if hours>6:raise Rejected('Worker lifetime must be at most six hours')
        self.clock=clock;self.deadline=clock()+float(hours)*3600
        path=state_path or os.environ.get('INFINBOT_RISK_STATE')
        if not path:raise Rejected('Existing persistent INFINBOT_RISK_STATE required')
        self.state=RiskState(path)

    def check_countdown_lifeline(self):
        if self.clock()>=self.deadline or self.state.status()['deadline_expired']:
            self.state.freeze('COUNTDOWN_EXPIRED');raise TimeoutError('Lifetime expired; freeze retained across restart')

    def entry_allocation(self,requested_units):
        self.check_countdown_lifeline();number(requested_units,True)
        self.state.status();return Decimal('0.0000')

    def remaining_seconds(self):
        durable=(datetime.fromisoformat(self.state.status()['deadline'])-datetime.now(timezone.utc)).total_seconds()
        return max(0,min(self.deadline-self.clock(),durable))
