import { Component } from '@angular/core';
import {
    AbstractDataFormComponent, FormSubmitEvent,
} from "@app/_components/_abstract/abstract-data-form-component";
import {
    MediaObjectService,
    UserTripJsonld,
    UserTripService,
} from "@app/core/api/v1";
import { userTripForm } from "@app/_forms/apiForms";
import { TranslateService } from "@ngx-translate/core";
import { Router } from "@angular/router";
import { ROUTE_USER_TRIPS } from "@app/app-routing.module";
import { ModalStatus } from "@app/_helpers/modal.states";
import {AppHelperService} from "@app/_helpers/app-helper.service";

@Component({
    selector: 'app-user-trip-form',
    templateUrl: './user-trip-form.component.html',
    styleUrl: './user-trip-form.component.scss'
})
export class UserTripFormComponent extends AbstractDataFormComponent<UserTripJsonld> {

    protected readonly userTripForm = userTripForm;
    selectedFile: File | null = null;
    signatureToDelete: string | null = null;
    showSignatureImage: boolean = true;

    constructor(
        private userTripService: UserTripService,
        private mediaObjectService: MediaObjectService,
        private appHelperService: AppHelperService,
        translateService: TranslateService,
        router: Router
    ) {
        super(
            userTripForm,
            undefined,
            (id: string | number, data: UserTripJsonld) =>
                this.userTripService.userTripsIdPatch(
                    id.toString(),
                    this.appHelperService.convertJsonldToJson(data)
                ),
            (id: string | number) => this.userTripService.userTripsIdDelete(id.toString()),
            translateService,
            router
        );
        this.redirectAfterDelete = '/' + ROUTE_USER_TRIPS;
    }

    override ngOnInit(): void {
        super.ngOnInit();

        this.submit.subscribe((event: FormSubmitEvent<UserTripJsonld>) => {
            if (event.status === ModalStatus.Submitted) {
                this.updateImageStatus();
            }
        });

        // Debug-Ausgabe für Formularvalidierung
        // this.form.statusChanges.subscribe(status => {
        //     console.log('Form status:', status);
        //     console.log('Form errors:', this.form.errors);
        //
        //     Object.keys(this.form.controls).forEach(key => {
        //         const control = this.form.get(key);
        //         if (control?.invalid) {
        //             console.log(`Control '${key}' is invalid:`, control.errors);
        //         }
        //     });
        // });
    }

    onFileSelected(event: Event): void {
        const element = event.target as HTMLInputElement;
        if (element.files && element.files.length > 0) {
            this.selectedFile = element.files[0];
        }
    }

    getFileNameFromUrl(url: string | null | undefined): string {
        if (!url) return '';
        return url.split('/').pop() || '';
    }

    markSignatureForRemoval(): void {
        // Speichere die aktuelle signatureIri, um sie später zu löschen
        this.signatureToDelete = this.form.get('signatureIri')?.value;

        // Aktualisiere den Formularwert
        this.form.patchValue({
            signatureIri: null
        });

        // Verstecke das Bild in der UI
        this.showSignatureImage = false;

        // Falls eine Datei zum Hochladen ausgewählt wurde, entferne diese auch
        this.selectedFile = null;
    }

    updateImageStatus(): void {
        // Wenn das Formular erfolgreich gespeichert wurde, wird diese Methode aufgerufen

        // Prüfen, ob es ein Bild gibt oder nicht
        if (this.data?.signatureUrl) {
            // Es gibt ein Bild, also zeige es an
            this.showSignatureImage = true;
        } else {
            // Es gibt kein Bild, also verstecke es
            this.showSignatureImage = false;
        }

        // Zurücksetzen der temporären Variablen
        this.signatureToDelete = null;
        this.selectedFile = null;
    }

    override onSubmit(): void {
        if (!this.form.valid) {
            // console.log('Form is invalid:', this.form.errors);
            // Object.keys(this.form.controls).forEach(key => {
            //     const control = this.form.get(key);
            //     if (control?.invalid) {
            //         console.log(`Control '${key}' is invalid:`, control.errors);
            //     }
            // });
            return;
        }

        // Drei Fälle:
        // 1. Ein neues Bild wurde ausgewählt
        // 2. Ein bestehendes Bild soll gelöscht werden
        // 3. Keine Änderungen am Bild

        if (this.selectedFile && this.signatureToDelete) {
            // Fall 1a: Ein neues Bild wurde ausgewählt UND ein altes soll gelöscht werden
            // Zuerst das alte Bild löschen, dann das neue hochladen
            if (this.data?.signature?.dbId) {
                this.mediaObjectService.mediaObjectsIdDelete(this.data?.signature?.dbId?.toString()).subscribe({
                    next: () => {
                        // Altes Bild wurde gelöscht, jetzt neues hochladen
                        this.uploadNewFile();
                    },
                    error: (error) => {
                        console.error('Error deleting signature:', error);
                        // Trotz Fehler neues Bild hochladen
                        this.uploadNewFile();
                    }
                });
            }

        } else if (this.selectedFile) {
            // Fall 1b: Nur ein neues Bild wurde ausgewählt (kein altes vorhanden)
            this.uploadNewFile();
        } else if (this.signatureToDelete && this.data?.signature?.dbId) {
            // Fall 2: Nur ein bestehendes Bild soll gelöscht werden
            this.mediaObjectService.mediaObjectsIdDelete(this.data?.signature?.dbId?.toString()).subscribe({
                next: () => {
                    this.signatureToDelete = null;
                    super.onSubmit();
                },
                error: (error) => {
                    console.error('Error deleting signature:', error);
                    super.onSubmit();
                }
            });
        } else {
            // Fall 3: Keine Änderungen am Bild
            super.onSubmit();
        }
    }

    private uploadNewFile(): void {
        if (!this.selectedFile) return;

        this.mediaObjectService.mediaObjectsPost(this.selectedFile).subscribe({
            next: (mediaObject) => {
                // Aktualisiere die Formulardaten mit dem neuen mediaObject
                this.form.patchValue({
                    signatureIri: mediaObject.id
                });

                // Rufe die übergeordnete Methode auf, um den Standard-Speicherprozess zu verarbeiten
                super.onSubmit();
            },
            error: (error) => {
                console.error('Error uploading file:', error);
                this.submit.emit({
                    status: ModalStatus.Cancelled,
                    data: null
                });
            }
        });
    }
}