<?php

namespace app\controller;


use think\facade\Db;

class Navigation
{
    public function NavMessage($lat,$lng,$station_number,$openid){
        $station_id = Db::table('charge_station')->where("charge_station_number",$station_number)->value("charge_station_id");
        
        $table_user = 'zxc_user';
        $hd = new HardMessage();
        $interval = $hd->GetPrice($station_id,$openid,$table_user);
        $station_type = \app\model\ChargeStation::where('charge_station_id',$station_id)->value('station_type');

        $free = 0;
        $occupy = 0;
        $fault = 0;
        $i = 1;
        $mess = Db::table('charge_pile')->where('charge_station_id',$station_id)->select();
        foreach ($mess as $m){
            if ($m['status']==1){
                $free+=1;
            }elseif ($m['status']==2){
                $occupy+=1;
            }elseif ($m['status']==3){
                $occupy+=1;
            }elseif ($m['status']==255){
                $fault+=1;
            }elseif ($m['status']==0){
                $fault+=1;
            }
            $no = Db::table('charge_pile')->where('charge_pile_id',$m['charge_pile_id'])->value('no');
            if($no==null){
                Db::table('charge_pile')->where('charge_pile_id',$m['charge_pile_id'])->update(['no' => $i]);
            }
            $i+=1;
        }
        $kk['free'] = $free;
        $kk['occupy'] = $occupy;
        $kk['fault'] = $fault;
        $kk['all'] = $free+$occupy+$fault;

//        $time = strtotime(date('H:i:s','00:00:00'));
//        $time = date('H:i:s',strtotime("2023-03-24 21:59:59"));
        $time = date('H:i:s',time());
        if ((int)$station_type==0){
            $SPrice  = $interval['SPrice'];
            $interval  = $interval['message'];
            $i = 0;
            foreach ($interval as $in){
                $st = date('H:i:s',strtotime($in['start']));
//                $en = date('H:i:s',strtotime('-1 seconds',strtotime($in['end'])));
                $en = date('H:i:s',strtotime($in['end']));
                $check = date('H:i:s',strtotime('23:59:59'));
                $check1 = date('H:i:s',strtotime('00:00:00'));
                if ($i<=7 && $time>=$st && $time<$en && $time!=$check1){
                    $kk['Elect'] =  $in['univalence'];
                    $kk['Serve'] = $SPrice;
                    break;
                }elseif($i==7 && ($time>=$st || $time<=$check )|| $time==$check1){
                    $kk['Elect'] =  $in['univalence'];
                    $kk['Serve'] = $SPrice;
                    break;
                }
                $i+=1;
            }
        }else{
            $SPrice  = $interval['SPrice'];
            $EPrice  = $interval['EPrice'];
            $kk['Elect'] =  $EPrice;
            $kk['Serve'] = $SPrice;

        }
        $kk['total'] = number_format($kk['Elect'] + $kk['Serve'],6);
        $address = Db::table('charge_station')->where("charge_station_number",$station_number)->value("address");
        $station_name = Db::table('charge_station')->where("charge_station_number",$station_number)->value("charge_station_name");
        $kk['address'] = $address;
        $kk['station_name'] = $station_name;
        $Type = Db::table('charge_station')->where('charge_station_id',$station_id)->value('station_type');
        if ((int)$Type == 0){
            $kk['type'] = '快充';
        }elseif((int)$Type == 1){
            $kk['type'] = '慢充';
        }
        $lat1 = $lat;
        $lng1 = $lng;
        $lat2 = Db::table('charge_station')->where('charge_station_id',$station_id)->value('latitude');
        $lng2 = Db::table('charge_station')->where('charge_station_id',$station_id)->value('longitude');
        $distance = $this->getDistance($lat1, $lng1, $lat2, $lng2);
        $kk['distance'] = $distance;
        return json($kk);
    }

    public function GetLastStation($lat,$lng){
        $lat1 = $lat;
        $lng1 = $lng;
        $list = Db::table('charge_station')->select();
        $mess = array();
        foreach ($list as $l){
            $charge_station_id = $l['charge_station_id'];
            $lat2 = $l['latitude'];
            $lng2 = $l['longitude'];
            $distance = $this->getDistance($lat1, $lng1, $lat2, $lng2);
            $mess[$charge_station_id] =  $distance;
        }
        asort($mess);
        $kk = array();
        foreach ($mess as $key=>$value){
            $station_id = $key;
            $distance =$value;
            $station_number = Db::table('charge_station')->where('charge_station_id',$station_id)->value('charge_station_number');
            $s_latitude = Db::table('charge_station')->where('charge_station_id',$station_id)->value('latitude');
            $s_longitude = Db::table('charge_station')->where('charge_station_id',$station_id)->value('longitude');
            $kk['station_number'] = $station_number;
            $kk['distance'] = $distance;
            $kk['s_latitude'] = $s_latitude;
            $kk['s_longitude'] = $s_longitude;
            break;
        }
        return json($kk);
    }

    private function getDistance($lat1, $lng1, $lat2, $lng2): float
    {
        $earthRadius = 6367000;
        $lat1 = ($lat1 * pi() ) / 180;
        $lng1 = ($lng1 * pi() ) / 180;
        $lat2 = ($lat2 * pi() ) / 180;
        $lng2 = ($lng2 * pi() ) / 180;
        $calcLongitude = $lng2 - $lng1;
        $calcLatitude = $lat2 - $lat1;
        $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
        $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
        $calculatedDistance = $earthRadius * $stepTwo;
        return round($calculatedDistance/1000,2);
    }
}