import { invoke } from '@tauri-apps/api/tauri' import { get, writable, type Writable } from 'svelte/store' export type Id = number export interface ManagerData { first_name: string, surname: string, phone_number?: string, title: string, email?: string } export interface Manager extends ManagerData { id: Id } export interface FactoryData { name: string, location: string, floor_size: number } export interface Factory extends FactoryData { id: Id, manager_id: Id } export interface ProcessData { name: string, size: number } export interface Process extends ProcessData { id: Id } export interface FactoryUsedSpace { manager_name: string factory_id: Id, used_size: number, used_percent: number } export let factory_processess = writable>([]) export let factories = writable([]) export let managers = writable([]) export let processess = writable([]) function add_object(objects: Writable, object: T) { objects.update((objects) => { objects.push(object) return objects }) } function update_object(objects: Writable, index: number, updates: Partial) { if (index == -1) return objects.update((objects) => { const obj = objects[index] for (var key in updates) { obj[key] = updates[key] } return objects }) } function remove_object(objects: Writable, index: number) { if (index == -1) return objects.update((objects) => { objects.splice(index, 1) return objects }) } function remove_manager_by_id(id: number) { remove_object(managers, get(managers).findIndex(m => m.id == id)) } export async function list_factories(): Promise { return invoke("list_factories") } export async function list_managers(): Promise { return invoke("list_managers") } export async function list_processess(): Promise { return invoke("list_processess") } export async function list_factory_processess(id: number): Promise { return invoke("list_factory_processess", { id }) } // Result -> Promise<[factory_id, manager_id]> export async function add_manager_factory(factory: FactoryData, manager: ManagerData): Promise<[number, number]> { // TODO: For now always assume success // TODO: handle error let [factory_id, manager_id] = await invoke<[number, number]>("add_manager_factory", { factory, manager }) add_object(factories, { id: factory_id, manager_id, ...factory }) add_object(managers, { id: manager_id, ...manager }) return [factory_id, manager_id] } export async function update_manager(id: number, manager: ManagerData): Promise { await invoke("update_manager", { id, manager }) const index = get(managers).findIndex(f => f.id == id) update_object(managers, index, manager) } export async function update_factory(id: number, factory: FactoryData): Promise { await invoke("update_factory", { id, factory }) const index = get(factories).findIndex(f => f.id == id) update_object(factories, index, factory) } export async function delete_factory(id: number): Promise { await invoke("delete_factory", { id }) const index = get(factories).findIndex(f => f.id == id) if (index != -1) { var manager_id = factories[index] remove_object(factories, index) remove_manager_by_id(manager_id) } } export async function delete_process(id: number): Promise { await invoke("delete_process", { id }) const index = get(processess).findIndex(f => f.id == id) remove_object(processess, index) } export async function add_process(process: ProcessData): Promise { // TODO: For now always assume success // TODO: handle error let id = await invoke("add_process", { process }) add_object(processess, { id, ...process }) return id } export async function update_process(id: number, process: ProcessData): Promise { await invoke("update_process", { id, process }) var index = get(processess).findIndex(f => f.id == id) update_object(processess, index, process) } export async function add_factory_processess(factory_id: Id, process_ids: Id[]): Promise { for (var processId of process_ids) { await invoke("add_factory_process", { factoryId: factory_id, processId }) } factory_processess.update((factory_processess) => { if (factory_processess[factory_id] == undefined) { factory_processess[factory_id] = [] } for (var process_id of process_ids) { factory_processess[factory_id].push(process_id) } return factory_processess }) } export async function update_factory_processess(factory_id: Id, process_ids: Id[]): Promise { let current = get(factory_processess)[factory_id] let added = process_ids.filter(id => !current.includes(id)) let removed = current.filter(id => !process_ids.includes(id)) for (var processId of added) { await invoke("add_factory_process", { factoryId: factory_id, processId }) } for (var processId of removed) { await invoke("delete_factory_process", { factoryId: factory_id, processId }) } factory_processess.update((factory_processess) => { if (factory_processess[factory_id] == undefined) { factory_processess[factory_id] = [] } var processess = factory_processess[factory_id] for (var process_id of added) { processess.push(process_id) } for (var process_id of removed) { processess.splice(processess.findIndex(id => id === process_id), 1) } return factory_processess }) } export async function get_factories_by_used_space(from: number, to: number, location: string): Promise { return await invoke("get_factories_by_used_space", { from, to, location }) } export async function get_processess_of_factory(factory: Id): Promise { return await invoke("get_processess_of_factory", { factory }) }