// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable enable

using System.Drawing;

namespace System.Windows.Forms.Metafiles;

internal static class Validate
{
    /// <param name="bounds">Optional bounds to validate.</param>
    /// <param name="points">Optional points to validate.</param>
    /// <param name="stateValidators">Optional device context state validation to perform.</param>
    internal static IEmfValidator Polygon16(
        Rectangle? bounds = default,
        Point[]? points = default,
        params IStateValidator[] stateValidators) => new Polygon16Validator(
            bounds,
            points,
            stateValidators);

    /// <param name="bounds">Optional bounds to validate.</param>
    /// <param name="points">Optional points to validate.</param>
    /// <param name="stateValidators">Optional device context state validation to perform.</param>
    internal static IEmfValidator Polyline16(
        Rectangle? bounds = default,
        Point[]? points = default,
        params IStateValidator[] stateValidators) => new Polyline16Validator(
            bounds,
            points,
            stateValidators);

    /// <param name="bounds">Optional bounds to validate.</param>
    /// <param name="polyCount">Optional count of polygons to validate.</param>
    /// <param name="stateValidators">Optional device context state validation to perform.</param>
    internal static IEmfValidator PolyPolygon16(
        Rectangle? bounds = default,
        int? polyCount = default,
        params IStateValidator[] stateValidators) => new PolyPolygon16Validator(
            bounds,
            polyCount,
            stateValidators);

    /// <param name="bounds">Optional bounds to validate.</param>
    /// <param name="polyCount">Optional count of polygons to validate.</param>
    /// <param name="stateValidators">Optional device context state validation to perform.</param>
    internal static IEmfValidator PolyPolyline16(
        Rectangle? bounds = default,
        int? polyCount = default,
        params IStateValidator[] stateValidators) => new PolyPolyline16Validator(
            bounds,
            polyCount,
            stateValidators);

    /// <param name="text">Optional text to validate.</param>
    /// <param name="bounds">Optional bounds to validate.</param>
    /// <param name="stateValidators">Optional device context state validation to perform.</param>
    internal static IEmfValidator TextOut(
        string? text = default,
        Rectangle? bounds = default,
        params IStateValidator[] stateValidators) => new TextOutValidator(
            text,
            bounds,
            stateValidators);

    /// <param name="from">Optional source point to validate.</param>
    /// <param name="to">Optional destination point to validate.</param>
    /// <param name="stateValidators">Optional device context state validation to perform.</param>
    internal static IEmfValidator LineTo(
        Point? from,
        Point? to,
        params IStateValidator[] stateValidators) => new LineToValidator(
            from,
            to,
            stateValidators);

    /// <param name="bounds">Optional bounds to validate.</param>
    /// <param name="stateValidators">Optional device context state validation to perform.</param>
    internal static IEmfValidator Rectangle(
        RECT? bounds,
        params IStateValidator[] stateValidators) => new RectangleValidator(
            bounds,
            stateValidators);

    /// <param name="bounds">Optional bounds to validate.</param>
    /// <param name="stateValidators">Optional device context state validation to perform.</param>
    public static IEmfValidator BitBltValidator(
        RECT? bounds,
        params IStateValidator[] stateValidators) => new BitBltValidator(
            bounds,
            stateValidators);

    /// <summary>
    ///  Simple wrapper to allow doing an arbitrary action for a given <paramref name="recordType"/>.
    /// </summary>
    internal static IEmfValidator Action(ENHANCED_METAFILE_RECORD_TYPE recordType, ProcessRecordDelegate action)
        => new ActionValidator(recordType, action);

    /// <summary>
    ///  Simple wrapper to allow doing an arbitrary action for a given <paramref name="recordType"/>.
    /// </summary>
    internal static IEmfValidator Action(ENHANCED_METAFILE_RECORD_TYPE recordType, ProcessRecordWithStateDelegate action)
        => new ActionValidator(recordType, action);

    /// <summary>
    ///  Skip all records from this point. Use when you don't care about any further records.
    /// </summary>
    internal static IEmfValidator SkipAll() => SkipAllValidator.Instance;

    /// <summary>
    ///  Skip all output records that the given <paramref name="validator"/> does not validate.
    /// </summary>
    internal static IEmfValidator SkipTo(IEmfValidator validator) => new SkipToValidator(validator);

    /// <summary>
    ///  Skips the next record of the given type.
    /// </summary>
    internal static IEmfValidator SkipType(ENHANCED_METAFILE_RECORD_TYPE type) => new SkipTypesValidator(type);

    /// <summary>
    ///  Skip the next record if it matches any of the given types.
    /// </summary>
    internal static IEmfValidator SkipTypes(params ENHANCED_METAFILE_RECORD_TYPE[] types) => new SkipTypesValidator(types);

    /// <summary>
    ///  Repeat the given validation <paramref name="count"/> number of times.
    /// </summary>
    internal static IEmfValidator Repeat(IEmfValidator validator, int count) => new RepeatValidator(validator, count);
}
