import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { RouterExtensions } from '@nativescript/angular';
import { EventData, TextField } from '@nativescript/core';
import { action } from '@nativescript/core/ui/dialogs';
import { Select, Store } from '@ngxs/store';
import { FeedbackType } from 'nativescript-feedback';
import { Observable } from 'rxjs';
import { withLatestFrom } from 'rxjs/operators';
import { feedbackMessage } from '~/pages/material/utils/feedback-messages';
import { AdvertisingCategoryDetailResponse } from '../../entities/output/advertisingCategoryDetailResponse';
import { MeetingDateAllResult } from '../../entities/output/meetingDateAllResult';
import { SexTypes } from '../../entities/sexTypes';
import {
    LoadAdvertisingCategoryDetail,
    UpdateAdvertisingCategory
} from '../../state-mgmt/advertising-category.actions';
import { AdvertisingCategoryState } from '../../state-mgmt/advertising-category.state';
import { LoadMeetingDateAll } from '../../state-mgmt/advertising.actions';
import { AdvertisingState } from '../../state-mgmt/advertising.state';

@Component({
    selector: 'AdvertisingCategoryNew',
    moduleId: module.id,
    templateUrl: './advertising-category-update.component.html',
    styleUrls: ['./_advertising-category-update.component.scss']
})

export class AdvertisingCategoryUpdateComponent implements OnInit {
    @Select(AdvertisingState.getMeetingDateAll) meetingDateAll$: Observable<MeetingDateAllResult[]>;
    @Select(AdvertisingCategoryState.getAdvertisingCategoryDetail) advertisingCategoryDetail$: Observable<AdvertisingCategoryDetailResponse>;
    @Select(AdvertisingCategoryState.isLoading) isLoading$: Observable<boolean>;

    id: number;
    advertisingCategory: AdvertisingCategoryDetailResponse;
    meetingDates: MeetingDateAllResult[] = [];

    constructor(
        private store: Store,
        private routerExtensions: RouterExtensions,
        private route: ActivatedRoute
     ) {}

    ngOnInit(): void {
        this.id = +this.route.snapshot.params['id'];
        this.store.dispatch(new LoadAdvertisingCategoryDetail(this.id))
            .pipe(withLatestFrom(this.advertisingCategoryDetail$))
            .subscribe(([_, output]) => {
                this.advertisingCategory = output;
                if (this.advertisingCategory.ID_MeetingDate === null) {
                    this.advertisingCategory.ID_MeetingDate = undefined;
                    this.advertisingCategory.MeetingDate = 'Žádná';
                }
            }, err => {
                console.log(err);
                feedbackMessage(FeedbackType.Error, 'Načítání dat', `Při načítání dat došlo k chybě. Zkontrolujte prosím vaše internetové připojení.`);
                this.routerExtensions.back();
            });

        this.store.dispatch(new LoadMeetingDateAll())
            .pipe(withLatestFrom(this.meetingDateAll$))
            .subscribe(([_, output]) => {
                const noMeetingOption = new MeetingDateAllResult();
                noMeetingOption.ID = undefined;
                noMeetingOption.DisplayName = 'Žádná';
                this.meetingDates = [noMeetingOption].concat(output);
            }, err => {
                console.log(err);
                feedbackMessage(FeedbackType.Error, 'Načítání dat', `Při načítání dat došlo k chybě. Zkontrolujte prosím vaše internetové připojení.`);
                this.routerExtensions.back();
            });
    }

    onSexSelect() {
        const options = {
            message: 'Zvolte pohlaví',
            cancelButtonText: 'Zrušit',
            actions: SexTypes.sexTypes.map(obj => obj.sex)
        };

        action(options).then((result) => {
            const sex = SexTypes.sexTypes.find(obj => obj.sex === result);
            this.advertisingCategory.Sex = sex.sex;
            this.advertisingCategory.ID_Sex = sex.id;
        });
    }

    onMeetingSelect(args: EventData) {
        const options = {
            message: 'Zvolte termín schůzky',
            cancelButtonText: 'Zrušit',
            actions: this.meetingDates.map(obj => obj.DisplayName)
        };

        action(options).then((result) => {
            const meeting = this.meetingDates.find(obj => obj.DisplayName === result);
            this.advertisingCategory.ID_MeetingDate = meeting.ID;
            (<TextField>args.object).text = meeting.DisplayName;
        });
    }

    onSaveTap() {
        if (this.advertisingCategory.AgeFrom.toString() === '' ||
            this.advertisingCategory.AgeTo.toString() === '') {
            feedbackMessage(FeedbackType.Error, 'Přidání náborové kategorie', `Vyplňte údaje o věku.`);

            return;
        }

        if (this.advertisingCategory.Sex === null) {
            feedbackMessage(FeedbackType.Error, 'Přidání náborové kategorie', `Vyplňte pohlaví.`);

            return;
        }

        if (this.advertisingCategory.ID_MeetingDate === null) {
            feedbackMessage(FeedbackType.Error, 'Přidání náborové kategorie', `Vyplňte termín schůzky.`);

            return;
        }

        if (this.advertisingCategory.AgeFrom > this.advertisingCategory.AgeTo) {
            feedbackMessage(FeedbackType.Error, 'Přidání náborové kategorie', `Věk od nemůže být menší než věk do.`);

            return;
        }

        if (this.advertisingCategory.Note === null) {
            this.advertisingCategory.Note = '';
        }

        this.store.dispatch(new UpdateAdvertisingCategory(
            this.id,
            this.advertisingCategory.AgeFrom,
            this.advertisingCategory.AgeTo,
            this.advertisingCategory.ID_Sex,
            this.advertisingCategory.Sex,
            this.advertisingCategory.Note,
            this.advertisingCategory.ID_MeetingDate))
            .subscribe(() => {
                feedbackMessage(FeedbackType.Success, 'Ukládání náborové kategorie', 'Náborová kategorie byla úspěšně uložena');
                this.routerExtensions.back();
            }, err => {
                console.log(err);
                feedbackMessage(FeedbackType.Error, 'Ukládání náborové kategorie', `Při ukládání náborové kategorie došlo k chybě. Zkontrolujte prosím vaše internetové připojení.`);
            });
    }

    onBackButton(): void {
        this.routerExtensions.back();
    }

    get saveIcon() {
        return String.fromCharCode(0xf0c7);
    }
}
