<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\DomainTransfer;
use Carbon\Carbon;
use Mail;
use App\Mail\TransferDomainToAdminMail;
use App\Models\LeapTransfer;
use App\Mail\LeapTransferMailToAdmin;
use App\Services\WhmcsServices;


class DomainTransferController extends Controller
{

    protected WhmcsServices $whmcsServices;
    public function __construct(WhmcsServices $whmcsServices)
    {
        $this->whmcsServices = $whmcsServices;
    }
    
    protected $whoisservers = array(
                "ac"     => "whois.nic.ac", // Ascension Island
                // ad - Andorra - no whois server assigned
                "ae"     => "whois.nic.ae", // United Arab Emirates
                "aero"   => "whois.aero",
                "af"     => "whois.nic.tl", // Afghanistan
                "ag"     => "whois.nic.ag", // Antigua And Barbuda
                "ai"     => "whois.ai", // Anguilla
                "al"     => "whois.ripe.net", // Albania
                "am"     => "whois.amnic.net", // Armenia
                // an - Netherlands Antilles - no whois server assigned
                // ao - Angola - no whois server assigned
                // aq - Antarctica (New Zealand) - no whois server assigned
                // ar - Argentina - no whois server assigned
                "arpa"   => "whois.iana.org",
                "as"     => "whois.nic.as", // American Samoa
                "asia"   => "whois.nic.asia",
                "at"     => "whois.nic.at", // Austria
                "au"     => "whois.aunic.net", // Australia
                // aw - Aruba - no whois server assigned
                "ax"     => "whois.ax", // Aland Islands
                "az"     => "whois.ripe.net", // Azerbaijan
                // ba - Bosnia And Herzegovina - no whois server assigned
                // bb - Barbados - no whois server assigned
                // bd - Bangladesh - no whois server assigned
                "be"     => "whois.dns.be", // Belgium
                "bg"     => "whois.register.bg", // Bulgaria
                "bi"     => "whois.nic.bi", // Burundi
                "biz"    => "whois.biz",
                "bj"     => "whois.nic.bj", // Benin
                // bm - Bermuda - no whois server assigned
                "bn"     => "whois.bn", // Brunei Darussalam
                "bo"     => "whois.nic.bo", // Bolivia
                "br"     => "whois.registro.br", // Brazil
                "bt"     => "whois.netnames.net", // Bhutan
                // bv - Bouvet Island (Norway) - no whois server assigned
                // bw - Botswana - no whois server assigned
                "by"     => "whois.cctld.by", // Belarus
                "bz"     => "whois.belizenic.bz", // Belize
                "ca"     => "whois.cira.ca", // Canada
                "cat"    => "whois.cat", // Spain
                "cc"     => "whois.nic.cc", // Cocos (Keeling) Islands
                "cd"     => "whois.nic.cd", // Congo, The Democratic Republic Of The
                // cf - Central African Republic - no whois server assigned
                "ch"     => "whois.nic.ch", // Switzerland
                "ci"     => "whois.nic.ci", // Cote d'Ivoire
                "ck"     => "whois.nic.ck", // Cook Islands
                "cl"     => "whois.nic.cl", // Chile
                // cm - Cameroon - no whois server assigned
                "cn"     => "whois.cnnic.net.cn", // China
                "co"     => "whois.nic.co", // Colombia
                "com"    => "whois.verisign-grs.com",
                "coop"   => "whois.nic.coop",
                // cr - Costa Rica - no whois server assigned
                // cu - Cuba - no whois server assigned
                // cv - Cape Verde - no whois server assigned
                // cw - Curacao - no whois server assigned
                "cx"     => "whois.nic.cx", // Christmas Island
                // cy - Cyprus - no whois server assigned
                "cz"     => "whois.nic.cz", // Czech Republic
                "de"     => "whois.denic.de", // Germany
                // dj - Djibouti - no whois server assigned
                "dk"     => "whois.dk-hostmaster.dk", // Denmark
                "dm"     => "whois.nic.dm", // Dominica
                // do - Dominican Republic - no whois server assigned
                "dz"     => "whois.nic.dz", // Algeria
                "ec"     => "whois.nic.ec", // Ecuador
                "edu"    => "whois.educause.edu",
                "ee"     => "whois.eenet.ee", // Estonia
                "eg"     => "whois.ripe.net", // Egypt
                // er - Eritrea - no whois server assigned
                "es"     => "whois.nic.es", // Spain
                // et - Ethiopia - no whois server assigned
                "eu"     => "whois.eu",
                "fi"     => "whois.ficora.fi", // Finland
                // fj - Fiji - no whois server assigned
                // fk - Falkland Islands - no whois server assigned
                // fm - Micronesia, Federated States Of - no whois server assigned
                "fo"     => "whois.nic.fo", // Faroe Islands
                "fr"     => "whois.nic.fr", // France
                // ga - Gabon - no whois server assigned
                "gd"     => "whois.nic.gd", // Grenada
                // ge - Georgia - no whois server assigned
                // gf - French Guiana - no whois server assigned
                "gg"     => "whois.gg", // Guernsey
                // gh - Ghana - no whois server assigned
                "gi"     => "whois2.afilias-grs.net", // Gibraltar
                "gl"     => "whois.nic.gl", // Greenland (Denmark)
                // gm - Gambia - no whois server assigned
                // gn - Guinea - no whois server assigned
                "gov"    => "whois.nic.gov",
                // gr - Greece - no whois server assigned
                // gt - Guatemala - no whois server assigned
                "gs"     => "whois.nic.gs", // South Georgia And The South Sandwich Islands
                // gu - Guam - no whois server assigned
                // gw - Guinea-bissau - no whois server assigned
                "gy"     => "whois.registry.gy", // Guyana
                "hk"     => "whois.hkirc.hk", // Hong Kong
                // hm - Heard and McDonald Islands (Australia) - no whois server assigned
                "hn"     => "whois.nic.hn", // Honduras
                "hr"     => "whois.dns.hr", // Croatia
                "ht"     => "whois.nic.ht", // Haiti
                "hu"     => "whois.nic.hu", // Hungary
                // id - Indonesia - no whois server assigned
                "ie"     => "whois.domainregistry.ie", // Ireland
                "il"     => "whois.isoc.org.il", // Israel
                "im"     => "whois.nic.im", // Isle of Man
                "in"     => "whois.inregistry.net", // India
                "info"   => "whois.afilias.net",
                "int"    => "whois.iana.org",
                "io"     => "whois.nic.io", // British Indian Ocean Territory
                "iq"     => "whois.cmc.iq", // Iraq
                "ir"     => "whois.nic.ir", // Iran, Islamic Republic Of
                "is"     => "whois.isnic.is", // Iceland
                "it"     => "whois.nic.it", // Italy
                "je"     => "whois.je", // Jersey
                // jm - Jamaica - no whois server assigned
                // jo - Jordan - no whois server assigned
                "jobs"   => "jobswhois.verisign-grs.com",
                "jp"     => "whois.jprs.jp", // Japan
                "ke"     => "whois.kenic.or.ke", // Kenya
                "kg"     => "www.domain.kg", // Kyrgyzstan
                // kh - Cambodia - no whois server assigned
                "ki"     => "whois.nic.ki", // Kiribati
                // km - Comoros - no whois server assigned
                // kn - Saint Kitts And Nevis - no whois server assigned
                // kp - Korea, Democratic People's Republic Of - no whois server assigned
                "kr"     => "whois.kr", // Korea, Republic Of
                // kw - Kuwait - no whois server assigned
                // ky - Cayman Islands - no whois server assigned
                "kz"     => "whois.nic.kz", // Kazakhstan
                "la"     => "whois.nic.la", // Lao People's Democratic Republic
                // lb - Lebanon - no whois server assigned
                // lc - Saint Lucia - no whois server assigned
                "li"     => "whois.nic.li", // Liechtenstein
                // lk - Sri Lanka - no whois server assigned
                "lt"     => "whois.domreg.lt", // Lithuania
                "lu"     => "whois.dns.lu", // Luxembourg
                "lv"     => "whois.nic.lv", // Latvia
                "ly"     => "whois.nic.ly", // Libya
                "ma"     => "whois.iam.net.ma", // Morocco
                // mc - Monaco - no whois server assigned
                "md"     => "whois.nic.md", // Moldova
                "me"     => "whois.nic.me", // Montenegro
                "mg"     => "whois.nic.mg", // Madagascar
                // mh - Marshall Islands - no whois server assigned
                "mil"    => "whois.nic.mil",
                // mk - Macedonia, The Former Yugoslav Republic Of - no whois server assigned
                "ml"     => "whois.dot.ml", // Mali
                // mm - Myanmar - no whois server assigned
                "mn"     => "whois.nic.mn", // Mongolia
                "mo"     => "whois.monic.mo", // Macao
                "mobi"   => "whois.dotmobiregistry.net",
                "mp"     => "whois.nic.mp", // Northern Mariana Islands
                // mq - Martinique (France) - no whois server assigned
                // mr - Mauritania - no whois server assigned
                "ms"     => "whois.nic.ms", // Montserrat
                // mt - Malta - no whois server assigned
                "mu"     => "whois.nic.mu", // Mauritius
                "museum" => "whois.museum",
                // mv - Maldives - no whois server assigned
                // mw - Malawi - no whois server assigned
                "mx"     => "whois.mx", // Mexico
                "my"     => "whois.domainregistry.my", // Malaysia
                // mz - Mozambique - no whois server assigned
                "na"     => "whois.na-nic.com.na", // Namibia
                "name"   => "whois.nic.name",
                "nc"     => "whois.nc", // New Caledonia
                // ne - Niger - no whois server assigned
                "net"    => "whois.verisign-grs.net",
                "nf"     => "whois.nic.nf", // Norfolk Island
                "ng"     => "whois.nic.net.ng", // Nigeria
                // ni - Nicaragua - no whois server assigned
                "nl"     => "whois.domain-registry.nl", // Netherlands
                "no"     => "whois.norid.no", // Norway
                // np - Nepal - no whois server assigned
                // nr - Nauru - no whois server assigned
                "nu"     => "whois.nic.nu", // Niue
                "nz"     => "whois.srs.net.nz", // New Zealand
                "om"     => "whois.registry.om", // Oman
                "org"    => "whois.pir.org",
                // pa - Panama - no whois server assigned
                "pe"     => "kero.yachay.pe", // Peru
                "pf"     => "whois.registry.pf", // French Polynesia
                // pg - Papua New Guinea - no whois server assigned
                // ph - Philippines - no whois server assigned
                // pk - Pakistan - no whois server assigned
                "pl"     => "whois.dns.pl", // Poland
                "pm"     => "whois.nic.pm", // Saint Pierre and Miquelon (France)
                // pn - Pitcairn (New Zealand) - no whois server assigned
                "post"   => "whois.dotpostregistry.net",
                "pr"     => "whois.nic.pr", // Puerto Rico
                "pro"    => "whois.dotproregistry.net",
                // ps - Palestine, State of - no whois server assigned
                "pt"     => "whois.dns.pt", // Portugal
                "pw"     => "whois.nic.pw", // Palau
                // py - Paraguay - no whois server assigned
                "qa"     => "whois.registry.qa", // Qatar
                "re"     => "whois.nic.re", // Reunion (France)
                "ro"     => "whois.rotld.ro", // Romania
                "rs"     => "whois.rnids.rs", // Serbia
                "ru"     => "whois.tcinet.ru", // Russian Federation
                // rw - Rwanda - no whois server assigned
                "sa"     => "whois.nic.net.sa", // Saudi Arabia
                "sb"     => "whois.nic.net.sb", // Solomon Islands
                "sc"     => "whois2.afilias-grs.net", // Seychelles
                // sd - Sudan - no whois server assigned
                "se"     => "whois.iis.se", // Sweden
                "sg"     => "whois.sgnic.sg", // Singapore
                "sh"     => "whois.nic.sh", // Saint Helena
                "si"     => "whois.arnes.si", // Slovenia
                "sk"     => "whois.sk-nic.sk", // Slovakia
                // sl - Sierra Leone - no whois server assigned
                "sm"     => "whois.nic.sm", // San Marino
                "sn"     => "whois.nic.sn", // Senegal
                "so"     => "whois.nic.so", // Somalia
                // sr - Suriname - no whois server assigned
                "st"     => "whois.nic.st", // Sao Tome And Principe
                "su"     => "whois.tcinet.ru", // Russian Federation
                // sv - El Salvador - no whois server assigned
                "sx"     => "whois.sx", // Sint Maarten (dutch Part)
                "sy"     => "whois.tld.sy", // Syrian Arab Republic
                // sz - Swaziland - no whois server assigned
                "tc"     => "whois.meridiantld.net", // Turks And Caicos Islands
                // td - Chad - no whois server assigned
                "tel"    => "whois.nic.tel",
                "tf"     => "whois.nic.tf", // French Southern Territories
                // tg - Togo - no whois server assigned
                "th"     => "whois.thnic.co.th", // Thailand
                "tj"     => "whois.nic.tj", // Tajikistan
                "tk"     => "whois.dot.tk", // Tokelau
                "tl"     => "whois.nic.tl", // Timor-leste
                "tm"     => "whois.nic.tm", // Turkmenistan
                "tn"     => "whois.ati.tn", // Tunisia
                "to"     => "whois.tonic.to", // Tonga
                "tp"     => "whois.nic.tl", // Timor-leste
                "tr"     => "whois.nic.tr", // Turkey
                "travel" => "whois.nic.travel",
                // tt - Trinidad And Tobago - no whois server assigned
                "tv"     => "tvwhois.verisign-grs.com", // Tuvalu
                "tw"     => "whois.twnic.net.tw", // Taiwan
                "tz"     => "whois.tznic.or.tz", // Tanzania, United Republic Of
                "ua"     => "whois.ua", // Ukraine
                "ug"     => "whois.co.ug", // Uganda
                "uk"     => "whois.nic.uk", // United Kingdom
                "us"     => "whois.nic.us", // United States
                "uy"     => "whois.nic.org.uy", // Uruguay
                "uz"     => "whois.cctld.uz", // Uzbekistan
                // va - Holy See (vatican City State) - no whois server assigned
                "vc"     => "whois2.afilias-grs.net", // Saint Vincent And The Grenadines
                "ve"     => "whois.nic.ve", // Venezuela
                "vg"     => "whois.adamsnames.tc", // Virgin Islands, British
                // vi - Virgin Islands, US - no whois server assigned
                // vn - Viet Nam - no whois server assigned
                // vu - Vanuatu - no whois server assigned
                "wf"     => "whois.nic.wf", // Wallis and Futuna
                "ws"     => "whois.website.ws", // Samoa
                "xxx"    => "whois.nic.xxx",
                // ye - Yemen - no whois server assigned
                "yt"     => "whois.nic.yt", // Mayotte
                "yu"     => "whois.ripe.net",
            );

    
    public function index(){
        return view('Dashboard.DomainTransfer.index');
    }
    
