const path = require('path');
const PDFGenerator = require('../utils/pdfGenerator');

class PDFService {
    /**
     * Generate onboarding protocol PDF
     */
    static async generateOnboardingPdf(protocol, employee, assignedAssets, createdBy) {
        const pdf = new PDFGenerator();

        // Header
        pdf.addHeader(
            'Onboarding Übergabeprotokoll',
            `Protokoll-Nr: ${protocol.id} | Datum: ${new Date(protocol.start_date).toLocaleDateString('de-DE')}`
        );

        // Employee Information
        pdf.addSectionTitle('Mitarbeiter-Information');
        pdf.addKeyValue('Name', `${employee.first_name} ${employee.last_name}`);
        if (protocol.emp_private_email || employee.email) pdf.addKeyValue('E-Mail', protocol.emp_private_email || employee.email);
        if (protocol.department) pdf.addKeyValue('Abteilung', protocol.department);
        if (protocol.position) pdf.addKeyValue('Position', protocol.position);
        if (protocol.work_location) pdf.addKeyValue('Arbeitsort', protocol.work_location);
        if (protocol.hours_model) pdf.addKeyValue('Stundenmodell', protocol.hours_model);
        if (protocol.vacation_model) pdf.addKeyValue('Urlaubsmodell', protocol.vacation_model);
        pdf.addKeyValue('Startdatum', new Date(protocol.start_date).toLocaleDateString('de-DE'));

        // Assigned Assets
        if (assignedAssets && assignedAssets.length > 0) {
            pdf.addSectionTitle('Zugewiesene IT-Hardware');

            const headers = ['Typ', 'Name', 'Modell', 'Seriennummer'];
            const rows = assignedAssets.map(asset => [
                asset.type || '-',
                asset.name || '-',
                asset.model || '-',
                asset.serial_number || '-'
            ]);

            pdf.addTable(headers, rows, { columnWidth: 123 });
        }

        // Checklist – grouped by phase
        const checklistData = protocol.checklist_data ? JSON.parse(protocol.checklist_data) : {};

        const ON_CHECKLIST = [
            // Phase 1
            { key: 'p1_hr_personalakte',     phase: 'Phase 1 — Sofort nach Vertragsunterzeichnung', dept: 'HR', label: 'Personalakte anlegen' },
            { key: 'p1_hr_abt_info',         phase: 'Phase 1 — Sofort nach Vertragsunterzeichnung', dept: 'HR', label: 'Alle Abteilungen informieren' },
            { key: 'p1_hr_bg_anmeldung',     phase: 'Phase 1 — Sofort nach Vertragsunterzeichnung', dept: 'HR', label: 'Berufsgenossenschaft vorbereiten' },
            { key: 'p1_it_ticket',           phase: 'Phase 1 — Sofort nach Vertragsunterzeichnung', dept: 'IT', label: 'IT-Onboarding-Ticket anlegen' },
            { key: 'p1_it_hardware_check',   phase: 'Phase 1 — Sofort nach Vertragsunterzeichnung', dept: 'IT', label: 'Hardware prüfen & ggf. bestellen' },
            { key: 'p1_vg_buddy',            phase: 'Phase 1 — Sofort nach Vertragsunterzeichnung', dept: 'VG', label: 'Buddy / Paten benennen & informieren' },
            { key: 'p1_vg_einarbeitungsplan',phase: 'Phase 1 — Sofort nach Vertragsunterzeichnung', dept: 'VG', label: '30-Tage-Einarbeitungsplan erstellen' },
            { key: 'p1_bk_datev',            phase: 'Phase 1 — Sofort nach Vertragsunterzeichnung', dept: 'BK', label: 'Mitarbeiter in DATEV anlegen' },
            { key: 'p1_bk_bankdaten',        phase: 'Phase 1 — Sofort nach Vertragsunterzeichnung', dept: 'BK', label: 'Bankdaten & Steuerklasse anfordern' },
            // Phase 2
            { key: 'p2_hr_welcome_mail',     phase: 'Phase 2 — 2 Wochen vor Arbeitsbeginn', dept: 'HR', label: 'Willkommens-E-Mail senden' },
            { key: 'p2_hr_formulare',        phase: 'Phase 2 — 2 Wochen vor Arbeitsbeginn', dept: 'HR', label: 'Formulare vorbereiten' },
            { key: 'p2_hr_ausweis',          phase: 'Phase 2 — 2 Wochen vor Arbeitsbeginn', dept: 'HR', label: 'Mitarbeiterausweis beantragen' },
            { key: 'p2_it_ad_account',       phase: 'Phase 2 — 2 Wochen vor Arbeitsbeginn', dept: 'IT', label: 'AD-Account erstellen' },
            { key: 'p2_it_email',            phase: 'Phase 2 — 2 Wochen vor Arbeitsbeginn', dept: 'IT', label: 'E-Mail-Adresse einrichten' },
            { key: 'p2_it_hardware_setup',   phase: 'Phase 2 — 2 Wochen vor Arbeitsbeginn', dept: 'IT', label: 'Hardware aufsetzen' },
            { key: 'p2_vg_team_inform',      phase: 'Phase 2 — 2 Wochen vor Arbeitsbeginn', dept: 'VG', label: 'Team informieren' },
            { key: 'p2_vg_arbeitsplatz',     phase: 'Phase 2 — 2 Wochen vor Arbeitsbeginn', dept: 'VG', label: 'Arbeitsplatz vorbereiten' },
            { key: 'p2_bk_lohnkonto',        phase: 'Phase 2 — 2 Wochen vor Arbeitsbeginn', dept: 'BK', label: 'Lohnkonto einrichten' },
            { key: 'p2_bk_sv_anmeldung',     phase: 'Phase 2 — 2 Wochen vor Arbeitsbeginn', dept: 'BK', label: 'Sozialversicherung anmelden' },
            // Phase 3
            { key: 'p3_hr_vollstaendigkeit', phase: 'Phase 3 — 1 Woche vor Arbeitsbeginn', dept: 'HR', label: 'Vollständigkeits-Check' },
            { key: 'p3_hr_unterweisungen',   phase: 'Phase 3 — 1 Woche vor Arbeitsbeginn', dept: 'HR', label: 'Pflichtunterweisungen planen' },
            { key: 'p3_it_systemtest',       phase: 'Phase 3 — 1 Woche vor Arbeitsbeginn', dept: 'IT', label: 'Kompletttest aller Systeme' },
            { key: 'p3_it_software',         phase: 'Phase 3 — 1 Woche vor Arbeitsbeginn', dept: 'IT', label: 'Software installieren' },
            { key: 'p3_it_telefon',          phase: 'Phase 3 — 1 Woche vor Arbeitsbeginn', dept: 'IT', label: 'Telefon / Durchwahl einrichten' },
            { key: 'p3_it_begruessung',      phase: 'Phase 3 — 1 Woche vor Arbeitsbeginn', dept: 'IT', label: 'IT-Begrüßungsmappe drucken' },
            { key: 'p3_vg_erste_aufgaben',   phase: 'Phase 3 — 1 Woche vor Arbeitsbeginn', dept: 'VG', label: 'Erste Aufgaben vorbereiten' },
            { key: 'p3_vg_checkins',         phase: 'Phase 3 — 1 Woche vor Arbeitsbeginn', dept: 'VG', label: 'Check-in-Termine planen' },
            { key: 'p3_bk_gehaltsabrechnung',phase: 'Phase 3 — 1 Woche vor Arbeitsbeginn', dept: 'BK', label: 'Gehaltsabrechnung vorbereiten' },
            { key: 'p3_bk_reisekosten',      phase: 'Phase 3 — 1 Woche vor Arbeitsbeginn', dept: 'BK', label: 'Reisekostenformulare bereitstellen' },
            // Phase 4
            { key: 'p4_hr_empfang',          phase: 'Phase 4 — Erster Arbeitstag', dept: 'HR', label: 'Empfang & Begrüßung' },
            { key: 'p4_hr_formulare_sign',   phase: 'Phase 4 — Erster Arbeitstag', dept: 'HR', label: 'Alle Formulare unterzeichnen' },
            { key: 'p4_hr_willkommensmappe', phase: 'Phase 4 — Erster Arbeitstag', dept: 'HR', label: 'Willkommensmappe übergeben' },
            { key: 'p4_it_hardware_uebergabe',phase: 'Phase 4 — Erster Arbeitstag', dept: 'IT', label: 'Hardware-Übergabe mit Protokoll' },
            { key: 'p4_it_erster_login',     phase: 'Phase 4 — Erster Arbeitstag', dept: 'IT', label: 'Ersten Login begleiten' },
            { key: 'p4_it_it_mappe',         phase: 'Phase 4 — Erster Arbeitstag', dept: 'IT', label: 'IT-Begrüßungsmappe übergeben' },
            { key: 'p4_vg_begruessung',      phase: 'Phase 4 — Erster Arbeitstag', dept: 'VG', label: 'Persönliche Begrüßung' },
            { key: 'p4_vg_einarbeitungsplan',phase: 'Phase 4 — Erster Arbeitstag', dept: 'VG', label: 'Einarbeitungsplan besprechen' },
            { key: 'p4_vg_mittagessen',      phase: 'Phase 4 — Erster Arbeitstag', dept: 'VG', label: 'Gemeinsames Mittagessen mit Team' },
            { key: 'p4_bk_bankverbindung',   phase: 'Phase 4 — Erster Arbeitstag', dept: 'BK', label: 'Bankverbindung bestätigen' },
            { key: 'p4_bk_zeiterfassung',    phase: 'Phase 4 — Erster Arbeitstag', dept: 'BK', label: 'Zeiterfassung erklären' },
        ];

        // Group by phase and render
        const phases = [...new Set(ON_CHECKLIST.map(i => i.phase))];
        for (const phase of phases) {
            pdf.addSectionTitle(phase);
            const phaseItems = ON_CHECKLIST.filter(i => i.phase === phase);
            pdf.addChecklist(phaseItems, checklistData);
        }

        // Notes
        if (protocol.notes) {
            pdf.addSectionTitle('Bemerkungen');
            pdf.addText(protocol.notes);
        }

        // Signatures
        pdf.addSectionTitle('Unterschriften');
        pdf.addText('Durch die Unterschrift bestätigen beide Parteien den Empfang und Zustand der oben genannten IT-Hardware.', {
            fontSize: 9,
            color: '#64748b'
        });

        pdf.addSignatureFields([
            { label: 'Mitarbeiter' },
            { label: `IT-Verantwortlicher (${createdBy})` }
        ]);

        // Footer
        pdf.addFooter(
            'Cereda Systems GmbH | IT Asset Management | Generiert am ' +
            new Date().toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' })
        );

        // Generate file path
        const year = new Date(protocol.start_date).getFullYear();
        const fileName = `onboarding_protocol_${protocol.id}_${Date.now()}.pdf`;
        const filePath = path.join(__dirname, '../../uploads/onboarding', year.toString(), fileName);

        // Save PDF
        await pdf.saveToFile(filePath);

        // Return relative path for database
        return path.join('uploads/onboarding', year.toString(), fileName).replace(/\\/g, '/');
    }

