<?php

declare(strict_types=1);



class Domain
{
     
    private const MULTI_SUFFIXES = [
         
        'co.uk', 'org.uk', 'me.uk', 'ltd.uk', 'plc.uk', 'net.uk', 'sch.uk', 'ac.uk', 'gov.uk', 'nhs.uk',
         
        'com.au', 'net.au', 'org.au', 'edu.au', 'gov.au', 'asn.au', 'id.au',
        'co.nz', 'net.nz', 'org.nz', 'govt.nz', 'ac.nz', 'geek.nz', 'school.nz',
         
        'co.jp', 'ne.jp', 'or.jp', 'go.jp', 'ac.jp', 'ad.jp', 'ed.jp', 'gr.jp', 'lg.jp',
        'co.kr', 'or.kr', 'ne.kr', 're.kr', 'pe.kr', 'go.kr', 'ac.kr',
        'com.cn', 'net.cn', 'org.cn', 'gov.cn', 'edu.cn', 'ac.cn',
        'com.tw', 'org.tw', 'net.tw', 'idv.tw', 'gov.tw', 'edu.tw',
        'com.hk', 'org.hk', 'net.hk', 'edu.hk', 'gov.hk', 'idv.hk',
        'com.sg', 'net.sg', 'org.sg', 'edu.sg', 'gov.sg',
         
        'co.in', 'net.in', 'org.in', 'gen.in', 'firm.in', 'ind.in', 'gov.in', 'ac.in', 'edu.in',
        'co.id', 'web.id', 'or.id', 'net.id', 'ac.id', 'sch.id', 'go.id',
        'com.my', 'net.my', 'org.my', 'gov.my', 'edu.my',
        'com.ph', 'net.ph', 'org.ph', 'gov.ph', 'edu.ph',
        'com.pk', 'net.pk', 'org.pk', 'gov.pk', 'edu.pk',
        'com.vn', 'net.vn', 'org.vn', 'gov.vn', 'edu.vn',
        'com.bd', 'net.bd', 'org.bd', 'gov.bd',
        'com.np', 'com.lk', 'com.kh',
         
        'co.il', 'org.il', 'net.il', 'ac.il', 'gov.il', 'co.za', 'org.za', 'net.za', 'gov.za', 'ac.za', 'web.za',
        'com.sa', 'net.sa', 'org.sa', 'gov.sa', 'edu.sa',
        'com.eg', 'net.eg', 'org.eg', 'gov.eg', 'edu.eg',
        'com.ng', 'net.ng', 'org.ng', 'gov.ng', 'edu.ng',
        'co.ke', 'or.ke', 'co.tz', 'co.ug', 'co.zw', 'com.gh', 'com.dz', 'com.ly', 'com.tn', 'co.ma',
        'com.tr', 'net.tr', 'org.tr', 'gov.tr', 'edu.tr', 'gen.tr', 'web.tr',
        'com.qa', 'com.kw', 'com.bh', 'com.om', 'com.lb', 'com.jo',
         
        'com.br', 'net.br', 'org.br', 'gov.br', 'edu.br', 'com.ar', 'net.ar', 'org.ar', 'gov.ar', 'edu.ar',
        'com.mx', 'net.mx', 'org.mx', 'gob.mx', 'edu.mx', 'com.co', 'net.co', 'org.co', 'gov.co', 'edu.co',
        'com.pe', 'com.ve', 'com.ec', 'com.uy', 'com.py', 'com.bo', 'com.gt', 'com.do', 'com.pa',
         
        'com.ua', 'net.ua', 'org.ua', 'in.ua', 'co.ua', 'com.ru', 'net.ru', 'org.ru', 'com.pl', 'net.pl', 'org.pl',
        'com.gr', 'com.cy', 'com.mt', 'co.rs', 'org.rs', 'com.hr', 'com.ro', 'co.at', 'or.at',
         
        'github.io', 'gitlab.io', 'herokuapp.com', 'herokudns.com', 'appspot.com', 'web.app',
        'firebaseapp.com', 'vercel.app', 'netlify.app', 'pages.dev', 'workers.dev', 'r2.dev',
        'cloudfront.net', 'azurewebsites.net', 'cloudflareaccess.com', 'ondigitalocean.app', 'fly.dev',
        'wordpress.com', 'blogspot.com', 'myshopify.com', 'wixsite.com', 'webflow.io',
    ];

    

    public static function registrable(string $host): string
    {
        $host = strtolower(trim($host));
        if ($host === '') {
            return '';
        }
         
        $host = preg_replace('#^[a-z][a-z0-9+.\-]*://#', '', $host);
        $host = preg_replace('#^[^@/]*@#', '', $host);
        $host = preg_replace('#[/?\#].*$#', '', $host);
        $host = preg_replace('#:\d+$#', '', $host);
        $host = trim($host, '.');
        if ($host === '') {
            return '';
        }
         
        if ($host[0] === '[' || str_contains($host, ':') || filter_var($host, FILTER_VALIDATE_IP)) {
            return trim($host, '[]');
        }
        $host = preg_replace('#^www\.#', '', $host);

        $labels = explode('.', $host);
        $n = count($labels);
        if ($n <= 2) {
            return $host;  
        }
        $lastTwo = $labels[$n - 2] . '.' . $labels[$n - 1];
        if (in_array($lastTwo, self::MULTI_SUFFIXES, true)) {
            return implode('.', array_slice($labels, -3));
        }
        return implode('.', array_slice($labels, -2));
    }
}
