use time::Duration;
use crate::{
enums::{error::MinarrowError, time_units::TimeUnit},
structs::variants::{boolean::BooleanArray, integer::IntegerArray},
};
pub trait DatetimeOps: Sized {
fn year(&self) -> IntegerArray<i32>;
fn month(&self) -> IntegerArray<i32>;
fn day(&self) -> IntegerArray<i32>;
fn hour(&self) -> IntegerArray<i32>;
fn minute(&self) -> IntegerArray<i32>;
fn second(&self) -> IntegerArray<i32>;
fn weekday(&self) -> IntegerArray<i32>;
fn day_of_year(&self) -> IntegerArray<i32>;
fn iso_week(&self) -> IntegerArray<i32>;
fn quarter(&self) -> IntegerArray<i32>;
fn week_of_year(&self) -> IntegerArray<i32>;
fn is_leap_year(&self) -> BooleanArray<()>;
fn add_duration(&self, duration: Duration) -> Result<Self, MinarrowError>;
fn sub_duration(&self, duration: Duration) -> Result<Self, MinarrowError>;
fn add_days(&self, days: i64) -> Result<Self, MinarrowError>;
fn add_months(&self, months: i32) -> Result<Self, MinarrowError>;
fn add_years(&self, years: i32) -> Result<Self, MinarrowError>;
fn diff(&self, other: &Self, unit: TimeUnit) -> Result<IntegerArray<i64>, MinarrowError>;
fn abs_diff(&self, other: &Self, unit: TimeUnit) -> Result<IntegerArray<i64>, MinarrowError>;
fn is_before(&self, other: &Self) -> Result<BooleanArray<()>, MinarrowError>;
fn is_after(&self, other: &Self) -> Result<BooleanArray<()>, MinarrowError>;
fn between(&self, start: &Self, end: &Self) -> Result<BooleanArray<()>, MinarrowError>;
fn truncate(&self, unit: &str) -> Result<Self, MinarrowError>;
fn us(&self) -> Self;
fn ms(&self) -> Self;
fn sec(&self) -> Self;
fn min(&self) -> Self;
fn hr(&self) -> Self;
fn week(&self) -> Self;
fn cast_time_unit(&self, new_unit: TimeUnit) -> Result<Self, MinarrowError>;
}