use crate::model::Position;
use crate::strategies::base::StrategyType;
use crate::strategies::long_call::LONG_CALL_DESCRIPTION;
use crate::strategies::long_put::LONG_PUT_DESCRIPTION;
use crate::strategies::poor_mans_covered_call::PMCC_DESCRIPTION;
use crate::strategies::short_call::SHORT_CALL_DESCRIPTION;
use crate::strategies::short_put::SHORT_PUT_DESCRIPTION;
use crate::strategies::{
    BearCallSpread, BearPutSpread, BullCallSpread, BullPutSpread, CallButterfly, IronButterfly,
    IronCondor, LongButterflySpread, LongCall, LongPut, LongStraddle, LongStrangle,
    PoorMansCoveredCall, ShortButterflySpread, ShortCall, ShortPut, ShortStraddle, ShortStrangle,
};

impl Default for BullCallSpread {
    fn default() -> Self {
        BullCallSpread {
            name: "Bull Call Spread".to_string(),
            kind: StrategyType::BullCallSpread,
            description: crate::strategies::bull_call_spread::BULL_CALL_SPREAD_DESCRIPTION
                .to_string(),
            break_even_points: Vec::new(),
            long_call: Position::default(),
            short_call: Position::default(),
        }
    }
}
impl Default for BearCallSpread {
    fn default() -> Self {
        BearCallSpread {
            name: "Bear Call Spread".to_string(),
            kind: StrategyType::BearCallSpread,
            description: crate::strategies::bear_call_spread::BEAR_CALL_SPREAD_DESCRIPTION
                .to_string(),
            break_even_points: Vec::new(),
            short_call: Position::default(),
            long_call: Position::default(),
        }
    }
}
impl Default for BullPutSpread {
    fn default() -> Self {
        BullPutSpread {
            name: "Bull Put Spread".to_string(),
            kind: StrategyType::BullPutSpread,
            description: crate::strategies::bull_put_spread::BULL_PUT_SPREAD_DESCRIPTION
                .to_string(),
            break_even_points: Vec::new(),
            long_put: Position::default(),
            short_put: Position::default(),
        }
    }
}
impl Default for BearPutSpread {
    fn default() -> Self {
        BearPutSpread {
            name: "Bear Put Spread".to_string(),
            kind: StrategyType::BearPutSpread,
            description: crate::strategies::bear_put_spread::BEAR_PUT_SPREAD_DESCRIPTION
                .to_string(),
            break_even_points: Vec::new(),
            long_put: Position::default(),
            short_put: Position::default(),
        }
    }
}
impl Default for LongButterflySpread {
    fn default() -> Self {
        LongButterflySpread {
            name: "Long Butterfly Spread".to_string(),
            kind: StrategyType::LongButterflySpread,
            description: crate::strategies::long_butterfly_spread::LONG_BUTTERFLY_DESCRIPTION
                .to_string(),
            break_even_points: Vec::new(),
            short_call: Position::default(),
            long_call_low: Position::default(),
            long_call_high: Position::default(),
        }
    }
}
impl Default for ShortButterflySpread {
    fn default() -> Self {
        ShortButterflySpread {
            name: "Short Butterfly Spread".to_string(),
            kind: StrategyType::ShortButterflySpread,
            description: crate::strategies::short_butterfly_spread::SHORT_BUTTERFLY_DESCRIPTION
                .to_string(),
            break_even_points: Vec::new(),
            long_call: Position::default(),
            short_call_low: Position::default(),
            short_call_high: Position::default(),
        }
    }
}
impl Default for IronCondor {
    fn default() -> Self {
        IronCondor {
            name: "Iron Condor".to_string(),
            kind: StrategyType::IronCondor,
            description: crate::strategies::iron_condor::IRON_CONDOR_DESCRIPTION.to_string(),
            break_even_points: Vec::new(),
            short_call: Position::default(),
            short_put: Position::default(),
            long_call: Position::default(),
            long_put: Position::default(),
        }
    }
}
impl Default for IronButterfly {
    fn default() -> Self {
        IronButterfly {
            name: "Iron Butterfly".to_string(),
            kind: StrategyType::IronButterfly,
            description: crate::strategies::iron_butterfly::IRON_BUTTERFLY_DESCRIPTION.to_string(),
            break_even_points: Vec::new(),
            short_call: Position::default(),
            short_put: Position::default(),
            long_call: Position::default(),
            long_put: Position::default(),
        }
    }
}
impl Default for LongStraddle {
    fn default() -> Self {
        LongStraddle {
            name: "Long Straddle".to_string(),
            kind: StrategyType::LongStraddle,
            description: crate::strategies::long_straddle::LONG_STRADDLE_DESCRIPTION.to_string(),
            break_even_points: Vec::new(),
            long_call: Position::default(),
            long_put: Position::default(),
        }
    }
}
impl Default for ShortStraddle {
    fn default() -> Self {
        ShortStraddle {
            name: "Short Straddle".to_string(),
            kind: StrategyType::ShortStraddle,
            description: crate::strategies::short_straddle::SHORT_STRADDLE_DESCRIPTION.to_string(),
            break_even_points: Vec::new(),
            short_call: Position::default(),
            short_put: Position::default(),
        }
    }
}
impl Default for LongStrangle {
    fn default() -> Self {
        LongStrangle {
            name: "Long Strangle".to_string(),
            kind: StrategyType::LongStrangle,
            description: crate::strategies::long_strangle::LONG_STRANGLE_DESCRIPTION.to_string(),
            break_even_points: Vec::new(),
            long_call: Position::default(),
            long_put: Position::default(),
        }
    }
}
impl Default for ShortStrangle {
    fn default() -> Self {
        ShortStrangle {
            name: "Short Strangle".to_string(),
            kind: StrategyType::ShortStrangle,
            description: crate::strategies::short_strangle::SHORT_STRANGLE_DESCRIPTION.to_string(),
            break_even_points: Vec::new(),
            short_call: Position::default(),
            short_put: Position::default(),
        }
    }
}
impl Default for PoorMansCoveredCall {
    fn default() -> Self {
        PoorMansCoveredCall {
            name: "Poor Man's Covered Call".to_string(),
            kind: StrategyType::PoorMansCoveredCall,
            description: PMCC_DESCRIPTION.to_string(),
            break_even_points: Vec::new(),
            long_call: Position::default(),
            short_call: Position::default(),
        }
    }
}
impl Default for CallButterfly {
    fn default() -> Self {
        CallButterfly {
            name: "Call Butterfly".to_string(),
            kind: StrategyType::CallButterfly,
            description: crate::strategies::call_butterfly::CALL_BUTTERFLY_DESCRIPTION.to_string(),
            break_even_points: Vec::new(),
            short_call_low: Position::default(),
            long_call: Position::default(),
            short_call_high: Position::default(),
        }
    }
}
impl Default for LongCall {
    fn default() -> Self {
        LongCall {
            name: "Long Call".to_string(),
            kind: StrategyType::LongCall,
            description: LONG_CALL_DESCRIPTION.to_string(),
            break_even_points: Vec::new(),
            long_call: Position::default(),
        }
    }
}
impl Default for LongPut {
    fn default() -> Self {
        LongPut {
            name: "Long Put".to_string(),
            kind: StrategyType::LongPut,
            description: LONG_PUT_DESCRIPTION.to_string(),
            break_even_points: Vec::new(),
            long_put: Position::default(),
        }
    }
}
impl Default for ShortCall {
    fn default() -> Self {
        ShortCall {
            name: "Short Call".to_string(),
            kind: StrategyType::ShortCall,
            description: SHORT_CALL_DESCRIPTION.to_string(),
            break_even_points: Vec::new(),
            short_call: Position::default(),
        }
    }
}
impl Default for ShortPut {
    fn default() -> Self {
        ShortPut {
            name: "Short Put".to_string(),
            kind: StrategyType::ShortPut,
            description: SHORT_PUT_DESCRIPTION.to_string(),
            break_even_points: Vec::new(),
            short_put: Position::default(),
        }
    }
}
