#!/usr/bin/env python3
"""Download a WhatsMinerTool ip.ini of miners that need onboarding.

Hit this from the browser on a WhatsMinerTool Windows VM; it returns an
`ip.ini` (single-IP sections, pre-checked) you save into the WMT folder,
then: open WMT -> it scans exactly these -> sort by the API column ->
select API=OFF rows -> change password (restore admin) + enable API.

Query params (all optional):
  days=N     also include control boards first seen in the last N days (repair
             returns). default 10. Combined with known-bad; triage in WMT by API column.
  rogues=1   include known rogue/api-off miners from the pool sweep. default 1
  locked=0   include password-locked miners (field-reset only, not WMT-fixable). default 0
  sleeping=0 include sleeping miners. default 0
"""
import cgi, sys, os

sys.path.insert(0, '/opt/ngon/apps')
from managers.auth_manager import AuthManager, generate_login_page_html
sys.path.insert(0, '/opt/ngon/apps/miners')
import gen_wmt_iplist as gen


def _int(form, key, default):
    try:
        return int(form.getvalue(key, default))
    except (TypeError, ValueError):
        return default


def main():
    form = cgi.FieldStorage()
    auth = AuthManager('nmt')
    auth_required, should_exit, headers = auth.require_auth(form)

    if should_exit:
        print("Content-Type: application/json")
        if headers:
            print(headers)
        print("")
        print('{"success": false, "error": "Authentication required"}'
              if auth_required else '{"success": true}')
        return

    if auth_required:
        print("Content-Type: text/html\n")
        print(generate_login_page_html("Onboarding IP List"))
        return

    days      = _int(form, 'days', 10)   # known-bad (rogues) + new boards; triage by WMT's API column
    sleeping  = form.getvalue('sleeping', '0') == '1'
    rogues    = form.getvalue('rogues', '1') != '0'
    locked    = form.getvalue('locked', '0') == '1'

    seen = {}
    if rogues:
        seen.update(gen.collect(include_locked=locked))
    if days > 0:
        for ip, remark in gen.new_boards(days, sleeping).items():
            seen.setdefault(ip, remark)

    pairs = sorted(seen.items(),
                   key=lambda kv: tuple(int(x) for x in kv[0].split(".")))
    body = gen.render(pairs)

    sys.stdout.write("Content-Type: application/octet-stream\r\n")
    sys.stdout.write('Content-Disposition: attachment; filename="ip.ini"\r\n')
    sys.stdout.write("X-Miner-Count: %d\r\n" % len(pairs))
    sys.stdout.write("\r\n")
    sys.stdout.write(body)


if __name__ == "__main__":
    main()
