<?php

namespace App\Traits;
use App\Models\ZipcodeRange;

trait CaculateZipcodeDistance
{

    public function calculateDistance($zipcode1, $zipcode2){

        if($zipcode1 == $zipcode2){
           return  "0 Mile";
        }

        $result = ZipcodeRange::select('zipcode', 'lat', 'lon')
            ->whereIn('zipcode', [$zipcode1, $zipcode2])
            ->get();

        if($result->count() == 2){
            return $this->processCalculation($result, 'M');
        }
        return false;
    }

    public function processCalculation($zipcodes, $unit)
    {
        $lon1 = (float)$zipcodes[0]->lon;
        $lat1 = (float)$zipcodes[0]->lat;

        $lon2 = (float)$zipcodes[1]->lon;
        $lat2 = (float)$zipcodes[1]->lat;
       
        $theta = $lon1 - $lon2;
        $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
        $dist = acos($dist);
        $dist = rad2deg($dist);
        $miles = $dist * 60 * 1.1515;
        $unit = strtoupper($unit);

        if ($unit == "K") {
            return ($miles * 1.609344) . " Kilometers<br>";
        } else if ($unit == "N") {
            return ($miles * 0.8684) . " Nautical Miles<br>";
        } else {
            return number_format($miles, 2, '.', ',') . " Miles";
        }
    }
}