from __future__ import annotations

import collections

from PIL import Image

from planemapper.constants import TRAIL_MAX_DOTS
from planemapper.models import Aircraft
from planemapper.renderer.aircraft import draw_aircraft
from planemapper.renderer.airspace import draw_airspace
from planemapper.renderer.overlay import draw_home_marker
from planemapper.renderer.projection import MapBounds, project


class Renderer:
    def __init__(self, base_map: Image.Image, bounds: MapBounds) -> None:
        self._base_map = base_map
        self._bounds = bounds
        self._trails: dict[str, collections.deque[tuple[int, int]]] = {}

    def render(self, aircraft_list: list[Aircraft]) -> Image.Image:
        image = self._base_map.copy()
        draw_airspace(image, self._bounds)
        draw_home_marker(image, self._bounds)
        for aircraft in aircraft_list:
            pos = project(aircraft.lat, aircraft.lon, self._bounds)
            trail = self._trails.get(aircraft.icao, collections.deque())
            draw_aircraft(image, aircraft, pos, trail)
            trail.appendleft(pos)
            while len(trail) > TRAIL_MAX_DOTS:
                trail.pop()
            self._trails[aircraft.icao] = trail
        return image