    public function domain_check(Request $request){
        $this->validate($request,[
            'domain_name' => 'required',
            'transferOption' => 'required'
        ]);
        
        if($request->transferOption == 'Domain'){
            $response = $this->domainAF_check($request->domain_name);
            return view('Dashboard.DomainTransfer.registration' , compact('response')); 
        }else{
            $data = $this->leap_transfer_check($request->domain_name);
            return view('Dashboard.DomainTransfer.LeapTransfer' , compact('data'));
        }
    }
    
    public function save_leap_transfer(Request $request){
        $this->validate($request,[
            'new_email' => "required" 
        ]);
        
        $data = $this->leap_transfer_check($request->domain);
        
        
        $ok = LeapTransfer::create([
            'unique_id' => $request->uni_id,
            'domain_name' => $request->domain,
            'full_name' => $data['full_name'],
            'old_email' => $data['email'],
            'new_email' => $request->new_email,
            'ip' => $request->ip(),
            'date' => Carbon::now(),
            'status' => 'Pending',
            'token' => $request->_token,
            'user_id' => auth()->user()->id,
        ]);

        if($ok){
            Mail::to('info@aryanict.com')->send(new LeapTransferMailToAdmin($ok->toArray()));
            session()->flash('success_transfer','myLEAP to myLEAP transfer request has been successfully received and is now pending support approval!');
            return redirect('/?leap=save');
        }
    }
    
    
    
