package com.xixun.communicate;

import android.location.Criteria;
import android.location.Location;

import com.xixun.display.MainActivity;
import com.xixun.display.MyLog;
import com.xixun.display.MyService;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;

/**
 * Created by Administrator on 2018/08/09.
 * 163.53.193.72
 */

public class Report
{
    LedCardCommunication ledCardCommunication=null;
    MyService ms=null;
    String strCardID=null;
    String strDoMain=null;
    int iPort=0;

    String strIpAddress=null;


    DatagramSocket udpSendSocket =null;

    public Report(LedCardCommunication ledCardCommunication,String strDoMain,int iPort)
    {   this.ledCardCommunication=ledCardCommunication;
        this.strDoMain=strDoMain;
        this.iPort=iPort;

        if (ledCardCommunication==null) return;

        if (strDoMain==null) return;
        if (strDoMain.length()<"w.c".length()) return;

        ms=ledCardCommunication.clientsManage.ms;
        this.strCardID=ledCardCommunication.Get_DisplayID();


        new Thread() {
            public void run() {
                Process();
            }
        }.start();
    }

    private void Process()
    {   Criteria c = new Criteria();//Criteria类是设置定位的标准信息（系统会根据你的要求，匹配最适合你的定位供应商），一个定位的辅助信息的类


        {
            c.setPowerRequirement(Criteria.POWER_LOW);//设置低耗电
            c.setAltitudeRequired(true);//设置需要海拔
            c.setBearingAccuracy(Criteria.ACCURACY_COARSE);//设置COARSE精度标准
            c.setAccuracy(Criteria.ACCURACY_LOW);//设置低精度
            //... Criteria 还有其他属性，就不一一介绍了
            Location best = LocationUtils.getBestLocation(ms, c);

            if (best == null) {
                MyLog.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Best location is null");
            } else {
                MyLog.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!best location: lat==" + best.getLatitude() + " lng==" + best.getLongitude());
            }


            Location net = LocationUtils.getNetWorkLocation(ms);
            if (net == null) {
                MyLog.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!net location is null");
            } else {
                MyLog.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!net location: lat==" + net.getLatitude() + " lng==" + net.getLongitude());
            }

        }

        while(NeedExit()==false) {

            try {
                Thread.sleep(5*1000); // sleep(1000); // 第一次时，先等待其他服务端口套接字线程准备好。

                try{
                    InetAddress x = java.net.InetAddress.getByName(strDoMain);
                    strIpAddress = x.getHostAddress();//得到字符串形式的ip地址.

                    if (strIpAddress==null) continue;
                    if (strIpAddress.length()<"1.1.1.1".length())  continue;

                    MyLog.i(strDoMain+" IP："+strIpAddress);

//strIpAddress="192.168.1.255";//112";
                }
                catch (UnknownHostException e)
                {   //e.printStackTrace();
                    //MyLog.i("域名解析出错");
                    continue;
                }

                udpSendSocket = new DatagramSocket(null);
                udpSendSocket.setReuseAddress(true);
                udpSendSocket.bind(new InetSocketAddress(iPort));

                String staAlias=null;
                int iCounter=0;

                while (NeedExit()==false)
                {
                    Location best = LocationUtils.getBestLocation(ms, c);

                    iCounter++;
                    if (iCounter>10)
                    {
                        iCounter=0;
                        staAlias=null;
                    }
                    if (staAlias==null)
                    {
                        staAlias=ledCardCommunication.GetAlias();
                    }

                    //if (best != null)
                    {
                        String str =
                                "{"
                                        + "\"CardID\":\""     + strCardID
                                        + "\",\"Alias\":\""   + staAlias
                                        + "\",\"Display\":\""   + (ledCardCommunication.GetSecreenOn()?"ON":"OFF")
                                        + "\",\"PlayProgram\":\""   + ledCardCommunication.GetPlayProgram()
                                        + "\",\"Latitude\":\""  + ((best != null) ? best.getLatitude() :null)
                                        + "\",\"Longitude\":\"" + ((best != null) ? best.getLongitude() :null)
                                        + "\",\"Speed\":\""      + ((best != null) ? best.getSpeed() :null)

                                        +"\"}";
                        byte sendDataBuffer[] = str.getBytes();
                        DatagramPacket sendPacket = new DatagramPacket(sendDataBuffer, sendDataBuffer.length, InetAddress.getByName(strIpAddress), iPort);
                        udpSendSocket.send(sendPacket);
                        MyLog.i( str  );
                    }


                    Thread.sleep(15*1000);
                }
            }catch(Exception e){
                MyLog.i(Thread.currentThread().getStackTrace()[2].getFileName() + "-->"
                                +   "Function: " +Thread.currentThread().getStackTrace()[2].getMethodName() + "-->"
                                +   "Line" +Thread.currentThread().getStackTrace()[2].getLineNumber() + ":\r\n"
                                +   "    Error:" + e.getMessage() + "\r\n\r\n"
                        );
            }finally {
                if (udpSendSocket!=null) {
                    udpSendSocket.close();
                    udpSendSocket=null;
                }
            }
        }
        Exit();
    }

    /**
     * 通过GPS获取定位信息

    public void getGPSLocation() {
        Location gps = LocationUtils.getGPSLocation(this);
        if (gps == null) {
            //设置定位监听，因为GPS定位，第一次进来可能获取不到，通过设置监听，可以在有效的时间范围内获取定位信息
            LocationUtils.addLocationListener(context, LocationManager.GPS_PROVIDER, new LocationUtils.ILocationListener() {
                @Override
                public void onSuccessLocation(Location location) {
                    if (location != null) {
                        Toast.makeText(MainActivity.this, "gps onSuccessLocation location:  lat==" + location.getLatitude() + "     lng==" + location.getLongitude(), Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "gps location is null", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        } else {
            Toast.makeText(this, "gps location: lat==" + gps.getLatitude() + "  lng==" + gps.getLongitude(), Toast.LENGTH_SHORT).show();
        }
    }*/

    /**
     * 通过网络等获取定位信息

    private void getNetworkLocation() {
        Location net = LocationUtils.getNetWorkLocation(Activity);
        if (net == null) {
            Toast.makeText(this, "net location is null", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "network location: lat==" + net.getLatitude() + "  lng==" + net.getLongitude(), Toast.LENGTH_SHORT).show();
        }
    }*/

    /**
     * 采用最好的方式获取定位信息

    private void getBestLocation() {
        Criteria c = new Criteria();//Criteria类是设置定位的标准信息（系统会根据你的要求，匹配最适合你的定位供应商），一个定位的辅助信息的类
        c.setPowerRequirement(Criteria.POWER_LOW);//设置低耗电
        c.setAltitudeRequired(true);//设置需要海拔
        c.setBearingAccuracy(Criteria.ACCURACY_COARSE);//设置COARSE精度标准
        c.setAccuracy(Criteria.ACCURACY_LOW);//设置低精度
        //... Criteria 还有其他属性，就不一一介绍了
        Location best = LocationUtils.getBestLocation(Activity, c);
        if (best == null) {
            Toast.makeText(this, " best location is null", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "best location: lat==" + best.getLatitude() + " lng==" + best.getLongitude(), Toast.LENGTH_SHORT).show();
        }
    }
  */

    boolean bNeedExit=false;
    public boolean NeedExit() { return bNeedExit; }

    public void Exit()
    {   if (NeedExit()) return;
        bNeedExit=true;
    }
}
