use kittycad_execution_plan_macros::ExecutionPlanValue;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::{
    base64::Base64Data,
    id::ModelingCmdId,
    length_unit::LengthUnit,
    shared::{CurveType, EntityType, ExportFile, ExtrusionFaceCapType, PathCommand, Point2d, Point3d},
    traits::ModelingCmdOutput,
    units,
};
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct Export {
    pub files: Vec<ExportFile>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct SelectWithPoint {
    pub entity_id: Option<Uuid>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct HighlightSetEntity {
    pub entity_id: Option<Uuid>,
    pub sequence: Option<u32>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct EntityGetChildUuid {
    pub entity_id: Uuid,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct EntityGetNumChildren {
    pub num: u32,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct EntityGetParentId {
    pub entity_id: Uuid,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct EntityGetAllChildUuids {
    pub entity_ids: Vec<Uuid>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct SelectGet {
    pub entity_ids: Vec<Uuid>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct Solid3dGetAllEdgeFaces {
    pub faces: Vec<Uuid>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct Solid3dGetAllOppositeEdges {
    pub edges: Vec<Uuid>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct Solid3dGetOppositeEdge {
    pub edge: Uuid,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct Solid3dGetNextAdjacentEdge {
    pub edge: Option<Uuid>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct Solid3dGetPrevAdjacentEdge {
    pub edge: Option<Uuid>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct GetEntityType {
    pub entity_type: EntityType,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct CurveGetControlPoints {
    pub control_points: Vec<Point3d>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, Eq, PartialEq, ExecutionPlanValue)]
pub struct CurveGetType {
    pub curve_type: CurveType,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct MouseClick {
    pub entities_modified: Vec<Uuid>,
    pub entities_selected: Vec<Uuid>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct TakeSnapshot {
    pub contents: Base64Data,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct PathGetInfo {
    pub segments: Vec<PathSegmentInfo>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct PathSegmentInfo {
    pub command_id: Option<ModelingCmdId>,
    pub command: PathCommand,
    pub relative: bool,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct PathGetCurveUuidsForVertices {
    pub curve_ids: Vec<Uuid>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct PathGetVertexUuids {
    pub vertex_ids: Vec<Uuid>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct CurveGetEndPoints {
    pub start: Point3d<LengthUnit>,
    pub end: Point3d<LengthUnit>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct PlaneIntersectAndProject {
    pub plane_coordinates: Option<Point2d<LengthUnit>>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct ImportFiles {
    pub object_id: Uuid,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct Mass {
    pub mass: f64,
    pub output_unit: units::UnitMass,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct Volume {
    pub volume: f64,
    pub output_unit: units::UnitVolume,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct Density {
    pub density: f64,
    pub output_unit: units::UnitDensity,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct SurfaceArea {
    pub surface_area: f64,
    pub output_unit: units::UnitArea,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct CenterOfMass {
    pub center_of_mass: Point3d<f64>,
    pub output_unit: units::UnitLength,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct GetSketchModePlane {
    pub x_axis: Point3d<f64>,
    pub y_axis: Point3d<f64>,
    pub z_axis: Point3d<f64>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct EntityGetDistance {
    pub min_distance: LengthUnit,
    pub max_distance: LengthUnit,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct EntityLinearPattern {
    pub entity_ids: Vec<Uuid>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct EntityCircularPattern {
    pub entity_ids: Vec<Uuid>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct Solid3dGetExtrusionFaceInfo {
    pub faces: Vec<ExtrusionFaceInfo>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema, ExecutionPlanValue)]
pub struct ExtrusionFaceInfo {
    pub curve_id: Option<Uuid>,
    pub face_id: Option<Uuid>,
    pub cap: ExtrusionFaceCapType,
}
impl ModelingCmdOutput for Export {}
impl ModelingCmdOutput for SelectWithPoint {}
impl ModelingCmdOutput for HighlightSetEntity {}
impl ModelingCmdOutput for EntityGetChildUuid {}
impl ModelingCmdOutput for EntityGetNumChildren {}
impl ModelingCmdOutput for EntityGetParentId {}
impl ModelingCmdOutput for EntityGetAllChildUuids {}
impl ModelingCmdOutput for EntityGetDistance {}
impl ModelingCmdOutput for EntityLinearPattern {}
impl ModelingCmdOutput for EntityCircularPattern {}
impl ModelingCmdOutput for SelectGet {}
impl ModelingCmdOutput for GetEntityType {}
impl ModelingCmdOutput for Solid3dGetAllEdgeFaces {}
impl ModelingCmdOutput for Solid3dGetAllOppositeEdges {}
impl ModelingCmdOutput for Solid3dGetOppositeEdge {}
impl ModelingCmdOutput for Solid3dGetPrevAdjacentEdge {}
impl ModelingCmdOutput for Solid3dGetNextAdjacentEdge {}
impl ModelingCmdOutput for MouseClick {}
impl ModelingCmdOutput for CurveGetType {}
impl ModelingCmdOutput for CurveGetControlPoints {}
impl ModelingCmdOutput for TakeSnapshot {}
impl ModelingCmdOutput for PathGetInfo {}
impl ModelingCmdOutput for PathGetCurveUuidsForVertices {}
impl ModelingCmdOutput for PathGetVertexUuids {}
impl ModelingCmdOutput for PlaneIntersectAndProject {}
impl ModelingCmdOutput for CurveGetEndPoints {}
impl ModelingCmdOutput for ImportFiles {}
impl ModelingCmdOutput for Mass {}
impl ModelingCmdOutput for Volume {}
impl ModelingCmdOutput for Density {}
impl ModelingCmdOutput for SurfaceArea {}
impl ModelingCmdOutput for CenterOfMass {}
impl ModelingCmdOutput for GetSketchModePlane {}
impl ModelingCmdOutput for () {}
impl ModelingCmdOutput for Solid3dGetExtrusionFaceInfo {}