package com.vpnpanel.app;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * VPN Panel Android Application
 * Main Activity
 */
public class MainActivity extends AppCompatActivity {

    private static final String API_BASE_URL = "http://YOUR_SERVER_IP/vpn-panel/backend/api/";
    private String authToken = "";
    
    private EditText etUsername, etPassword;
    private Button btnLogin, btnRegister;
    private RecyclerView rvServers;
    private TextView tvStatus;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        initViews();
        setupListeners();
        
        // Check if user is already logged in
        authToken = getSharedPreferences("vpn_prefs", MODE_PRIVATE)
                .getString("auth_token", "");
        
        if (!authToken.isEmpty()) {
            loadServers();
        }
    }
    
    private void initViews() {
        etUsername = findViewById(R.id.et_username);
        etPassword = findViewById(R.id.et_password);
        btnLogin = findViewById(R.id.btn_login);
        btnRegister = findViewById(R.id.btn_register);
        rvServers = findViewById(R.id.rv_servers);
        tvStatus = findViewById(R.id.tv_status);
        
        rvServers.setLayoutManager(new LinearLayoutManager(this));
    }
    
    private void setupListeners() {
        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                login();
            }
        });
        
        btnRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                register();
            }
        });
    }
    
    private void login() {
        String username = etUsername.getText().toString();
        String password = etPassword.getText().toString();
        
        if (username.isEmpty() || password.isEmpty()) {
            Toast.makeText(this, "نام کاربری و رمز عبور را وارد کنید", Toast.LENGTH_SHORT).show();
            return;
        }
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    JSONObject jsonBody = new JSONObject();
                    jsonBody.put("username", username);
                    jsonBody.put("password", password);
                    
                    String response = apiCall("auth/login.php", "POST", jsonBody.toString());
                    JSONObject result = new JSONObject(response);
                    
                    if (result.getBoolean("success")) {
                        authToken = result.getJSONObject("data").getString("token");
                        
                        // Save token
                        getSharedPreferences("vpn_prefs", MODE_PRIVATE)
                                .edit()
                                .putString("auth_token", authToken)
                                .apply();
                        
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this, "ورود موفقیت‌آمیز", Toast.LENGTH_SHORT).show();
                                loadServers();
                            }
                        });
                    } else {
                        showError(result.getString("message"));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    showError("خطا در ورود: " + e.getMessage());
                }
            }
        }).start();
    }
    
    private void register() {
        String username = etUsername.getText().toString();
        String password = etPassword.getText().toString();
        
        if (username.isEmpty() || password.isEmpty()) {
            Toast.makeText(this, "نام کاربری و رمز عبور را وارد کنید", Toast.LENGTH_SHORT).show();
            return;
        }
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    JSONObject jsonBody = new JSONObject();
                    jsonBody.put("username", username);
                    jsonBody.put("email", username + "@example.com");
                    jsonBody.put("password", password);
                    
                    String response = apiCall("auth/register.php", "POST", jsonBody.toString());
                    JSONObject result = new JSONObject(response);
                    
                    if (result.getBoolean("success")) {
                        authToken = result.getJSONObject("data").getString("token");
                        
                        getSharedPreferences("vpn_prefs", MODE_PRIVATE)
                                .edit()
                                .putString("auth_token", authToken)
                                .apply();
                        
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this, "ثبت‌نام موفقیت‌آمیز", Toast.LENGTH_SHORT).show();
                                loadServers();
                            }
                        });
                    } else {
                        showError(result.getString("message"));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    showError("خطا در ثبت‌نام: " + e.getMessage());
                }
            }
        }).start();
    }
    
    private void loadServers() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String response = apiCallWithAuth("servers/list.php", "GET", null);
                    JSONObject result = new JSONObject(response);
                    
                    if (result.getBoolean("success")) {
                        JSONArray servers = result.getJSONObject("data").getJSONArray("servers");
                        
                        List<Server> serverList = new ArrayList<>();
                        for (int i = 0; i < servers.length(); i++) {
                            JSONObject serverObj = servers.getJSONObject(i);
                            Server server = new Server(
                                serverObj.getInt("id"),
                                serverObj.getString("name"),
                                serverObj.getString("location"),
                                serverObj.getString("status")
                            );
                            serverList.add(server);
                        }
                        
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                ServerAdapter adapter = new ServerAdapter(serverList);
                                rvServers.setAdapter(adapter);
                            }
                        });
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    showError("خطا در دریافت سرورها: " + e.getMessage());
                }
            }
        }).start();
    }
    
    private String apiCall(String endpoint, String method, String body) throws Exception {
        URL url = new URL(API_BASE_URL + endpoint);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod(method);
        conn.setRequestProperty("Content-Type", "application/json");
        
        if (body != null) {
            conn.setDoOutput(true);
            OutputStream os = conn.getOutputStream();
            os.write(body.getBytes());
            os.flush();
            os.close();
        }
        
        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        StringBuilder response = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            response.append(line);
        }
        br.close();
        
        return response.toString();
    }
    
    private String apiCallWithAuth(String endpoint, String method, String body) throws Exception {
        URL url = new URL(API_BASE_URL + endpoint);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod(method);
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setRequestProperty("Authorization", "Bearer " + authToken);
        
        if (body != null) {
            conn.setDoOutput(true);
            OutputStream os = conn.getOutputStream();
            os.write(body.getBytes());
            os.flush();
            os.close();
        }
        
        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        StringBuilder response = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            response.append(line);
        }
        br.close();
        
        return response.toString();
    }
    
    private void showError(final String message) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
            }
        });
    }
    
    // Server model class
    class Server {
        int id;
        String name;
        String location;
        String status;
        
        Server(int id, String name, String location, String status) {
            this.id = id;
            this.name = name;
            this.location = location;
            this.status = status;
        }
    }
}
