# Frymaster Badge App

A cross-platform **.NET MAUI** application for managing employee records, generating customizable ID badges, handling company profiles, and printing via local desktop printers. Features dynamic tab navigation, photo capture/cropping, barcode generation, and robust file-based logging.

---

## 📋 Prerequisites

| Requirement | Details |
|-------------|---------|
| **SDK** | `.NET 8.0` or later |
| **Workload** | `maui` workload installed (`dotnet workload install maui`) |
| **IDE** | Visual Studio 2022 (v17.8+) with MAUI, or VS Code + C# Dev Kit |
| **Database** | SQL Server (2019/2022/Express/Azure SQL) |
| **Platform** | Windows 10/11 (recommended for printing & file pickers) |

> ⚠️ **Note:** Printer APIs (`System.Drawing.Printing`) and folder/file pickers used in this app are desktop-optimized. Mobile targets may require platform-specific fallbacks.

---

## 🗄️ Database Setup

1. Create a database named `Frymaster` in your SQL Server instance.
2. Run the following schema to create the required tables (matches application queries):

```sql
CREATE TABLE dbo.Companies (
    ID INT IDENTITY(1,1) PRIMARY KEY,
    Name NVARCHAR(100) NOT NULL,
    Address NVARCHAR(200),
    City NVARCHAR(100),
    State NVARCHAR(50),
    Zip NVARCHAR(20),
    Logo NVARCHAR(255)
);

CREATE TABLE dbo.tblData (
    Data1 NVARCHAR(50) PRIMARY KEY,          -- Employee Record Number
    Data2 NVARCHAR(100),                     -- First Name
    LastName NVARCHAR(100),
    Data3 NVARCHAR(100),                     -- Display Name
    Data4 NVARCHAR(100),                     -- Additional Info
    Data5 DATETIME,                          -- Issue/Start Date
    Data7 NVARCHAR(10),                      -- Medical Indicator 1 (True/False)
    Data8 NVARCHAR(10),                      -- Medical Indicator 2 (1/0 or True/False)
    Active NVARCHAR(10),                     -- YES/NO
    Data9 NVARCHAR(50),                      -- Badge Number
    picCode NVARCHAR(255),                   -- Photo filename reference
    cropX FLOAT DEFAULT 0,
    cropY FLOAT DEFAULT 0,
    cropScale FLOAT DEFAULT 1.0,
    BadgeType NVARCHAR(50) DEFAULT 'OFFICE', -- OFFICE, GUEST, PLANT, MAINTENANCE, VENDOR
    ToPrint BIT DEFAULT 0,
    CdsPrinted BIT DEFAULT 0
);
```

---

## ⚙️ Configuration

1. Create `appsettings.json` inside `Resources/Raw/`
2. Set its **Build Action** to `MauiAsset`
3. Add your connection string:

```json
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=127.0.0.1;Database=Frymaster;User Id=sa;Password=YourSecurePassword;TrustServerCertificate=True;"
  }
}
```

> 🔒 **Security Note:** The app contains a hardcoded fallback connection string in `MauiProgram.cs`. **Never deploy to production without providing `appsettings.json`**, as the fallback uses plain-text credentials and will log a warning.

---

## 🛠️ Building & Running

### ✅ Using CLI
```bash
# Restore dependencies
dotnet restore

# Build
dotnet build -c Release

# Run (Windows Desktop default)
dotnet run -f net8.0-windows10.0.19041.0
```

### ✅ Using Visual Studio
1. Open `FrymasterBadgeApp.csproj` or `.sln`
2. Select your target framework in the toolbar (e.g., `net8.0-windows10.0.19041.0`)
3. Press `F5` or click ▶ Run
4. The app will automatically restore NuGet packages and launch.

---

## 🚀 First Run & Navigation Flow

1. **Initial Setup Tab**: If no companies exist in the database, the app shows a `Setup` tab. Click it to add your first company via `CompanyPage`.
2. **Dynamic Tabs**: Once companies are added, each gets its own tab in the bottom `TabBar`. Tabs are generated dynamically at runtime.
3. **Employee Management**: Click a company tab → select/search employees → view/edit badge preview → capture/update photos → print.
4. **Settings**: Use the top-right `⚙️` icon to configure storage paths (`C:\FrymasterData\...` defaults) and UI theme (`System`/`Light`/`Dark`).
5. **Company Management**: Use the `🏢` icon in `AppShell` to manage company records and upload logos.

---

## 📂 Storage & Paths

| Setting | Default | Notes |
|---------|---------|-------|
| Photos | `C:\FrymasterData\photos` | Stores employee JPGs (`{recordNum}_{ticks}.jpg`) |
| Logos | `C:\FrymasterData\logos` | Stores company logo images |
| Images | `C:\FrymasterData\images` | Stores guest/default badge assets |
| Logs | `%LOCALAPPDATA%` | Rotates daily, max 5MB/file, 30-day auto-cleanup |

> 🌍 **Cross-Platform Note:** The `C:\...` defaults are Windows-specific. On macOS/Linux, change paths immediately via the **Settings Page** to avoid `UnauthorizedAccessException` or missing directory errors.

---

## 🐛 Troubleshooting

| Issue | Solution |
|-------|----------|
| `SqlService` connection fails | Verify SQL Server is running, check `appsettings.json`, ensure `TrustServerCertificate=True` |
| App crashes on startup | Check `FrymasterBadgeApp_*.log` in `%LOCALAPPDATA%` for DI or XAML errors |
| Missing tabs / "Loading..." stuck | Ensure at least one company exists in `dbo.Companies` |
| Print fails / `PrinterSettings` empty | Ensure desktop target is selected. Mobile platforms don't expose `InstalledPrinters` |
| `FolderPicker` or `Toast` crashes | Wrapped in try/catch. Intentionally disables auto-navigation after save to prevent Shell crashes |
| Missing barcode font | Ensure `LibreBarcode39-Regular.ttf` is in `Resources/Fonts` with `Build Action: MauiFont` |

---

## 📜 Logging & Diagnostics

- **Location:** `%LOCALAPPDATA%\FrymasterBadgeApp_YYYY-MM-DD.log`
- **Rotation:** Files >5MB are renamed to `.old` (previous `.old` is deleted)
- **Cleanup:** `AppLogger.CleanupOldLogs()` deletes logs older than 30 days
- **Viewing:** Open with any text editor or run:
  ```powershell
  Get-ChildItem $env:LOCALAPPDATA\FrymasterBadgeApp_*.log | Sort-Object LastWriteTime -Descending | Select-Object -First 1 | Invoke-Item
  ```

---

## 📄 License

Property of Frymaster

---

> 💡 **Tip:** Run `dotnet workload restore` before first build if you encounter missing MAUI SDK errors. Ensure your `.csproj` targets a supported Windows SDK version (`net8.0-windows10.0.19041.0` or higher).