/* 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: 4.2.2
 * 
 *
 * 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';
import type { FeatureProducedInVariantSuggestion } from './featureProducedInVariantSuggestion';
import {
    FeatureProducedInVariantSuggestionFromJSON,
    FeatureProducedInVariantSuggestionFromJSONTyped,
    FeatureProducedInVariantSuggestionToJSON,
    FeatureProducedInVariantSuggestionToJSONTyped,
} from './featureProducedInVariantSuggestion';
import type { User } from './user';
import {
    UserFromJSON,
    UserFromJSONTyped,
    UserToJSON,
    UserToJSONTyped,
} from './user';
import type { CardUsedInVariantSuggestion } from './cardUsedInVariantSuggestion';
import {
    CardUsedInVariantSuggestionFromJSON,
    CardUsedInVariantSuggestionFromJSONTyped,
    CardUsedInVariantSuggestionToJSON,
    CardUsedInVariantSuggestionToJSONTyped,
} from './cardUsedInVariantSuggestion';
import type { VariantSuggestionStatusEnum } from './variantSuggestionStatusEnum';
import {
    VariantSuggestionStatusEnumFromJSON,
    VariantSuggestionStatusEnumFromJSONTyped,
    VariantSuggestionStatusEnumToJSON,
    VariantSuggestionStatusEnumToJSONTyped,
} from './variantSuggestionStatusEnum';
import type { TemplateRequiredInVariantSuggestion } from './templateRequiredInVariantSuggestion';
import {
    TemplateRequiredInVariantSuggestionFromJSON,
    TemplateRequiredInVariantSuggestionFromJSONTyped,
    TemplateRequiredInVariantSuggestionToJSON,
    TemplateRequiredInVariantSuggestionToJSONTyped,
} from './templateRequiredInVariantSuggestion';

/**
 * 
 * @export
 * @interface VariantSuggestion
 */
export interface VariantSuggestion {
    /**
     * 
     * @type {number}
     * @memberof VariantSuggestion
     */
    readonly id: number;
    /**
     * Suggestion status for editors
     * 
     * * `N` - New
     * * `AD` - Awaiting Discussion
     * * `PA` - Pending Approval
     * * `A` - Accepted
     * * `R` - Rejected
     * @type {VariantSuggestionStatusEnum}
     * @memberof VariantSuggestion
     */
    readonly status: VariantSuggestionStatusEnum;
    /**
     * Notes written by editors
     * @type {string}
     * @memberof VariantSuggestion
     */
    notes: string;
    /**
     * 
     * @type {Array<CardUsedInVariantSuggestion>}
     * @memberof VariantSuggestion
     */
    uses: Array<CardUsedInVariantSuggestion>;
    /**
     * 
     * @type {Array<TemplateRequiredInVariantSuggestion>}
     * @memberof VariantSuggestion
     */
    requires: Array<TemplateRequiredInVariantSuggestion>;
    /**
     * 
     * @type {Array<FeatureProducedInVariantSuggestion>}
     * @memberof VariantSuggestion
     */
    produces: Array<FeatureProducedInVariantSuggestion>;
    /**
     * Mana needed for this combo. Use the {1}{W}{U}{B}{R}{G}{B/P}... format.
     * @type {string}
     * @memberof VariantSuggestion
     */
    manaNeeded: string;
    /**
     * Easily achievable prerequisites for this combo.
     * @type {string}
     * @memberof VariantSuggestion
     */
    easyPrerequisites: string;
    /**
     * Notable prerequisites for this combo.
     * @type {string}
     * @memberof VariantSuggestion
     */
    notablePrerequisites: string;
    /**
     * Long description, in steps
     * @type {string}
     * @memberof VariantSuggestion
     */
    description: string;
    /**
     * Is this combo a spoiler?
     * @type {boolean}
     * @memberof VariantSuggestion
     */
    spoiler: boolean;
    /**
     * Comment written by the user that suggested this combo
     * @type {string}
     * @memberof VariantSuggestion
     */
    comment: string;
    /**
     * 
     * @type {User}
     * @memberof VariantSuggestion
     */
    readonly suggestedBy: User;
    /**
     * 
     * @type {Date}
     * @memberof VariantSuggestion
     */
    readonly created: Date;
}



/**
 * Check if a given object implements the VariantSuggestion interface.
 */
export function instanceOfVariantSuggestion(value: object): value is VariantSuggestion {
    if (!('id' in value) || value['id'] === undefined) return false;
    if (!('status' in value) || value['status'] === undefined) return false;
    if (!('notes' in value) || value['notes'] === 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 (!('manaNeeded' in value) || value['manaNeeded'] === 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 (!('spoiler' in value) || value['spoiler'] === undefined) return false;
    if (!('comment' in value) || value['comment'] === undefined) return false;
    if (!('suggestedBy' in value) || value['suggestedBy'] === undefined) return false;
    if (!('created' in value) || value['created'] === undefined) return false;
    return true;
}

export function VariantSuggestionFromJSON(json: any): VariantSuggestion {
    return VariantSuggestionFromJSONTyped(json, false);
}

export function VariantSuggestionFromJSONTyped(json: any, ignoreDiscriminator: boolean): VariantSuggestion {
    if (json == null) {
        return json;
    }
    return {
        
        'id': json['id'],
        'status': VariantSuggestionStatusEnumFromJSON(json['status']),
        'notes': json['notes'],
        'uses': ((json['uses'] as Array<any>).map(CardUsedInVariantSuggestionFromJSON)),
        'requires': ((json['requires'] as Array<any>).map(TemplateRequiredInVariantSuggestionFromJSON)),
        'produces': ((json['produces'] as Array<any>).map(FeatureProducedInVariantSuggestionFromJSON)),
        'manaNeeded': json['manaNeeded'],
        'easyPrerequisites': json['easyPrerequisites'],
        'notablePrerequisites': json['notablePrerequisites'],
        'description': json['description'],
        'spoiler': json['spoiler'],
        'comment': json['comment'],
        'suggestedBy': UserFromJSON(json['suggestedBy']),
        'created': (new Date(json['created'])),
    };
}

export function VariantSuggestionToJSON(json: any): VariantSuggestion {
    return VariantSuggestionToJSONTyped(json, false);
}

export function VariantSuggestionToJSONTyped(value?: Omit<VariantSuggestion, 'id'|'status'|'suggestedBy'|'created'> | null, ignoreDiscriminator: boolean = false): any {
    if (value == null) {
        return value;
    }

    return {
        
        'notes': value['notes'],
        'uses': ((value['uses'] as Array<any>).map(CardUsedInVariantSuggestionToJSON)),
        'requires': ((value['requires'] as Array<any>).map(TemplateRequiredInVariantSuggestionToJSON)),
        'produces': ((value['produces'] as Array<any>).map(FeatureProducedInVariantSuggestionToJSON)),
        'manaNeeded': value['manaNeeded'],
        'easyPrerequisites': value['easyPrerequisites'],
        'notablePrerequisites': value['notablePrerequisites'],
        'description': value['description'],
        'spoiler': value['spoiler'],
        'comment': value['comment'],
    };
}