    public function domain_transfer_to(Request $request){
        $data = $request->toArray();
        return view('Dashboard.DomainTransfer.DomainTransferOptions',compact('data'));
    }
    
    
    public function save_transfer(Request $request){
        $this->validate($request,[
            'customer_email' => 'required' 
        ]);
         DomainTransfer::create([
            'register_name' => $request->register_name,
            'register_email' => $request->register_email,
            'domain_name' => $request->domain,
            'date' => Carbon::now(),
            'ip' => $request->ip(),
            'token' => $request->_token,
            'option_domain' => $request->transfer_option,
            'status' => $request->status,
            'user_id' => auth()->user()->id
            ]);

         Mail::to('info@aryanict.com')->send(new TransferDomainToAdminMail($request->all()));
         session()->flash('success_transfer','Domain transfer request successfully received and pending support approval!');
         return redirect('/?transer=save');
        
    }
    
    
    
    
    
    
    
    
    // Functions
    
    
    public function leap_transfer_check($domain){
        
        $userId = $this->whmcsServices->getUserIdByDomain($domain);
        $data = [
            'email' => null,
            'full_name' => null,
            'error' => 'Please Contact Support',
            'domain'=>$domain
        ];
        $data = [];
        if($userId != null){
            $user = $this->whmcsServices->getClientById($userId);
            $data = [
                'email' => $user['email'],
                'full_name' => $user['fullname'],
                'error' => null,
                'domain' =>$domain
            ];
        }
        
        return $data;
    }
    
