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;

    @IsString()
    public type: 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()
    @IsOptional()
    public id?: string;

    @IsString()
    @IsOptional()
    public uuid?: 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()
    @IsOptional()
    @Type(() => INavLink)
    public previous: INavLink;

    @ValidateNested()
    @IsOptional()
    @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: API_Template[];
}

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

    @IsString()
    public path: string;

    @IsString()
    public image: string;
}

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

    @IsNumber()
    public results_per_page: number;

    @IsArray()
    public folders: 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()
    public facet_name: string;

    @IsString()
    public id: string;

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

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

    @IsString()
    public key: string;

    @IsString()
    public parent_taxon: string;
}
