import UIKit

/**
 * 4399 账号领取示例
 *
 * 前置条件：
 * 1. 在 Podfile 中添加极验 iOS SDK: pod 'GeetestBind4'
 * 2. 或手动集成极验 SDK Framework
 */

class ClaimViewController: UIViewController {

    // MARK: - 配置
    private let claimAPI = "https://4399.fzyidc.com/api_claim.php"
    private let captchaID = "d6545edb20e9d3af0ba00c7549cd27c6"
    private let claimLimit = 3

    // MARK: - UI
    @IBOutlet weak var claimButton: UIButton!
    @IBOutlet weak var countLabel: UILabel!
    @IBOutlet weak var resultView: UIView!
    @IBOutlet weak var resultLabel: UILabel!
    @IBOutlet weak var usernameLabel: UILabel!
    @IBOutlet weak var passwordLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        updateCountUI()
        initGeetest()
    }

    // MARK: - 初始化极验
    func initGeetest() {
        // 参考极验官方文档集成 iOS SDK
        // https://docs.geetest.com/gt4/guide/start/ios

        // let config = GTBindConfiguration(captchaID: captchaID)
        // GTBind.init(config) { result in
        //     print("极验初始化完成")
        // }

        print("极验 SDK 初始化完成（请参考官方文档集成）")
    }

    // MARK: - 领取按钮
    @IBAction func handleClaim(_ sender: UIButton) {
        let remaining = getRemainingCount()
        guard remaining > 0 else {
            showAlert(message: "今日领取次数已用完")
            return
        }

        claimButton.isEnabled = false
        claimButton.setTitle("验证中...", for: .normal)

        // 调起极验验证
        // 以下为示意代码，实际需根据极验 SDK 文档调用：
        //
        // let dialog = GTBindDialog()
        // dialog.geetestDelegate = self
        // dialog.show(in: self)

        // === 临时提示 ===
        showAlert(message: "请先集成极验 iOS SDK")
        resetButton()
    }

    // MARK: - 调用领取接口
    func doClaim(lotNumber: String, captchaOutput: String, passToken: String, genTime: String) {
        claimButton.setTitle("领取中...", for: .normal)

        var components = URLComponents(string: claimAPI)!
        components.queryItems = [
            URLQueryItem(name: "lot_number", value: lotNumber),
            URLQueryItem(name: "captcha_output", value: captchaOutput),
            URLQueryItem(name: "pass_token", value: passToken),
            URLQueryItem(name: "gen_time", value: genTime)
        ]

        // 改为 POST
        var request = URLRequest(url: URL(string: claimAPI)!)
        request.httpMethod = "POST"
        request.httpBody = "lot_number=\(lotNumber)&captcha_output=\(captchaOutput)&pass_token=\(passToken)&gen_time=\(genTime)"
            .data(using: .utf8)
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

        URLSession.shared.dataTask(with: request) { [weak self] data, _, error in
            guard let self = self else { return }

            if let error = error {
                DispatchQueue.main.async {
                    self.showAlert(message: "网络错误: \(error.localizedDescription)")
                    self.resetButton()
                }
                return
            }

            guard let data = data,
                  let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
                  let success = json["success"] as? Bool else {
                DispatchQueue.main.async {
                    self.showAlert(message: "数据解析失败")
                    self.resetButton()
                }
                return
            }

            DispatchQueue.main.async {
                if success {
                    self.incrementCount()

                    if let dataDict = json["data"] as? [String: String],
                       let username = dataDict["username"],
                       let password = dataDict["password"] {
                        self.resultView.isHidden = false
                        self.resultLabel.text = "✅ 领取成功！"
                        self.usernameLabel.text = "账号: \(username)"
                        self.passwordLabel.text = "密码: \(password)"
                    }
                } else {
                    let msg = json["message"] as? String ?? "未知错误"
                    self.showAlert(message: msg)
                }
                self.resetButton()
            }
        }.resume()
    }

    // MARK: - 辅助方法
    func resetButton() {
        claimButton.isEnabled = true
        claimButton.setTitle("🎮 点击领取账号", for: .normal)
    }

    func showAlert(message: String) {
        let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .default))
        present(alert, animated: true)
    }

    // MARK: - 本地次数管理
    func getRemainingCount() -> Int {
        let defaults = UserDefaults.standard
        let savedDate = defaults.string(forKey: "claim_date") ?? ""
        let today = ISO8601DateFormatter().string(from: Date()).prefix(10).description

        if savedDate == today {
            let count = defaults.integer(forKey: "claim_count")
            return max(0, claimLimit - count)
        }
        return claimLimit
    }

    func incrementCount() {
        let defaults = UserDefaults.standard
        let today = ISO8601DateFormatter().string(from: Date()).prefix(10).description
        let savedDate = defaults.string(forKey: "claim_date") ?? ""

        var count: Int
        if savedDate == today {
            count = defaults.integer(forKey: "claim_count") + 1
        } else {
            count = 1
        }

        defaults.set(today, forKey: "claim_date")
        defaults.set(count, forKey: "claim_count")
        updateCountUI()
    }

    func updateCountUI() {
        let remaining = getRemainingCount()
        countLabel.text = "今日剩余: \(remaining) / \(claimLimit)"
    }
}

// MARK: - 极验代理（集成 SDK 后启用）
// extension ClaimViewController: GTBindDelegate {
//     func geetestBindSuccess(_ result: GTBindResult) {
//         doClaim(
//             lotNumber: result.lotNumber,
//             captchaOutput: result.captchaOutput,
//             passToken: result.passToken,
//             genTime: result.genTime
//         )
//     }
//
//     func geetestBindFailed() {
//         resetButton()
//         showAlert(message: "验证失败，请重试")
//     }
// }