    protected function domainAF_check($domain){
         $domain_parts = explode(".", $domain);
         $tld          = strtolower(array_pop($domain_parts));
         $whoisserver  = $this->whoisservers[$tld];

        $q =  $data['result'] = $this->QueryWhoisServer($whoisserver, $domain);

        $email_t = '';
        $name_t = '';
        $org_t = '';

        foreach ($q as $key => $value) {
            $em = substr($value, 0 , 18);
            if($em == 'Registrant Email: '){
                $email_t = $value;
            }
            $na = substr($value, 0 ,17);

            if($na == 'Registrant Name: '){
                $name_t = $value;
            }

            $org = substr($value, 0 ,23);

            if($org == 'Registrar URL: https://'){
                $org_t = $value;
            }
            
        }

        $email = substr($email_t, 18);

        $name = substr($name_t, 17);

        $organization = substr($org_t, 23);
        $error = '';

         if($email == '' and $name == ''){
            $error = 'There is an error in your request your domain maybe not registered, or you have not entered .AF domain this transfer only works with .AF Domains!';
        }
        $responses = [
            'email' => $email,
            'name' => $name,
            'error'=> $error,
            'organization' => $organization,
            'domain' => $domain
        ];
       return $responses;
    }
    
    
    protected function QueryWhoisServer($whoisserver, $domain){
        $port    = 43;
        $timeout = 10;
        $fp      = @fsockopen($whoisserver, $port, $errno, $errstr, $timeout) or die("Socket Error " . $errno . " - " . $errstr);
        //if($whoisserver == "whois.verisign-grs.com") $domain = "=".$domain; // whois.verisign-grs.com requires the equals sign ("=") or it returns any result containing the searched string.
        fputs($fp, $domain . "\r\n");
        $out = "";
        while (!feof($fp)) {
            $out .= fgets($fp);
        }
        fclose($fp);

        $res = "";
        if ((strpos(strtolower($out), "error") === false) && (strpos(strtolower($out), "not allocated") === false)) {
            $rows = explode("\n", $out);
            foreach ($rows as $row) {
                $row = trim($row);
                if (($row != '') && ($row[0] != '#') && ($row[0] != '%')) {
                    $res .= $row . "\n";

                }
            }
        }
        return $rows;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
}
