use super::common::*;
use super::srp_analyser::*;


/*
 * Creates a readable representation of the analysis and the given information.
 */
pub fn format_analysis(analysis: &Vec<AnalysedTask>, tasks: &Tasks, ip: &IdPrio, tr: &TaskResources) -> String {
    let overview = format_overview(tasks, ip, tr);

    let mut body = String::new();
    for at in analysis {
        body = format!("{}\n{}", body, format_analysed_task(at));
    }

    body = format!("{}\n", body);

    for t in tasks {
        body = format!("{}\n{}", body, format_task(t));
    }

    return format!("{}\n{}", overview, body);
}


/*
 * Creates the overview section of the readable representation.
 */
pub fn format_overview(tasks: &Tasks, ip: &IdPrio, tr: &TaskResources) -> String {
    // Formats the names of all the tasks.
    fn format_task_names(tasks: &Tasks) -> String {
        let mut task_names = "Tasks:".to_string();
        for t in tasks {
            task_names = format!("{} {}", task_names, t.id);
        } 
        return task_names;
    }

    // Formats the Id and priority of tasks.
    fn format_id_prio(ip: &IdPrio) -> String {
//    let id_prio = format!("Id Priority: {:?}", ip);
        let mut id_prio = "Priority:".to_string();
        for (key, value) in ip {
            id_prio = format!("{}  P({}) = {}", id_prio, key, value);
        }
        return id_prio;
    }

    // Formats the tasks resources.
    fn format_task_res(tr: &TaskResources) -> String {
//    let task_res = format!("Task Resources: {:?}", tr);
        let mut task_res = "Task Resources:".to_string();
        for (key, value) in tr {
            
            let mut values_st = "(".to_string();
            for v in value {
                values_st = format!("{} {}", values_st, v);
            }
            task_res = format!("{} {}:{} )", task_res, key, values_st);
        }
        return task_res;
    }

    let tot_util = format!("Total Util: {}", total_load_factor(tasks));
    let task_names = format_task_names(tasks);
    let id_prio = format_id_prio(ip);
    let task_res = format_task_res(tr);

    return format!("Overview\n\t{}\n\t{}\n\t{}\n\t{}", tot_util, task_names, id_prio, task_res); 
}
 

/*
 * Creates a readable representation of a analysed task.
 */
pub fn format_analysed_task(task: &AnalysedTask) -> String {
    let header = format!("Analysis of {}", task.task.id);
    let res_t = format!("Response Time: {}", task.response_time);
    let wcet = format!("wcet: {}", task.wcet);
    let block_t = format!("Block Time: {}", task.block_time);
    let pre_t = format!("Preemtion Time: {}", task.preemtion_time);
    return format!("{}\n\t{}\n\t{}\n\t{}\n\t{}", header, res_t, wcet, block_t, pre_t);
}


/*
 * Creates a readable representation of a task.
 */
pub fn format_task(task: &Task) -> String {
    let id = format!("Task {}", task.id);
    let prio = format!("Priority: {}", task.prio);
    let dl = format!("Deadline: {}", task.deadline);
    let inter_a = format!("Inter Arrival: {}", task.inter_arrival);
    let trace = format_trace(&task.trace);
    return format!("{}\n\t{}\n\t{}\n\t{}\n\t{}", id, prio, dl, inter_a, trace);
}


/*
 * Creates a readable representation of a trace.
 */
pub fn format_trace(trace: &Trace) -> String {
    return format!("{:?}", trace);
}