pub mod lobby;
pub mod message;
pub mod room;
pub mod quest;
pub mod ship;

use libpso::character::character::Inventory;
use libpso::packet::ship::{PlayerHeader, PlayerInfo};
use crate::common::leveltable::LEVEL_TABLE;
use crate::ship::character::CharacterBytesBuilder;
use crate::ship::ship::ClientState;
use crate::ship::location::AreaClient;
use crate::ship::items::inventory::InventoryState;

pub fn player_header(tag: u32, client: &ClientState, area_client: &AreaClient) -> PlayerHeader {
    PlayerHeader {
        tag,
        guildcard: client.user.id.0,
        _unknown1: [0; 5],
        client_id: area_client.local_client.id() as u32,
        name: libpso::utf8_to_utf16_array!(client.character.name, 16),
        _unknown2: 2,
    }
}

pub async fn player_info(tag: u32, client: &ClientState, area_client: &AreaClient, inventory: &InventoryState) -> PlayerInfo {
    let (level, stats) = LEVEL_TABLE.get_stats_from_exp(client.character.char_class, client.character.exp);
    let character = CharacterBytesBuilder::default()
        .character(&client.character)
        .stats(&stats)
        .level(level - 1)
        .meseta(inventory.meseta)
        .build();
    PlayerInfo {
        header: player_header(tag, client, area_client),
        inventory: Inventory {
            item_count: inventory.count() as u8,
            hp_mats_used: 0, // TODO: materials
            tp_mats_used: 0, // TODO: materials
            language: 0, // TODO: account language
            items: inventory.as_client_inventory_items(),
        },
        character,
    }
}