/* tslint:disable */
/* eslint-disable */
/**
 * Commander Spellbook API
 * API for Commander Spellbook, the combo database engine for Magic: The Gathering
 *
 * The version of the OpenAPI document: 5.4.10
 * 
 *
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */

import { mapValues } from '../runtime.js';
import type { FeatureProducedByVariant } from './FeatureProducedByVariant.js';
import {
    FeatureProducedByVariantFromJSON,
    FeatureProducedByVariantFromJSONTyped,
    FeatureProducedByVariantToJSON,
    FeatureProducedByVariantToJSONTyped,
} from './FeatureProducedByVariant.js';
import type { VariantLegalities } from './VariantLegalities.js';
import {
    VariantLegalitiesFromJSON,
    VariantLegalitiesFromJSONTyped,
    VariantLegalitiesToJSON,
    VariantLegalitiesToJSONTyped,
} from './VariantLegalities.js';
import type { BracketTagEnum } from './BracketTagEnum.js';
import {
    BracketTagEnumFromJSON,
    BracketTagEnumFromJSONTyped,
    BracketTagEnumToJSON,
    BracketTagEnumToJSONTyped,
} from './BracketTagEnum.js';
import type { VariantPrices } from './VariantPrices.js';
import {
    VariantPricesFromJSON,
    VariantPricesFromJSONTyped,
    VariantPricesToJSON,
    VariantPricesToJSONTyped,
} from './VariantPrices.js';
import type { ColorEnum } from './ColorEnum.js';
import {
    ColorEnumFromJSON,
    ColorEnumFromJSONTyped,
    ColorEnumToJSON,
    ColorEnumToJSONTyped,
} from './ColorEnum.js';
import type { VariantStatusEnum } from './VariantStatusEnum.js';
import {
    VariantStatusEnumFromJSON,
    VariantStatusEnumFromJSONTyped,
    VariantStatusEnumToJSON,
    VariantStatusEnumToJSONTyped,
} from './VariantStatusEnum.js';
import type { Combo } from './Combo.js';
import {
    ComboFromJSON,
    ComboFromJSONTyped,
    ComboToJSON,
    ComboToJSONTyped,
} from './Combo.js';
import type { CardInVariant } from './CardInVariant.js';
import {
    CardInVariantFromJSON,
    CardInVariantFromJSONTyped,
    CardInVariantToJSON,
    CardInVariantToJSONTyped,
} from './CardInVariant.js';
import type { TemplateInVariant } from './TemplateInVariant.js';
import {
    TemplateInVariantFromJSON,
    TemplateInVariantFromJSONTyped,
    TemplateInVariantToJSON,
    TemplateInVariantToJSONTyped,
} from './TemplateInVariant.js';

/**
 * 
 * @export
 * @interface Variant
 */
export interface Variant {
    /**
     * Unique ID for this variant
     * @type {string}
     * @memberof Variant
     */
    id: string;
    /**
     * Variant status for editors
     * 
     * * `N` - New
     * * `D` - Draft
     * * `NR` - Needs Review
     * * `OK` - Ok
     * * `E` - Example
     * * `R` - Restore
     * * `NW` - Not Working
     * @type {VariantStatusEnum}
     * @memberof Variant
     */
    status: VariantStatusEnum;
    /**
     * 
     * @type {Array<CardInVariant>}
     * @memberof Variant
     */
    readonly uses: Array<CardInVariant>;
    /**
     * 
     * @type {Array<TemplateInVariant>}
     * @memberof Variant
     */
    readonly requires: Array<TemplateInVariant>;
    /**
     * 
     * @type {Array<FeatureProducedByVariant>}
     * @memberof Variant
     */
    readonly produces: Array<FeatureProducedByVariant>;
    /**
     * 
     * @type {Array<Combo>}
     * @memberof Variant
     */
    readonly of: Array<Combo>;
    /**
     * 
     * @type {Array<Combo>}
     * @memberof Variant
     */
    readonly includes: Array<Combo>;
    /**
     * 
     * @type {ColorEnum}
     * @memberof Variant
     */
    identity: ColorEnum;
    /**
     * 
     * @type {string}
     * @memberof Variant
     */
    readonly manaNeeded: string;
    /**
     * 
     * @type {number}
     * @memberof Variant
     */
    readonly manaValueNeeded: number;
    /**
     * 
     * @type {string}
     * @memberof Variant
     */
    readonly easyPrerequisites: string;
    /**
     * 
     * @type {string}
     * @memberof Variant
     */
    readonly notablePrerequisites: string;
    /**
     * 
     * @type {string}
     * @memberof Variant
     */
    readonly description: string;
    /**
     * 
     * @type {string}
     * @memberof Variant
     */
    readonly notes: string;
    /**
     * 
     * @type {number}
     * @memberof Variant
     */
    readonly popularity: number | null;
    /**
     * Is this from an upcoming set?
     * @type {boolean}
     * @memberof Variant
     */
    spoiler: boolean;
    /**
     * 
     * @type {BracketTagEnum}
     * @memberof Variant
     */
    bracketTag: BracketTagEnum;
    /**
     * 
     * @type {VariantLegalities}
     * @memberof Variant
     */
    readonly legalities: VariantLegalities;
    /**
     * 
     * @type {VariantPrices}
     * @memberof Variant
     */
    readonly prices: VariantPrices;
    /**
     * Number of variants generated by the same generator combos
     * @type {number}
     * @memberof Variant
     */
    readonly variantCount: number;
}



