use std::error::Error;

use ratatui::widgets::TableState;
use sqlite::Connection;

use crate::{data_layer, entities::*};

pub struct TrxTable {
    trx: Vec<Transaction>,
    ac_id: i64,
    pub state: TableState,
}
impl TrxTable {
    pub fn new() -> TrxTable {
        let mut list_state = TableState::default();
        list_state.select_first();
        return TrxTable {
            trx: Vec::new(),
            state: list_state,
            ac_id: 0,
        };
    }

    pub fn get_trx(
        &mut self,
        ac_id: i64,
        con: &Connection,
    ) -> Result<Vec<Transaction>, Box<dyn Error>> {
        if ac_id == -1 {
            return Ok(Vec::new());
        }
        if self.trx.iter().count() == 0 || self.ac_id != ac_id {
            self.ac_id = ac_id;
            self.trx = data_layer::get_account_transactions(con, ac_id)?;
        }
        return Ok(self.trx.clone());
    }

    pub fn selected_tr(&self) -> Transaction {
        if let Some(i) = self.state.selected() {
            match self.trx.get(i) {
                Some(t) => return t.clone(),
                None => return Transaction::new_empty(),
            }
        }
        return Transaction::new_empty();
    }

    pub fn add_tr(&mut self, tr: Transaction) {
        self.trx.insert(0, tr);
    }
}