import { SharedContracts } from '../../contracts';

export namespace LanguageVariantElements {
    export interface ILanguageVariantElementBase {
        element: SharedContracts.IReferenceObjectContract;
        value: any;
    }

    export interface IRichTextComponent {
        id: string;
        type: SharedContracts.IReferenceObjectContract;
        elements: ILanguageVariantElementBase[];
    }

    export interface IAssetInVariantElement extends ILanguageVariantElementBase {
        value: SharedContracts.IReferenceObjectContract[] | null;
    }

    export interface ICustomElementInVariantElement extends ILanguageVariantElementBase {
        value: string | null;
        searchable_value?: string;
    }

    export interface IDateTimeInVariantElement extends ILanguageVariantElementBase {
        value: string | null;
        display_timezone: string | null;
    }

    export interface ILinkedItemsInVariantElement extends ILanguageVariantElementBase {
        value: SharedContracts.IReferenceObjectContract[] | null;
    }

    export interface IMultipleChoiceInVariantElement extends ILanguageVariantElementBase {
        value: SharedContracts.IReferenceObjectContract[] | null;
    }

    export interface INumberInVariantElement extends ILanguageVariantElementBase {
        value: number | null;
    }

    export interface IRichtextInVariantElement extends ILanguageVariantElementBase {
        value: string | null;
        components?: IRichTextComponent[];
    }

    export interface ITaxonomyInVariantElement extends ILanguageVariantElementBase {
        value: SharedContracts.IReferenceObjectContract[] | null;
    }

    export interface ITextInVariantElement extends ILanguageVariantElementBase {
        value: string | null;
    }

    export interface IUrlSlugInVariantElement extends ILanguageVariantElementBase {
        value: string | null;
        mode: 'autogenerated' | 'custom';
    }
}

export class LanguageVariantElementsBuilder {
    assetElement(
        element: LanguageVariantElements.IAssetInVariantElement
    ): LanguageVariantElements.ILanguageVariantElementBase {
        return element;
    }

    customElement(
        element: LanguageVariantElements.ICustomElementInVariantElement
    ): LanguageVariantElements.ILanguageVariantElementBase {
        return element;
    }

    dateTimeElement(
        element: LanguageVariantElements.IDateTimeInVariantElement
    ): LanguageVariantElements.ILanguageVariantElementBase {
        return element;
    }

    linkedItemsElement(
        element: LanguageVariantElements.ILinkedItemsInVariantElement
    ): LanguageVariantElements.ILanguageVariantElementBase {
        return element;
    }

    multipleChoiceElement(
        element: LanguageVariantElements.IMultipleChoiceInVariantElement
    ): LanguageVariantElements.ILanguageVariantElementBase {
        return element;
    }

    numberElement(
        element: LanguageVariantElements.INumberInVariantElement
    ): LanguageVariantElements.ILanguageVariantElementBase {
        return element;
    }

    richTextElement(
        element: LanguageVariantElements.IRichtextInVariantElement
    ): LanguageVariantElements.ILanguageVariantElementBase {
        return element;
    }

    taxonomyElement(
        element: LanguageVariantElements.ITaxonomyInVariantElement
    ): LanguageVariantElements.ILanguageVariantElementBase {
        return element;
    }

    textElement(
        element: LanguageVariantElements.ITextInVariantElement
    ): LanguageVariantElements.ILanguageVariantElementBase {
        return element;
    }

    urlSlugElement(
        element: LanguageVariantElements.IUrlSlugInVariantElement
    ): LanguageVariantElements.ILanguageVariantElementBase {
        return element;
    }

    any(element: any): LanguageVariantElements.ILanguageVariantElementBase {
        return element;
    }
}

export const languageVariantElementsBuilder = new LanguageVariantElementsBuilder();
