package com.example.wadi;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SwitchCompat;
import androidx.cardview.widget.CardView;
import androidx.core.app.ActivityCompat;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.bumptech.glide.Glide;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;

import android.Manifest;

import org.json.JSONException;
import org.json.JSONObject;

public class Home extends AppCompatActivity {
    CardView clothingCard;
    private TextView txtName,account,time2,meready2,amazonDesc;

    private ImageView elecImage,clothingImage,beautyImage,homeImage,grocImage,pharmImage,amazonImage;

    public static String Hussein,log,lud,Ust,Uacco;
    private SQLiteHandler db;
    private SessionManager session;

    private SwitchCompat meready;

    private FusedLocationProviderClient fusedLocationClient;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home2);
        elecImage = (ImageView) findViewById(R.id.elecImage);
        clothingImage = (ImageView) findViewById(R.id.clothingImage);
        beautyImage = (ImageView) findViewById(R.id.beautyImage);
        homeImage = (ImageView) findViewById(R.id.homeImage);
        grocImage = (ImageView) findViewById(R.id.grocImage);
        pharmImage = (ImageView) findViewById(R.id.pharmImage);
        time2 = (TextView) findViewById(R.id.time2);
        meready2 = (TextView) findViewById(R.id.meready2);
        amazonDesc = (TextView) findViewById(R.id.amazonDesc);
        amazonImage= (ImageView) findViewById(R.id.amazonImage);

        fetchData();

        clothingCard = findViewById(R.id.clothingCard);

        meready = findViewById(R.id.meready);

        new FetchData().execute();

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

        // SqLite database handler
        db = new SQLiteHandler(getApplicationContext());

        // session manager
        session = new SessionManager(getApplicationContext());

        if (!session.isLoggedIn()) {
            logoutUser();
        }

        // Fetching user details from sqlite
        HashMap<String, String> user = db.getUserDetails();

        String name = user.get("name");
        String Uacco = user.get("job");


        time2.setText(" مرحبا : " + name);


        if ("1".equals(Uacco)) {
            meready2.setText("  مستفيد ");
            meready.setVisibility(View.GONE);
        }

        if ("2".equals(Uacco)) {
            meready2.setText(" صناعي ");
            meready.setVisibility(View.VISIBLE);
        }

        if ("3".equals(Uacco)) {
            meready2.setText(" الخدمات ");
            meready.setVisibility(View.GONE);
        }

        if ("4".equals(Uacco)) {
            meready2.setText(" مسوق ");
            meready.setVisibility(View.GONE);
        }


        fetchUseron(user.get("uid"), this, meready);


        elecImage.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent(getApplicationContext(),
                        Markets.class);
                startActivity(i);
                //finish();
            }
        });

        clothingImage.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent(getApplicationContext(),
                        MainActivity2.class);
                startActivity(i);
                //finish();
            }
        });

        beautyImage.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent(getApplicationContext(),
                        Workers.class);
                startActivity(i);
                //finish();
            }
        });

        clothingCard.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Home.this, MainActivity2.class);
                startActivity(intent);
            }
        });


        meready.setOnCheckedChangeListener((buttonView, isChecked) -> {
            if (isChecked) {
                // Switch is
                Ust = "1";
                getLocation();
                Toast.makeText(this, "تم تفعيل وضع متاح الان يمكنك استقبال طلبات العمل", Toast.LENGTH_SHORT).show();
            } else {
                // Switch is OFF
                Ust = "0";
                getLocation();
                Toast.makeText(this, "تم ايقاف وضع متاح الان انت الان في وضع الراحه نتمني لك يوم مريح", Toast.LENGTH_SHORT).show();
            }
        });

    }

    private void logoutUser() {
        session.setLogin(false);

        db.deleteUsers();

        // Launching the login activity
        Intent intent = new Intent(Home.this, LoginActivity.class);
        startActivity(intent);
        finish();
    }


    private void getLocation() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "يجب اعطاء التطبيق صلاحية الوصول للموقع", Toast.LENGTH_SHORT).show();
            return;
        }

        fusedLocationClient.getLastLocation()
                .addOnSuccessListener(this, location -> {
                    if (location != null) {
                        double longitude = location.getLongitude();
                        double altitude = location.getAltitude();

                        log=String.valueOf(longitude);
                        lud=String.valueOf(altitude);

                        HashMap<String, String> user = db.getUserDetails();
                        sendDataToServer(log,lud,user.get("uid"),Ust);

                        //Toast.makeText(this, Ust, Toast.LENGTH_SHORT).show();

                    } else {
                        Toast.makeText(this, "لايمكن تحديد موقعكل الحالي", Toast.LENGTH_SHORT).show();
                    }
                });
    }


    public void sendDataToServer(String name, String email,String uid,String Ust) {
        new Thread(() -> {
            try {
                URL url = new URL(AppConfig.URL_insert_loctions); // Replace with your actual URL
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                conn.setRequestMethod("POST");
                conn.setDoOutput(true);
                conn.setDoInput(true);

                String postData = "name=" + URLEncoder.encode(name, "UTF-8") +
                        "&email=" + URLEncoder.encode(email, "UTF-8") +
                        "&uid=" + URLEncoder.encode(uid, "UTF-8") +
                        "&ust=" + URLEncoder.encode(Ust, "UTF-8");

                OutputStream os = conn.getOutputStream();
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(os, "UTF-8"));
                writer.write(postData);
                writer.flush();
                writer.close();
                os.close();

                int responseCode = conn.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(conn.getInputStream()));
                    String inputLine;
                    StringBuilder response = new StringBuilder();

                    while ((inputLine = in.readLine()) != null) {
                        response.append(inputLine);
                    }
                    in.close();

                    Log.d("Server Response", response.toString());
                } else {
                    Log.e("HTTP Error", "Server returned response code: " + responseCode);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
    }


    public void fetchUseron(String username, Context context, SwitchCompat outputTextView) {
        String url = AppConfig.URL_select_user_online; // Replace with your actual URL

        StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
                response -> {
                    try {
                        JSONObject jsonObject = new JSONObject(response);
                        if (jsonObject.has("phone")) {
                            String phone = jsonObject.getString("phone");
                            if(phone.equals("1")) {
                                outputTextView.setChecked(true);
                            }
                        } else {
                            outputTextView.setChecked(false);
                        }
                    } catch (JSONException e) {
                        outputTextView.setChecked(false);
                    }
                },
                error ->  outputTextView.setChecked(false)
        ) {
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<>();
                params.put("username", username);
                return params;
            }
        };

        RequestQueue queue = Volley.newRequestQueue(context);
        queue.add(stringRequest);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (item.getItemId() == R.id.add) {

        }

        if (item.getItemId() == R.id.reset) {
            // handle it
        }


        if (item.getItemId() == R.id.about) {
            // handle it
        }


        if (item.getItemId() == R.id.exit) {

            session.setLogin(false);

            db.deleteUsers();

            // Launching the login activity
            Intent intent = new Intent(Home.this, LoginActivity.class);
            startActivity(intent);
            finish();
        }

        return(super.onOptionsItemSelected(item));
    }


    private class FetchData extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... voids) {
            try {
                URL url = new URL(AppConfig.URL_Workers_on);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(conn.getInputStream())
                );
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
                reader.close();
                return sb.toString();
            } catch (Exception e) {
                return null;
            }
        }

        @Override
        protected void onPostExecute(String result) {
            if (result != null) {
                try {
                    JSONObject json = new JSONObject(result);
                    String message = json.getString("message");

                    new AlertDialog.Builder(Home.this)
                            .setTitle("تنبيه")
                            .setMessage(message)
                            .setPositiveButton("فهمت", null)
                            .show();

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    private void fetchData() {
        String url = AppConfig.URL_Ads; // Replace with your API URL

        RequestQueue queue = Volley.newRequestQueue(this);
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                response -> {
                    try {
                        String title = response.getString("title");
                        String imageUrl = response.getString("image_url");

                        amazonDesc.setText(title);
                        Glide.with(this).load(imageUrl).into(amazonImage);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                },
                error -> Toast.makeText(this, "Failed to load data", Toast.LENGTH_SHORT).show()
        );
        queue.add(request);
    }



}
