/*
    Undercooked - a game about cooking
    Copyright 2024 metamuffin
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, version 3 of the License only.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.
    
    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see .
    
*/
use crate::data::Gamedata;
use glam::{IVec2, Vec2};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(transparent)]
pub struct PlayerID(pub i64);
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(transparent)]
pub struct ItemIndex(pub usize);
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(transparent)]
pub struct TileIndex(pub usize);
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(transparent)]
pub struct RecipeIndex(pub usize);
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(transparent)]
pub struct DemandIndex(pub usize);
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "type")]
pub enum PacketS {
    Join {
        name: String,
        character: i32,
    },
    Leave,
    Position {
        pos: Vec2,
        rot: f32,
    },
    Interact {
        pos: IVec2,
        edge: bool,
    },
    Collide {
        player: PlayerID,
        force: Vec2,
    },
    Communicate {
        message: Option,
    },
    #[serde(skip)]
    ReplaceHand {
        item: Option,
    },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Message {
    Text(String),
    Item(ItemIndex),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "type")]
pub enum PacketC {
    Init {
        data: Gamedata,
        id: PlayerID,
    },
    AddPlayer {
        id: PlayerID,
        position: Vec2,
        character: i32,
        name: String,
    },
    RemovePlayer {
        id: PlayerID,
    },
    Position {
        player: PlayerID,
        pos: Vec2,
        rot: f32,
    },
    TakeItem {
        tile: IVec2,
        player: PlayerID,
    },
    PutItem {
        player: PlayerID,
        tile: IVec2,
    },
    SetTileItem {
        tile: IVec2,
        item: Option,
    },
    SetPlayerItem {
        player: PlayerID,
        item: Option,
    },
    SetActive {
        tile: IVec2,
        progress: Option,
        warn: bool,
    },
    UpdateMap {
        pos: IVec2,
        tile: TileIndex,
        neighbors: [Option; 4],
    },
    Collide {
        player: PlayerID,
        force: Vec2,
    },
    Communicate {
        player: PlayerID,
        message: Option,
    },
    Error {
        message: String,
    },
}