/*
=============================================================
  易盾识别 Demo (Rust版)

  功能说明：
  提交易盾验证码识别任务

  使用方法：
  1. 确保已安装 Rust / Cargo（建议 stable 版本）
  2. 执行：
       cargo add reqwest --features blocking,json,rustls-tls
       cargo add serde_json
  3. 将下方的 APPKEY / YIDUN_ID / YIDUN_REFERER 替换为你自己的值
  4. 运行脚本：cargo run --bin recognize_yidun
=============================================================
*/

use reqwest::blocking::Client;
use serde_json::Value;
use std::collections::HashMap;
use std::error::Error;
use std::process;
use std::time::Duration;

const APPKEY: &str = "你的appkey";
const YIDUN_ID: &str = "你获取到的易盾id";
const YIDUN_REFERER: &str = "你获取到的referer地址";
const ITEM_ID: &str = "500";
const PROXY: &str = "";
const DEVKEY: &str = "";
const API_BASE: &str = "http://api.ttocr.com/api";

fn recognize_yidun() -> Result<Value, Box<dyn Error>> {
    let client = Client::builder().timeout(Duration::from_secs(60)).build()?;
    let mut params = HashMap::new();
    params.insert("appkey", APPKEY.to_string());
    params.insert("id", YIDUN_ID.to_string());
    params.insert("referer", YIDUN_REFERER.to_string());
    params.insert("itemid", ITEM_ID.to_string());

    if !PROXY.is_empty() {
        params.insert("proxy", PROXY.to_string());
    }
    if !DEVKEY.is_empty() {
        params.insert("devkey", DEVKEY.to_string());
    }

    println!("[请求参数] id={}", YIDUN_ID);
    println!("[请求参数] referer={}", YIDUN_REFERER);
    println!("[请求参数] itemid={}", ITEM_ID);

    let result: Value = client
        .post(&format!("{}/recognize2", API_BASE))
        .form(&params)
        .send()?
        .json()?;

    if result["status"].as_i64() == Some(1) {
        println!("[成功] 识别成功！耗时：{}ms", result["time"]);
        println!("[识别结果] {}", result["data"]);
    } else {
        println!("[失败] 识别失败，错误信息：{}", result["msg"]);
        println!("[提示] 错误状态码：{}，请参考错误代码表排查", result["status"]);
        println!("[提示] 如果结果无法通过验证，请将返回的 validate 进行 urlencode 编码后再尝试。");
    }

    println!(
        "\n[完整响应] {}",
        serde_json::to_string_pretty(&result).unwrap_or_else(|_| result.to_string())
    );

    Ok(result)
}

fn main() {
    println!("************************************************************");
    println!("  易盾识别 Demo (Rust版)");
    println!("************************************************************");

    if APPKEY == "你的appkey" {
        println!("\n[错误] 请先在代码顶部的配置区域填写你的 APPKEY");
        process::exit(1);
    }
    if YIDUN_ID == "你获取到的易盾id" {
        println!("\n[错误] 请先在代码顶部的配置区域填写 YIDUN_ID 和 YIDUN_REFERER");
        process::exit(1);
    }

    println!("==================================================");
    println!("[易盾识别] 正在提交易盾识别任务...");
    println!("==================================================");

    if let Err(error) = recognize_yidun() {
        println!("[异常] 网络请求出错：{}", error);
        process::exit(1);
    }

    println!("\n==================================================");
    println!("[完成] 识别执行完毕");
    println!("==================================================");
}
