#!/usr/bin/env nix-shell
#!nix-shell -i python3 -p grub2 rsync utillinux shadow utillinux e2fsprogs
from subprocess import run
from pathlib import Path
from tempfile import TemporaryDirectory
import argparse
import json
import os
import sys
import time

root_device = Path('/dev/disk/by-id/ata-Crucial_CT250MX200SSD1_1537108FC44F')
bios_boot_part_type = '21686148-6449-6E6F-744E-656564454649'
config_dir = Path(__file__).parent.parent.absolute()

if os.getlogin() != 'root':
    print("ERROR: must be run as root", file=sys.stderr)
    sys.exit(1)

if not root_device.exists():
    print(f"ERROR: {root_device} not found", file=sys.stderr)
    sys.exit(1)

print(f"WARNING: this script will WIPE all data on {root_device}")
if input('Write "Yes" to continue:') != 'Yes':
    sys.exit(1)

with TemporaryDirectory() as tmp_path:
    tmp = Path(tmp_path)
    print(f"Created temporary directory {tmp}")

    parts = (
        'label: gpt\n'
        f'name=grub start=2MiB size=10MiB type={bios_boot_part_type}\n'
        'name=root size=100GiB\n'
    )
    run(['sfdisk', root_device], input=parts.encode())

    parts_info = json.loads(run(['sfdisk', '--json', root_device], capture_output=True, check=True).stdout.decode())
    root_part = Path(parts_info["partitiontable"]["partitions"][1]['node']).resolve()

    for i in range(40):
        if root_part.exists():
            break
        time.sleep(0.2)
    else:
        print(f"ERROR: create partition not exists: {root_part}", file=sys.stderr)
        sys.exit(1)

    run(['mkfs.ext4', root_part])

    root = tmp.joinpath('root')
    root.mkdir()

    try:
        run(['mount', root_part, root], check=True)

        run(['mkdir', '-p', root.joinpath('etc', 'nixos')], check=True)
        run(['rsync', '-r', '--progress', f'{config_dir!s}/', root.joinpath('etc', 'nixos')], check=True)

        root_uuid = parts_info["partitiontable"]["partitions"][1]['uuid'].lower()
        root.joinpath('etc', 'nixos', 'hw.json').write_text(json.dumps({
            "rootUUID": f'{root_uuid}',
        }))

        run(['nixos-install', '--no-root-passwd', '--root', root], check=True)
        run(['grub-install', f'--root-directory={root!s}', f'--boot-directory={root.joinpath("boot")!s}', root_device], check=False)
        run(['chpasswd', '--root', root], input=b'root:toor')

    finally:
        run(['umount', root])