    /**
     * Generate offboarding protocol PDF
     */
    static async generateOffboardingPdf(protocol, employee, returnedAssets, createdBy) {
        const pdf = new PDFGenerator();

        // Header
        pdf.addHeader(
            'Offboarding Rückgabeprotokoll',
            `Protokoll-Nr: ${protocol.id} | Datum: ${new Date(protocol.exit_date).toLocaleDateString('de-DE')}`
        );

        // Employee Information
        pdf.addSectionTitle('Mitarbeiter-Information');
        pdf.addKeyValue('Name', `${employee.first_name} ${employee.last_name}`);
        pdf.addKeyValue('Benutzername', employee.username);
        pdf.addKeyValue('E-Mail', employee.email);
        pdf.addKeyValue('Rolle', employee.role_name);
        pdf.addKeyValue('Austrittsdatum', new Date(protocol.exit_date).toLocaleDateString('de-DE'));

        // Returned Assets
        if (returnedAssets && returnedAssets.length > 0) {
            pdf.addSectionTitle('Zurückgegebene IT-Hardware');

            const headers = ['Typ', 'Name', 'Modell', 'Seriennummer', 'Zustand'];
            const rows = returnedAssets.map(asset => [
                asset.type || '-',
                asset.name || '-',
                asset.model || '-',
                asset.serial_number || '-',
                asset.condition || 'Gut'
            ]);

            pdf.addTable(headers, rows, { columnWidth: 98 });
        }

        // Checklist
        const checklistData = protocol.checklist_data ? JSON.parse(protocol.checklist_data) : {};
        pdf.addSectionTitle('Offboarding Checkliste');

        const checklistItems = [
            { key: 'hardware_returned', label: 'Gesamte Hardware zurückgegeben' },
            { key: 'hardware_condition_good', label: 'Hardware in gutem Zustand' },
            { key: 'accounts_deactivated', label: 'Benutzerkonten deaktiviert' },
            { key: 'access_revoked', label: 'Zugriffsrechte entzogen' },
            { key: 'knowledge_transfer', label: 'Wissensübergabe abgeschlossen' },
            { key: 'final_clearance', label: 'Abschlussgespräch durchgeführt' }
        ];

        pdf.addChecklist(checklistItems, checklistData);

        // Notes
        if (protocol.notes) {
            pdf.addSectionTitle('Bemerkungen');
            pdf.addText(protocol.notes);
        }

        // Signatures
        pdf.addSectionTitle('Unterschriften');
        pdf.addText('Durch die Unterschrift bestätigen beide Parteien die Rückgabe und den Zustand der oben genannten IT-Hardware.', {
            fontSize: 9,
            color: '#64748b'
        });

        pdf.addSignatureFields([
            { label: 'Mitarbeiter' },
            { label: `IT-Verantwortlicher (${createdBy})` }
        ]);

        // Footer
        pdf.addFooter(
            'Cereda Systems GmbH | IT Asset Management | Generiert am ' +
            new Date().toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' })
        );

        // Generate file path
        const year = new Date(protocol.exit_date).getFullYear();
        const fileName = `offboarding_protocol_${protocol.id}_${Date.now()}.pdf`;
        const filePath = path.join(__dirname, '../../uploads/offboarding', year.toString(), fileName);

        // Save PDF
        await pdf.saveToFile(filePath);

        // Return relative path for database
        return path.join('uploads/offboarding', year.toString(), fileName).replace(/\\/g, '/');
    }
}

module.exports = PDFService;
