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

namespace System.ComponentModel.Design;

/// <summary>
///  Edits an array of values.
/// </summary>
public class ArrayEditor : CollectionEditor
{
    /// <summary>
    ///  Initializes a new instance of <see cref="ArrayEditor"/>
    ///  using the specified type for the array.
    /// </summary>
    public ArrayEditor(Type type) : base(type)
    {
    }

    /// <summary>
    ///  Gets or sets the data type this collection contains.
    /// </summary>
    protected override Type CreateCollectionItemType()
    {
        Type? type = CollectionType.GetElementType();

        return type is null ? throw new InvalidOperationException() : type;
    }

    /// <summary>
    ///  Gets the items in the array.
    /// </summary>
    protected override object[] GetItems(object? editValue)
    {
        if (editValue is Array valueArray)
        {
            object[] items = new object[valueArray.GetLength(0)];
            Array.Copy(valueArray, items, items.Length);
            return items;
        }

        return [];
    }

    /// <summary>
    ///  Sets the items in the array.
    /// </summary>
    protected override object? SetItems(object? editValue, object[]? value)
    {
        if (editValue is not null and not Array)
        {
            return editValue;
        }

        if (value is null)
        {
            return null;
        }

        Array newArray = Array.CreateInstance(CollectionItemType, value.Length);
        Array.Copy(value, newArray, value.Length);
        return newArray;
    }
}
