use crate::api::vtop::types::profile::{GradeHistory, MentorDetails, StudentProfileAllView};
use scraper::{Html, Selector};
pub fn parse_student_profile(html: String) -> StudentProfileAllView {
let doc = Html::parse_document(&html);
fn extract_table_value(doc: &Html, label: &str) -> String {
let selector = Selector::parse("tr").unwrap();
let td_selector = Selector::parse("td").unwrap();
for row in doc.select(&selector) {
let mut tds = row.select(&td_selector);
if let Some(label_td) = tds.next() {
let label_text = label_td.text().collect::<String>().trim().to_uppercase();
if label_text.contains(&label.to_uppercase()) {
if let Some(val_td) = tds.next() {
return val_td.text().collect::<String>().trim().to_string();
}
}
}
}
"".to_string()
}
fn extract_table_value_any(doc: &Html, label: &str) -> String {
let selector = Selector::parse("tr").unwrap();
for row in doc.select(&selector) {
let tds: Vec<_> = row.select(&Selector::parse("td").unwrap()).collect();
if tds.len() >= 2 {
let label_text = tds[0].text().collect::<String>().trim().to_uppercase();
if label_text.contains(&label.to_uppercase()) {
return tds[1].text().collect::<String>().trim().to_string();
}
}
}
"".to_string()
}
let mut base64_pfp = String::new();
let img_selector = Selector::parse("img.img.border.border-primary").unwrap();
if let Some(img) = doc.select(&img_selector).next() {
if let Some(src) = img.value().attr("src") {
if let Some(idx) = src.find("base64,") {
let start = idx + 7;
if start < src.len() {
base64_pfp = src[start..].to_string();
}
}
}
}
let application_number = extract_table_value(&doc, "APPLICATION NUMBER");
let student_name = extract_table_value(&doc, "STUDENT NAME");
let dob = extract_table_value(&doc, "DATE OF BIRTH");
let gender = extract_table_value(&doc, "GENDER");
let blood_group = extract_table_value(&doc, "BLOOD GROUP");
let email = extract_table_value(&doc, "EMAIL");
let mentor_section_selector = Selector::parse("div.accordion-item").unwrap();
let mut mentor_html = None;
for section in doc.select(&mentor_section_selector) {
if section.html().to_uppercase().contains("PROCTOR INFORMATION") {
mentor_html = Some(Html::parse_fragment(§ion.html()));
break;
}
}
let mentor_doc = mentor_html.as_ref();
let mentor = |label: &str| {
if let Some(doc) = mentor_doc {
extract_table_value_any(doc, label)
} else {
"".to_string()
}
};
let mentor_details = MentorDetails {
faculty_id: mentor("FACULTY ID"),
faculty_name: mentor("FACULTY NAME"),
faculty_designation: mentor("FACULTY DESIGNATION"),
school: mentor("SCHOOL"),
cabin: mentor("CABIN"),
faculty_department: mentor("FACULTY DEPARTMENT"),
faculty_email: mentor("FACULTY EMAIL"),
faculty_intercom: mentor("FACULTY INTERCOM"),
faculty_mobile_number: mentor("FACULTY MOBILE NUMBER"),
};
let grade_history = GradeHistory {
credits_registered: "N/A".to_string(),
credits_earned: "N/A".to_string(),
cgpa: "N/A".to_string(),
};
StudentProfileAllView {
application_number,
student_name,
dob,
gender,
blood_group,
email,
base64_pfp,
grade_history,
mentor_details,
}
}