# Independent component package; imports only Hearth's public protocols and components.
from dataclasses import dataclass
from hearth.kernel import Capability, Contract, Plan, Child, Rule, Port
from hearth.space import Box, Frame
from hearth.blocks import state_of, slab
from hearth.components.interior import Room


@dataclass(frozen=True)
class Pendant:

    def capability(self):
        return Capability('extension.pendant', ('light', 'room-light'), guarantees=('actual light source',))

    def negotiate(self, context, parameters):
        return Contract(Box((0, 0, 0), (0, 1, 0)), rules=(Rule('expected', ((0, 0, 0),), data={'names': ['ochre_froglight']}),))

    def realize(self, context, contract):
        plan = Plan()
        plan.block((0, 0, 0), state_of('ochre_froglight', axis='y'))
        plan.block((0, 1, 0), slab('dark_oak'))
        return plan


@dataclass(frozen=True)
class ReadingSuite:
    width: int = 11

    def capability(self):
        return Capability('extension.reading-suite', ('room', 'habitable', 'composite'), offers=('access',), guarantees=('lit', 'furnished', 'enclosed', 'reachable'))

    def negotiate(self, context, parameters):
        entry = (self.width // 2, 1, 0)
        port = Port('north', 'access', Frame(entry), Box(entry, (entry[0], 2, 0)), 10, delegate=('reading-room', 'north'))
        return Contract(Box((-1, 0, -1), (self.width, 9, self.width)), ports=(port,))

    def realize(self, context, contract):
        return Plan(children=[Child('reading-room', Room('library', self.width, self.width, light_component=Pendant()))])
