import { Type } from "class-transformer";
import {
    IsArray,
    IsNumber,
    IsOptional,
    IsString,
    ValidateNested,
} from "class-validator";

export class ISection {
    @IsString()
    public title: string;
    @IsString()
    @IsOptional()
    public shortdesc: string;
    @IsString()
    @IsOptional()
    public thumbnail: string;
    @IsString()
    public href: string;
    @ValidateNested()
    @Type(() => ISection)
    @IsArray()
    @IsOptional()
    public children: ISection[];
}

export class INavTree {
    @IsString()
    public title: string;

    @IsString()
    public href: string;

    @IsString()
    @IsOptional()
    public shortdesc: string;

    @IsString()
    @IsOptional()
    public thumbnail: string;

    @ValidateNested()
    @Type(() => INavTree)
    @IsArray()
    @IsOptional()
    public children: INavTree[];
}

export class INavLink {
    @IsString()
    public href: string;

    @IsString()
    public title: string;
}

export class IMetaTaxonomy {
    public humanReadable: string;
    public values: Array<{value: string; humanReadable: string;}>;
}

export class IMetaDateTime {
    public humanReadable: string;
    public value: number;
}

export class IMetaLabel { }

export class IMetaTextSingleLine { }

export class IMetadata {
    public taxonomy: Record<string, IMetaTaxonomy>;
    public date: Record<string, IMetaDateTime>;
    public label: Record<string, IMetaLabel>;
    public text_single_Line: Record<string, IMetaTextSingleLine>;
}

export class IPageContent {
    @IsString()
    public content: string;

    @IsString()
    public href: string;

    @ValidateNested()
    @Type(() => INavLink)
    @IsArray()
    public breadcrumbs: INavLink[];

    @ValidateNested()
    @Type(() => INavLink)
    @IsArray()
    public versions: INavLink[];

    @IsString()
    public current_version: string;

    @ValidateNested()
    @Type(() => INavLink)
    @IsArray()
    public children: INavLink[];

    @ValidateNested()
    @Type(() => INavLink)
    public parent: INavLink;

    @ValidateNested()
    @Type(() => INavLink)
    @IsArray()
    public relatedLinks: INavLink[];

    @IsOptional()
    @IsString()
    public title: string;

    @IsOptional()
    @IsString()
    public shortdesc: string;

    @ValidateNested()
    @Type(() => INavLink)
    public previous: INavLink;

    @ValidateNested()
    @Type(() => INavLink)
    public next: INavLink;

    @ValidateNested()
    @Type(() => IMetadata)
    public standardMetadata: IMetadata;

    @ValidateNested()
    @Type(() => IMetadata)
    public customMetadata: IMetadata;

    @IsString()
    public page_type: string;
}

export class API_Config {
    @Type(() => API_SearchConfig)
    public search: API_SearchConfig;

    @ValidateNested()
    @Type(() => API_Template)
    @IsArray()
    public templates: Array<API_Template>;
}

export class API_Template {
    @IsString()
    title: string;

    @IsString()
    path: string;

    @IsString()
    image: string;
}

export class API_SearchConfig {
    @ValidateNested()
    @Type(() => IFilter)
    @IsArray()
    @IsOptional()
    public filters: Array<IFilter>;

    @IsNumber()
    public results_per_page: number;

    @IsArray()
    public folders: Array<string>;
}

export class ISearchHit {
    @IsString()
    public title: string;

    @Type(() => INavLink)
    @IsArray()
    public breadcrumbs: INavLink[];

    @IsString()
    public href: string;

    @IsArray()
    public highlights: string[];

    @IsString()
    public shortDescription: string;
}
export class ISearchResponse {
    @Type(() => ISearchHit)
    @IsArray()
    public results: ISearchHit[];

    @IsNumber()
    public total_count: number
}

export class IFacetValue {
    @IsString()
    facet_name: string;

    @IsString()
    id: string;

    @ValidateNested()
    @Type(() => IFacetValue)
    @IsArray()
    children: IFacetValue[];
}

export class IFilter {
    @IsString()
    label: string;

    @IsString()
    key: string;

    @IsString()
    parent_taxon: string;
}