package com.vpnpanel;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.LinearLayout;
import android.content.Intent;
import android.content.SharedPreferences;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.button.MaterialButton;
import com.google.android.material.card.MaterialCardView;
import com.google.android.material.progressindicator.CircularProgressIndicator;

import java.util.ArrayList;
import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity {

    private MaterialButton btnConnect;
    private TextView tvStatus;
    private TextView tvTrafficUsed;
    private TextView tvTrafficTotal;
    private TextView tvExpiryDate;
    private CircularProgressIndicator progressIndicator;
    private RecyclerView recyclerServers;
    private LinearLayout layoutNotSubscribed;
    
    private VPNManager vpnManager;
    private ApiService apiService;
    private ServerAdapter serverAdapter;
    
    private boolean isConnected = false;
    private Server selectedServer = null;
    private Subscription currentSubscription = null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        initViews();
        initManagers();
        checkLoginStatus();
    }
    
    private void initViews() {
        btnConnect = findViewById(R.id.btnConnect);
        tvStatus = findViewById(R.id.tvStatus);
        tvTrafficUsed = findViewById(R.id.tvTrafficUsed);
        tvTrafficTotal = findViewById(R.id.tvTrafficTotal);
        tvExpiryDate = findViewById(R.id.tvExpiryDate);
        progressIndicator = findViewById(R.id.progressIndicator);
        recyclerServers = findViewById(R.id.recyclerServers);
        layoutNotSubscribed = findViewById(R.id.layoutNotSubscribed);
        
        // لیست سرورها
        recyclerServers.setLayoutManager(new LinearLayoutManager(this));
        serverAdapter = new ServerAdapter(new ArrayList<>(), this::onServerSelected);
        recyclerServers.setAdapter(serverAdapter);
        
        // دکمه اتصال
        btnConnect.setOnClickListener(v -> toggleConnection());
        
        // دکمه خرید اشتراک
        findViewById(R.id.btnBuySubscription).setOnClickListener(v -> {
            startActivity(new Intent(this, PlansActivity.class));
        });
        
        // دکمه پروفایل
        findViewById(R.id.btnProfile).setOnClickListener(v -> {
            startActivity(new Intent(this, ProfileActivity.class));
        });
    }
    
    private void initManagers() {
        vpnManager = new VPNManager(this);
        apiService = ApiClient.getClient().create(ApiService.class);
    }
    
    private void checkLoginStatus() {
        SharedPreferences prefs = getSharedPreferences("VPNPanel", MODE_PRIVATE);
        String token = prefs.getString("token", null);
        
        if (token == null) {
            // کاربر لاگین نکرده - به صفحه ورود برو
            startActivity(new Intent(this, LoginActivity.class));
            finish();
            return;
        }
        
        // بارگذاری اطلاعات کاربر
        loadUserData();
    }
    
    private void loadUserData() {
        progressIndicator.setVisibility(View.VISIBLE);
        
        // دریافت اشتراک فعال
        apiService.getMySubscriptions().enqueue(new Callback<SubscriptionResponse>() {
            @Override
            public void onResponse(Call<SubscriptionResponse> call, Response<SubscriptionResponse> response) {
                progressIndicator.setVisibility(View.GONE);
                
                if (response.isSuccessful() && response.body() != null) {
                    List<Subscription> subscriptions = response.body().getSubscriptions();
                    
                    if (subscriptions != null && !subscriptions.isEmpty()) {
                        // اشتراک فعال دارد
                        currentSubscription = subscriptions.get(0);
                        showSubscriptionUI();
                        loadServers();
                    } else {
                        // اشتراک فعال ندارد
                        showNoSubscriptionUI();
                    }
                } else {
                    Toast.makeText(MainActivity.this, "خطا در دریافت اطلاعات", Toast.LENGTH_SHORT).show();
                }
            }
            
            @Override
            public void onFailure(Call<SubscriptionResponse> call, Throwable t) {
                progressIndicator.setVisibility(View.GONE);
                Toast.makeText(MainActivity.this, "خطا در اتصال به سرور", Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    private void showSubscriptionUI() {
        layoutNotSubscribed.setVisibility(View.GONE);
        recyclerServers.setVisibility(View.VISIBLE);
        btnConnect.setEnabled(true);
        
        // نمایش اطلاعات اشتراک
        if (currentSubscription != null) {
            long usedGB = currentSubscription.getTrafficUsed() / (1024 * 1024 * 1024);
            long totalGB = currentSubscription.getTrafficLimit() / (1024 * 1024 * 1024);
            
            tvTrafficUsed.setText(usedGB + " GB");
            tvTrafficTotal.setText("از " + totalGB + " GB");
            tvExpiryDate.setText("تا " + currentSubscription.getExpiryDate());
        }
    }
    
    private void showNoSubscriptionUI() {
        layoutNotSubscribed.setVisibility(View.VISIBLE);
        recyclerServers.setVisibility(View.GONE);
        btnConnect.setEnabled(false);
        tvStatus.setText("بدون اشتراک");
    }
    
    private void loadServers() {
        apiService.getServers().enqueue(new Callback<ServerResponse>() {
            @Override
            public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) {
                if (response.isSuccessful() && response.body() != null) {
                    List<Server> servers = response.body().getServers();
                    serverAdapter.updateServers(servers);
                    
                    // انتخاب اولین سرور به صورت پیش‌فرض
                    if (!servers.isEmpty() && selectedServer == null) {
                        selectedServer = servers.get(0);
                        serverAdapter.setSelectedServer(selectedServer);
                    }
                }
            }
            
            @Override
            public void onFailure(Call<ServerResponse> call, Throwable t) {
                Toast.makeText(MainActivity.this, "خطا در دریافت لیست سرورها", Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    private void onServerSelected(Server server) {
        selectedServer = server;
        
        // قطع اتصال قبلی
        if (isConnected) {
            vpnManager.disconnect();
            isConnected = false;
            updateConnectionUI();
        }
    }
    
    private void toggleConnection() {
        if (selectedServer == null) {
            Toast.makeText(this, "لطفا یک سرور انتخاب کنید", Toast.LENGTH_SHORT).show();
            return;
        }
        
        if (isConnected) {
            disconnect();
        } else {
            connect();
        }
    }
    
    private void connect() {
        if (currentSubscription == null) {
            Toast.makeText(this, "ابتدا یک اشتراک خریداری کنید", Toast.LENGTH_SHORT).show();
            return;
        }
        
        btnConnect.setEnabled(false);
        tvStatus.setText("در حال اتصال...");
        
        // دریافت کانفیگ V2Ray از سرور
        apiService.getV2RayConfig(selectedServer.getId()).enqueue(new Callback<ConfigResponse>() {
            @Override
            public void onResponse(Call<ConfigResponse> call, Response<ConfigResponse> response) {
                if (response.isSuccessful() && response.body() != null) {
                    String config = response.body().getConfig();
                    
                    // اتصال به VPN
                    vpnManager.connect(config, new VPNManager.VPNCallback() {
                        @Override
                        public void onConnected() {
                            runOnUiThread(() -> {
                                isConnected = true;
                                updateConnectionUI();
                                Toast.makeText(MainActivity.this, "متصل شد", Toast.LENGTH_SHORT).show();
                            });
                        }
                        
                        @Override
                        public void onDisconnected() {
                            runOnUiThread(() -> {
                                isConnected = false;
                                updateConnectionUI();
                            });
                        }
                        
                        @Override
                        public void onError(String error) {
                            runOnUiThread(() -> {
                                btnConnect.setEnabled(true);
                                tvStatus.setText("قطع شده");
                                Toast.makeText(MainActivity.this, "خطا: " + error, Toast.LENGTH_SHORT).show();
                            });
                        }
                    });
                } else {
                    btnConnect.setEnabled(true);
                    tvStatus.setText("قطع شده");
                    Toast.makeText(MainActivity.this, "خطا در دریافت کانفیگ", Toast.LENGTH_SHORT).show();
                }
            }
            
            @Override
            public void onFailure(Call<ConfigResponse> call, Throwable t) {
                btnConnect.setEnabled(true);
                tvStatus.setText("قطع شده");
                Toast.makeText(MainActivity.this, "خطا در اتصال", Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    private void disconnect() {
        vpnManager.disconnect();
        isConnected = false;
        updateConnectionUI();
        Toast.makeText(this, "قطع شد", Toast.LENGTH_SHORT).show();
    }
    
    private void updateConnectionUI() {
        btnConnect.setEnabled(true);
        
        if (isConnected) {
            btnConnect.setText("قطع اتصال");
            btnConnect.setBackgroundColor(getColor(R.color.red_500));
            tvStatus.setText("متصل به " + (selectedServer != null ? selectedServer.getLocation() : "سرور"));
            tvStatus.setTextColor(getColor(R.color.green_500));
        } else {
            btnConnect.setText("اتصال");
            btnConnect.setBackgroundColor(getColor(R.color.primary));
            tvStatus.setText("قطع شده");
            tvStatus.setTextColor(getColor(R.color.gray_500));
        }
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (vpnManager != null) {
            vpnManager.cleanup();
        }
    }
}
