import { Action, Select, Selector, State, StateContext } from '@ngxs/store';
import { Observable } from 'rxjs';
import { UserRoleAllOutput } from '~/core/entities/output/userRoleAllOutput';
import { AppState } from '~/core/state-mgmt/app.state';
import { EvaluationUpdatePermission } from './evaluation-permission.actions';

export interface EvaluationPermissionStateModel {
    hasPersonEvalPermission: boolean;
    entityNumber: string;
}

const initialStateModel: EvaluationPermissionStateModel = {
    hasPersonEvalPermission: false,
    entityNumber: ''
};

@State<EvaluationPermissionStateModel>({
    name: 'evaluationPermission',
    defaults: initialStateModel
})

export class EvaluationPermissionState {

    @Selector()
    static hasPersonEvalPermission(state: EvaluationPermissionStateModel): boolean {
        return state.hasPersonEvalPermission;
    }

    @Selector()
    static getEntityNumber(state: EvaluationPermissionStateModel): string {
        return state.entityNumber;
    }

    personalEvalutionAllowed = [
        'Družina: vedoucí/admin',
        'Kraj: vedoucí/admin',
        'Oddíl: vedoucí/admin',
        'Okres: vedoucí/admin',
        'Středisko: vedoucí/admin',
        'Ústředí: vedoucí/admin',
        'Družina: aktivní činovník',
        'Kraj: aktivní činovník',
        'Oddíl: aktivní činovník',
        'Okres: aktivní činovník',
        'Středisko: aktivní činovník',
        'Ústředí: aktivní činovník'
    ];

    @Select(AppState.getUserRoleAll) userRoleAll$: Observable<UserRoleAllOutput[]>;

    hasPermission(role: string): boolean {
        for (const i in this.personalEvalutionAllowed) {
            if (role.trim().includes(this.personalEvalutionAllowed[i].trim())) {
                return true;
            }
        }

        return false;
    }

    @Action(EvaluationUpdatePermission)
    updatePermission(ctx: StateContext<EvaluationPermissionStateModel>, action: EvaluationUpdatePermission) {
        const splitted = action.role.trim().split(' ');
        ctx.patchState({
            hasPersonEvalPermission: this.hasPermission(action.role),
            entityNumber: splitted[splitted.length - 1]
        });
    }
}
