import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import org.json.JSONObject;

import java.io.IOException;

import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * 4399 账号领取示例
 * 
 * 前置条件：
 * 1. 在 build.gradle 中添加极验 Android SDK 依赖
 * 2. 在 AndroidManifest.xml 中添加网络权限
 *    <uses-permission android:name="android.permission.INTERNET" />
 */
public class ClaimActivity extends AppCompatActivity {

    private static final String TAG = "Claim4399";
    private static final String CLAIM_API = "https://4399.fzyidc.com/api_claim.php";
    private static final String CAPTCHA_ID = "d6545edb20e9d3af0ba00c7549cd27c6";
    private static final int CLAIM_LIMIT = 3;

    private Button claimBtn;
    private TextView countText;
    private TextView resultText;
    private OkHttpClient client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_claim);

        claimBtn = findViewById(R.id.claimBtn);
        countText = findViewById(R.id.countText);
        resultText = findViewById(R.id.resultText);

        client = new OkHttpClient();

        // 初始化极验
        initGeetest();

        // 更新次数显示
        updateCountUI();

        // 领取按钮
        claimBtn.setOnClickListener(v -> handleClaim());
    }

    /**
     * 初始化极验 GT4 SDK
     */
    private void initGeetest() {
        // 参考极验官方文档集成 Android SDK
        // https://docs.geetest.com/gt4/guide/start/android
        
        // GeetestConfig geetestConfig = new GeetestConfig.Builder()
        //     .captchaId(CAPTCHA_ID)
        //     .product(GeetestConfig.ProductType.BIND)
        //     .build();
        //
        // Geetest.init(geetestConfig, this);

        Log.d(TAG, "极验 SDK 初始化完成（请参考官方文档集成）");
    }

    /**
     * 处理领取
     */
    private void handleClaim() {
        int remaining = getRemainingCount();
        if (remaining <= 0) {
            Toast.makeText(this, "今日领取次数已用完", Toast.LENGTH_SHORT).show();
            return;
        }

        claimBtn.setEnabled(false);
        claimBtn.setText("验证中...");

        // 调起极验验证
        // 以下为示意代码，实际需根据极验 SDK 文档调用：
        //
        // GeetestDialog dialog = new GeetestDialog();
        // dialog.setGeetestListener(new GeetestListener() {
        //     @Override
        //     public void onGeetestVerifySuccess(GeetestResult result) {
        //         // 验证成功，拿到参数
        //         String lotNumber = result.getLotNumber();
        //         String captchaOutput = result.getCaptchaOutput();
        //         String passToken = result.getPassToken();
        //         String genTime = result.getGenTime();
        //
        //         doClaim(lotNumber, captchaOutput, passToken, genTime);
        //     }
        //
        //     @Override
        //     public void onGeetestVerifyFailed(GeetestResult result) {
        //         claimBtn.setEnabled(true);
        //         claimBtn.setText("🎮 点击领取账号");
        //     }
        // });
        //
        // dialog.show(getSupportFragmentManager(), "geetest");

        // === 临时测试：直接调用接口 ===
        Toast.makeText(this, "请先集成极验 Android SDK", Toast.LENGTH_LONG).show();
        claimBtn.setEnabled(true);
        claimBtn.setText("🎮 点击领取账号");
    }

    /**
     * 调用领取接口
     */
    private void doClaim(String lotNumber, String captchaOutput, String passToken, String genTime) {
        claimBtn.setText("领取中...");

        RequestBody body = new FormBody.Builder()
                .add("lot_number", lotNumber)
                .add("captcha_output", captchaOutput)
                .add("pass_token", passToken)
                .add("gen_time", genTime)
                .build();

        Request request = new Request.Builder()
                .url(CLAIM_API)
                .post(body)
                .build();

        // 异步请求
        client.newCall(request).enqueue(new okhttp3.Callback() {
            @Override
            public void onFailure(okhttp3.Call call, IOException e) {
                runOnUiThread(() -> {
                    Toast.makeText(ClaimActivity.this, "网络错误", Toast.LENGTH_SHORT).show();
                    resetBtn();
                });
            }

            @Override
            public void onResponse(okhttp3.Call call, Response response) throws IOException {
                try {
                    String json = response.body().string();
                    JSONObject obj = new JSONObject(json);
                    boolean success = obj.getBoolean("success");

                    runOnUiThread(() -> {
                        if (success) {
                            // 增加本地计数
                            incrementCount();

                            JSONObject data = obj.getJSONObject("data");
                            String username = data.getString("username");
                            String password = data.getString("password");

                            resultText.setText("✅ 领取成功！\n账号: " + username + "\n密码: " + password);
                            resultText.setVisibility(android.view.View.VISIBLE);
                        } else {
                            String msg = obj.getString("message");
                            resultText.setText("❌ " + msg);
                            resultText.setVisibility(android.view.View.VISIBLE);
                        }
                        resetBtn();
                    });
                } catch (Exception e) {
                    runOnUiThread(() -> {
                        Toast.makeText(ClaimActivity.this, "解析失败", Toast.LENGTH_SHORT).show();
                        resetBtn();
                    });
                }
            }
        });
    }

    private void resetBtn() {
        claimBtn.setEnabled(true);
        claimBtn.setText("🎮 点击领取账号");
    }

    // ========== 本地次数管理 ==========

    private int getRemainingCount() {
        android.content.SharedPreferences prefs = getSharedPreferences("claim", MODE_PRIVATE);
        String savedDate = prefs.getString("date", "");
        String today = new java.text.SimpleDateFormat("yyyy-MM-dd", java.util.Locale.getDefault())
                .format(new java.util.Date());

        if (savedDate.equals(today)) {
            int count = prefs.getInt("count", 0);
            return Math.max(0, CLAIM_LIMIT - count);
        }
        return CLAIM_LIMIT;
    }

    private void incrementCount() {
        android.content.SharedPreferences prefs = getSharedPreferences("claim", MODE_PRIVATE);
        String today = new java.text.SimpleDateFormat("yyyy-MM-dd", java.util.Locale.getDefault())
                .format(new java.util.Date());
        String savedDate = prefs.getString("date", "");

        int count;
        if (savedDate.equals(today)) {
            count = prefs.getInt("count", 0) + 1;
        } else {
            count = 1;
        }

        prefs.edit()
                .putString("date", today)
                .putInt("count", count)
                .apply();

        updateCountUI();
    }

    private void updateCountUI() {
        int remaining = getRemainingCount();
        countText.setText("今日剩余: " + remaining + " / " + CLAIM_LIMIT);
    }
}
