// resources/js/types/global.ts

import type { route as routeFn } from 'ziggy-js';

declare global {
    const route: typeof routeFn;

    interface Window {
        can: (permission: string) => boolean;
        __: (key: string) => string;
    }

    function can(permission: string): boolean;
    function __(key: string): string;
}

export interface Permission {
    id: number;
    name: string;
    guard_name: string;
    created_at: string;
    updated_at: string;
}

export interface Role {
    id: number;
    uid: string;
    name: string;
    slug: string;
    guard_name: string;
    can_edit: number;
    can_delete: number;
    permissions: Permission[];
    created_at: string;
    updated_at: string;
    deleted_at?: string;
}

export interface User {
    id: number;
    name: string;
    email: string;
    email_verified_at: string | null;
    created_at: string;
    updated_at: string;
    permissions: string[];
    roles: string[];
}

export interface ModulePermissions {
    [module: string]: string[];
}

export interface PageProps {
    auth: {
        user: User;
    };
    roles: Role[];
    permissions: Record<string, Permission[]>;
    modulePermissions: ModulePermissions;
    flash: {
        success?: string;
        error?: string;
    };
}

export interface FormData {
    name: string;
    permissions: string[];
}

export interface Breadcrumb {
    title: string;
    href: string;
}

export interface MediaItem {
    id: number;
    title: string;
    description?: string;
    alt_text?: string;
    file_name: string;
    file_url: string;
    file_type: string;
    file_size: number;
    created_at: string;
}

export interface UploadFile {
    file: File;
    id: string;
    progress: number;
    status: 'pending' | 'uploading' | 'success' | 'error';
    error?: string;
    preview?: string;
}

export interface PaginationMeta {
    current_page: number;
    from: number;
    last_page: number;
    links: { url: string | null; label: string; active: boolean }[];
    path: string;
    per_page: number;
    to: number;
    total: number;
}
