Documentation
use crate::dcl::Pan;
use crate::dcl::PeaAssVar;
use crate::dcl::VarType;
use crate::dcl::SSHOW_YEAR_BEG;
use crate::dcl::SSHOW_YEAR_END;
use crate::utl::get_sbrw00;
use crate::utl::get_scurv;
use askama::Template;
use askama_web::WebTemplate;

pub struct WebTempRow {
    sbid: String,
    pvid: String,
    note: String,
    evrt: f32,
    evgr: Vec<f32>,
}

#[derive(Template, WebTemplate)]
#[template(path = "p07.html")]
pub struct WebTemp {
    name: String,
    rows: Vec<WebTempRow>,
}

pub const PROV: [&str; 25] = [
    "สมุทรสาคร",
    "พระนครศรีอยุธยา",
    "ปทุมธานี",
    "ชลบุรี",
    "ระยอง",
    "ฉะเชิงเทรา",
    "นครปฐม",
    "ปราจีนบุรี",
    "สงขลา",
    "ราชบุรี",
    "ภูเก็ต",
    "นครสวรรค์",
    "ระนอง",
    "สมุทรสงคราม",
    "กระบี่",
    "เพชรบุรี",
    "สุราษฎร์ธานี",
    "สระบุรี",
    "นครราชสีมา",
    "เชียงใหม่",
    "พิษณุโลก",
    "ขอนแก่น",
    "ลพบุรี",
    "บุรีรัมย์",
    "สระแก้ว",
];

use crate::utl::get_pvrw00;
use std::collections::HashMap;

pub async fn p07() -> WebTemp {
    let pvrw = get_pvrw00();
    println!("pvrw:{}", pvrw.len());
    let mut pvasm = HashMap::<String, PeaAssVar>::new();
    for a in pvrw {
        pvasm.insert(a.pvid.to_string(), a.clone());
    }
    let sbrw = get_sbrw00();
    let mut pvrwm = HashMap::<String, usize>::new();
    let mut pvrwv = Vec::<PeaAssVar>::new();
    for (i, pv) in PROV.iter().enumerate() {
        let pv = pv.to_string();
        let Some(a) = pvasm.get(&pv) else {
            println!("error {}", pv);
            continue;
        };
        pvrwv.push(a.clone());
        pvrwm.insert(pv.to_string(), i);
    }
    let mut cn = 0;
    for sr in sbrw.iter() {
        let note = format!("{}", sr.v[VarType::TakeNote as usize].v);
        if note != "1" {
            continue;
        }
        if sr.sbid == "SQB" {
            continue;
        }
        let pv = sr.pvid.to_string();
        let Some(pvi) = pvrwm.get_mut(&pv) else {
            println!("error {pv}");
            continue;
        };
        cn += 1;
        pvrwv[*pvi].add(sr);
    }
    let evs: f32 = sbrw
        .iter()
        .map(|sr| sr.v[VarType::NoHmChgEvTr as usize].v)
        .sum();
    let mut evcs2 = vec![0f32; sbrw.len()];
    for (i, sr) in pvrwv.iter().enumerate() {
        evcs2[i] = sr.v[VarType::NoHmChgEvTr as usize].v / evs;
    }
    println!("cnt: {cn}");
    let mut rows2 = Vec::<WebTempRow>::new();
    let mut bbbs = vec![0.0; 20];
    for (_, sr) in pvrwv.iter().enumerate() {
        let evgr = get_scurv();
        let b8 = sr.vy[VarType::FirBilAccu.tousz()].clone();
        let mut ben = vec![0.0; b8.len()];
        for vi in VarType::FirBilAccu.tousz()..=VarType::FirDataEntrySave.tousz() {
            let mut bbs = 0.0;
            for (bi, bn) in ben.iter_mut().enumerate() {
                *bn += sr.vy[vi][bi];
                bbs += sr.vy[vi][bi];
            }
            bbbs[vi - VarType::FirBilAccu.tousz()] += bbs;
        }
        let mut ben2 = vec![0.0; 3];
        ben2.append(&mut ben);
        println!("{} - ev:{} b8:{}", sr.pvid, evgr.len(), ben2.len());
        let rw = WebTempRow {
            sbid: sr.sbid.to_string(),
            pvid: sr.pvid.to_string(),
            note: "".to_string(),
            evrt: 0.0,
            evgr: ben2,
        };
        rows2.push(rw);
    }
    for (i, bbb) in bbbs.iter().enumerate() {
        let i = i + 1;
        let bbb = bbb / 1_000_000.0;
        println!("{i} - {bbb}");
    }

    WebTemp {
        name: "Year Baht for Charge EV - p06".to_string(),
        rows: rows2,
    }
}