/**
 * Check if a given object implements the Variant interface.
 */
export function instanceOfVariant(value: object): value is Variant {
    if (!('id' in value) || value['id'] === undefined) return false;
    if (!('status' in value) || value['status'] === undefined) return false;
    if (!('uses' in value) || value['uses'] === undefined) return false;
    if (!('requires' in value) || value['requires'] === undefined) return false;
    if (!('produces' in value) || value['produces'] === undefined) return false;
    if (!('of' in value) || value['of'] === undefined) return false;
    if (!('includes' in value) || value['includes'] === undefined) return false;
    if (!('identity' in value) || value['identity'] === undefined) return false;
    if (!('manaNeeded' in value) || value['manaNeeded'] === undefined) return false;
    if (!('manaValueNeeded' in value) || value['manaValueNeeded'] === undefined) return false;
    if (!('easyPrerequisites' in value) || value['easyPrerequisites'] === undefined) return false;
    if (!('notablePrerequisites' in value) || value['notablePrerequisites'] === undefined) return false;
    if (!('description' in value) || value['description'] === undefined) return false;
    if (!('notes' in value) || value['notes'] === undefined) return false;
    if (!('popularity' in value) || value['popularity'] === undefined) return false;
    if (!('spoiler' in value) || value['spoiler'] === undefined) return false;
    if (!('bracketTag' in value) || value['bracketTag'] === undefined) return false;
    if (!('legalities' in value) || value['legalities'] === undefined) return false;
    if (!('prices' in value) || value['prices'] === undefined) return false;
    if (!('variantCount' in value) || value['variantCount'] === undefined) return false;
    return true;
}

export function VariantFromJSON(json: any): Variant {
    return VariantFromJSONTyped(json, false);
}

export function VariantFromJSONTyped(json: any, ignoreDiscriminator: boolean): Variant {
    if (json == null) {
        return json;
    }
    return {
        
        'id': json['id'],
        'status': VariantStatusEnumFromJSON(json['status']),
        'uses': ((json['uses'] as Array<any>).map(CardInVariantFromJSON)),
        'requires': ((json['requires'] as Array<any>).map(TemplateInVariantFromJSON)),
        'produces': ((json['produces'] as Array<any>).map(FeatureProducedByVariantFromJSON)),
        'of': ((json['of'] as Array<any>).map(ComboFromJSON)),
        'includes': ((json['includes'] as Array<any>).map(ComboFromJSON)),
        'identity': ColorEnumFromJSON(json['identity']),
        'manaNeeded': json['manaNeeded'],
        'manaValueNeeded': json['manaValueNeeded'],
        'easyPrerequisites': json['easyPrerequisites'],
        'notablePrerequisites': json['notablePrerequisites'],
        'description': json['description'],
        'notes': json['notes'],
        'popularity': json['popularity'],
        'spoiler': json['spoiler'],
        'bracketTag': BracketTagEnumFromJSON(json['bracketTag']),
        'legalities': VariantLegalitiesFromJSON(json['legalities']),
        'prices': VariantPricesFromJSON(json['prices']),
        'variantCount': json['variantCount'],
    };
}

export function VariantToJSON(json: any): Variant {
    return VariantToJSONTyped(json, false);
}

export function VariantToJSONTyped(value?: Omit<Variant, 'uses'|'requires'|'produces'|'of'|'includes'|'manaNeeded'|'manaValueNeeded'|'easyPrerequisites'|'notablePrerequisites'|'description'|'notes'|'popularity'|'legalities'|'prices'|'variantCount'> | null, ignoreDiscriminator: boolean = false): any {
    if (value == null) {
        return value;
    }

    return {
        
        'id': value['id'],
        'status': VariantStatusEnumToJSON(value['status']),
        'identity': ColorEnumToJSON(value['identity']),
        'spoiler': value['spoiler'],
        'bracketTag': BracketTagEnumToJSON(value['bracketTag']),
    };
}

