use serde::{Serialize,Deserialize};
use crate::{ItemOrList,bool_is_false};
#[derive(Debug,Serialize,Deserialize,PartialEq, Eq,Clone)]
pub struct Location{
pub name: String,
#[serde(default,skip_serializing_if="ItemOrList::is_empty")]
pub category: ItemOrList<String>,
#[serde(default,skip_serializing_if="ItemOrList::is_empty")]
pub requires: ItemOrList<String>,
#[serde(default,skip_serializing_if="Option::is_none")]
pub region: Option<String>,
#[serde(default,skip_serializing_if="Vec::is_empty")]
pub place_item: Vec<String>,
#[serde(default,skip_serializing_if="Vec::is_empty")]
pub dont_place_item: Vec<String>,
#[serde(default,skip_serializing_if="Vec::is_empty")]
pub place_item_category: Vec<String>,
#[serde(default,skip_serializing_if="Vec::is_empty")]
pub dont_place_item_category: Vec<String>,
#[serde(default,skip_serializing_if="bool_is_false")]
pub victory: bool,
#[serde(default,skip_serializing_if="bool_is_false")]
pub prehint: bool,
#[serde(default,skip_serializing_if="Option::is_none")]
pub hint_entrance: Option<String>,
#[serde(default,skip_serializing_if="Option::is_none")]
pub id: Option<u32>
}
impl Location{
pub fn simple(name: String)->Location{
Location { name, category: ItemOrList::default(), requires: ItemOrList::default(), region: None,
place_item: Vec::default(), dont_place_item: Vec::default(), place_item_category: Vec::default(), dont_place_item_category: Vec::default(), victory: false, prehint: false,
hint_entrance: None, id: None }
}
pub fn with_category(mut self,c: String)->Self{
self.category.push(c);
self
}
pub fn with_requirement(mut self,r: String)->Self{
self.requires.push(r);
self
}
pub fn with_placed_category(mut self,c:String)->Self{
self.place_item_category.push(c);
self
}
pub fn with_placed_item(mut self,i: String)->Self{
self.place_item.push(i);
self
}
pub fn as_victory(mut self)->Self{
self.victory=true;
self
}
pub fn with_region(mut self,reg: String)->Self{
self.region=Some(reg);
self
}
pub fn builder(name: String)->Self{
Self::simple(name)
}
}