/** Fields that affect plate image generation (preview + saved PNG). */
export interface PlatePreviewGenerationFields {
    combination: string;
    state: string;
    background_id: number | null;
    characters_id: number | null;
    category_id: number | null;
    frame: boolean;
    display_state: boolean;
    display_position: string;
    width: string;
}

export const PLATE_GENERATION_FIELD_KEYS: (keyof PlatePreviewGenerationFields)[] = [
    'combination',
    'state',
    'background_id',
    'characters_id',
    'category_id',
    'frame',
    'display_state',
    'display_position',
    'width',
];

export function isPlatePreviewReady(fields: PlatePreviewGenerationFields): boolean {
    if (!fields.combination.trim() || !fields.state.trim()) {
        return false;
    }

    if (
        fields.background_id === null
        || fields.characters_id === null
        || fields.category_id === null
        || !fields.width
    ) {
        return false;
    }

    if (fields.display_state && !fields.display_position) {
        return false;
    }

    return true;
}

/** Admin edit/create sidebar preview width — legacy `.fixed_width { min-width: 350px }`. */
export const PLATE_PREVIEW_DISPLAY_WIDTH_PX = 350;

/** Browsershot preview capture dimensions at `deviceScaleFactor: 1`. */
const PLATE_PREVIEW_CAPTURE_WIDTH_FIXED = 700;
const PLATE_PREVIEW_CAPTURE_WIDTH_VARIABLE = 800;
const PLATE_PREVIEW_CAPTURE_HEIGHT = 160;
const PLATE_PREVIEW_CAPTURE_HEIGHT_WITH_STATE = 180;

export function platePreviewDisplayHeightPx(options: {
    width?: string;
    display_state?: boolean;
    display_position?: string;
}): number {
    const captureWidth =
        (options.width ?? 'fixed') === 'fixed'
            ? PLATE_PREVIEW_CAPTURE_WIDTH_FIXED
            : PLATE_PREVIEW_CAPTURE_WIDTH_VARIABLE;

    const captureHeight =
        options.display_state && options.display_position !== 'left'
            ? PLATE_PREVIEW_CAPTURE_HEIGHT_WITH_STATE
            : PLATE_PREVIEW_CAPTURE_HEIGHT;

    return Math.round(PLATE_PREVIEW_DISPLAY_WIDTH_PX * (captureHeight / captureWidth));
}

export function plateGenerationFingerprint(fields: PlatePreviewGenerationFields): string {
    const snapshot: Record<string, string | number | boolean | null> = {};

    for (const key of PLATE_GENERATION_FIELD_KEYS) {
        snapshot[key] = fields[key];
    }

    return JSON.stringify(snapshot);
}
