<?php

namespace App\Development\Whois;

use Illuminate\Http\Client\Request;
use Illuminate\Support\Facades\Http;

/**
 * WHOIS forwarder mock (App\Helpers\Utility\WhoIs). Every lookup hands back
 * { "result": "<raw whois text>" } and the helper regexes emails, a registration
 * date, or an as-set line back out of it.
 *
 * The /asn responses use the RFC 5398 documentation ASN range (64496-64511) and
 * deliberately spread across a matrix of real IRR shapes so every branch of the
 * WhoIs helper gets exercised:
 *
 *      64496  ARIN, recent, several emails (incl. a GSL one)   - happy path / email match
 *      64497  ARIN, recent, single abuse email
 *      64498  ARIN, recent, NO email fields                    - some IRRs omit contacts
 *      64499  ARIN, legacy 1991                                - too old (<= 2000)
 *      64500  ARIN, dated exactly 2000-01-01                   - the age boundary
 *      64501  RIPE, created ISO, abuse-mailbox
 *      64502  RIPE, legacy created 1994
 *      64503  APNIC, NO created line (source APNIC)            - helper falls back to "now"
 *      64504  LACNIC, created as YYYYMMDD
 *      64505  LACNIC, legacy YYYYMMDD 1998
 *      64506  AFRINIC, created ISO
 *      64507  KRNIC english block, no date                    - helper falls back to "now"
 *      64508  reg-date/registered alternate format
 *      64509  recent, only a free-mail (gmail) contact
 *      64510  bare stub - no date, no email                   - both lookups come back empty
 *      64511  RIPE, recent, mixed person + role emails
 *
 * Anything outside the range gets a plain recent ARIN record.
 */
class Lookup
{
    public function asn(array $params, Request $request)
    {
        $asn = (int) preg_replace('/\D/', '', $params['asn'] ?? '');

        $result = match($asn) {
            64496 => "ASNumber:       64496\nASName:         GSL-DOC-1\nRegDate:        2013-04-18\nOrgAbuseEmail:  noc@globalsecurelayer.com\nOrgTechEmail:   peering@globalsecurelayer.com\nsource:         ARIN",
            64497 => "ASNumber:       64497\nASName:         DOC-ARIN-SINGLE\nRegDate:        2016-11-02\nOrgAbuseEmail:  abuse@example.net\nsource:         ARIN",
            64498 => "ASNumber:       64498\nASName:         DOC-ARIN-NOEMAIL\nRegDate:        2018-07-09\nsource:         ARIN",
            64499 => "ASNumber:       64499\nASName:         DOC-ARIN-LEGACY\nRegDate:        1991-05-20\nOrgAbuseEmail:  abuse@example.net\nsource:         ARIN",
            64500 => "ASNumber:       64500\nASName:         DOC-ARIN-BOUNDARY\nRegDate:        2000-01-01\nOrgAbuseEmail:  abuse@example.net\nsource:         ARIN",

            64501 => "aut-num:        AS64501\nas-name:        DOC-RIPE\ncreated:        2009-03-11T14:22:00Z\nabuse-mailbox:  abuse@example.eu\nsource:         RIPE",
            64502 => "aut-num:        AS64502\nas-name:        DOC-RIPE-LEGACY\ncreated:        1994-08-21T16:00:00Z\nabuse-mailbox:  abuse@example.eu\nsource:         RIPE",

            64503 => "aut-num:        AS64503\nas-name:        DOC-APNIC\ndescr:          No registration date published, as is common for APNIC\nabuse-mailbox:  abuse@example.asia\nsource:         APNIC",

            64504 => "aut-num:        AS64504\nowner:          DOC LACNIC ORG\ncreated:        20120524\nowner-c:        noc@example.com.br\nsource:         LACNIC",
            64505 => "aut-num:        AS64505\nowner:          DOC LACNIC LEGACY\ncreated:        19980101\nowner-c:        noc@example.com.br\nsource:         LACNIC",

            64506 => "aut-num:        AS64506\nas-name:        DOC-AFRINIC\ncreated:        2019-02-14T08:30:00Z\nabuse-mailbox:  abuse@example.africa\nsource:         AFRINIC",

            64507 => "# ENGLISH\n\nKRNIC is the National Internet Registry in Korea.\n\nASNumber:       64507\nASName:         DOC-KRNIC\nabuse-mailbox:  abuse@example.kr",

            64508 => "aut-num:        AS64508\nas-name:        DOC-REGDATE-ALT\nreg-date:       2006-02-02\nregistered:     2006-02-02\ne-mail:         hostmaster@example.org",

            64509 => "ASNumber:       64509\nASName:         DOC-FREEMAIL\nRegDate:        2021-09-30\nOrgAbuseEmail:  someguy@gmail.com\nsource:         ARIN",

            64510 => "% No match found for AS64510",

            64511 => "aut-num:        AS64511\nas-name:        DOC-RIPE-MIXED\ncreated:        2014-06-05T10:10:00Z\nadmin-c:        jane@example.eu\nabuse-mailbox:  abuse@example.eu\ntech-c:         ops@globalsecurelayer.com\nsource:         RIPE",

            default => "ASNumber:       $asn\nASName:         DOC-DEFAULT\nRegDate:        2015-01-01\nOrgAbuseEmail:  noc@example.net\nsource:         ARIN",
        };

        return Http::response([ 'result' => $result ], 200);
    }

    public function asSet(array $params, Request $request)
    {
        // as_set_exists() greps for a single "as-set: ASx:AS-y" line, so that's all we hand back.
        $set = $params['as_set'] ?? 'AS64496:AS-DOC';

        return Http::response([ 'result' => "as-set: $set" ], 200);
    }
}
