#!env xonsh
'''
Compute the pxs-per-inch (PPI) naively for the local DE.

NOTE, currently this only supports the `sway`-TWM on wayland.

!TODO!
- [ ] support Xorg (and possibly other OSs as well?
- [ ] conver this to pure py code, dropping the `.xsh` specifics
     instead for `subprocess` API calls?
- [ ] possibly unify all this with `./qt_screen_info.py` as part of
     a "PPI config wizard" or something, but more then likely we'll
     have lib-ified version inside modden/piker by then?

'''

import math
import json

# XXX, xonsh part using "subprocess mode"
disp_infos: list[dict] = json.loads($(wlr-randr --json))
lappy: dict = disp_infos[0]

dims: dict[str, int] = lappy['physical_size']
w_cm: int = dims['width']
h_cm: int = dims['height']

# cm per inch
cpi: float = 25.4

# compute "diagonal" size (aka hypot)
diag_inches: float = math.sqrt((h_cm/cpi)**2 + (w_cm/cpi)**2)

# compute reso-hypot / inches-hypot
hi_res: dict[str, float|bool] = lappy['modes'][0]
w_px: int = hi_res['width']
h_px: int = hi_res['height']

diag_pxs: float = math.sqrt(h_px**2 + w_px**2)
unscaled_ppi: float = diag_pxs/diag_inches

# retrieve TWM info on the display (including scaling info)
sway_disp_info: dict = json.loads($(swaymsg -r -t get_outputs))[0]
scale: float = sway_disp_info['scale']

print(
    f'output: {sway_disp_info["name"]!r}\n'
    f'--- DIMENSIONS ---\n'
    f'w_cm: {w_cm!r}\n'
    f'h_cm: {h_cm!r}\n'
    f'w_px: {w_px!r}\n'
    f'h_cm: {h_px!r}\n'
    f'\n'
    f'--- DIAGONALS ---\n'
    f'diag_inches: {diag_inches!r}\n'
    f'diag_pxs: {diag_pxs!r}\n'
    f'\n'
    f'--- PPI-related-info ---\n'
    f'(DE reported) scale: {scale!r}\n'
    f'unscaled PPI: {unscaled_ppi!r}\n'
    f'|_ =sqrt(h_px**2 + w_px**2) / sqrt(h_in**2 + w_in**2)\n'
    f'scaled PPI: {unscaled_ppi/scale!r}\n'
    f'|_ =unscaled_ppi/scale\n'
)
