////////////////////////////////////////////////////////////////////////////////
//
//  Licensed to the Apache Software Foundation (ASF) under one or more
//  contributor license agreements.  See the NOTICE file distributed with
//  this work for additional information regarding copyright ownership.
//  The ASF licenses this file to You under the Apache License, Version 2.0
//  (the "License"); you may not use this file except in compliance with
//  the License.  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////

package spark.components {
    import mx.collections.ArrayCollection;
    import mx.collections.ArrayList;
    import mx.collections.IList;
    import mx.collections.ListCollectionView;

    import org.flexunit.asserts.assertEquals;
    import org.flexunit.asserts.assertNotNull;
    import org.fluint.uiImpersonation.UIImpersonator;

    import spark.components.gridClasses.GridColumn;
    import spark.formatters.DateTimeFormatter;

    public class DataGrid_FLEX_34837_Tests {
        private var _sut:DataGrid;

        [Before]
        public function setUp():void
        {
            _sut = new DataGrid();
        }

        [After]
        public function tearDown():void
        {
            _sut = null;
        }

        [Test]
        public function test_removing_selected_item_on_complex_field_sorted_grid_after_renaming_it():void
        {
            //given
            var streetColumn:GridColumn = new GridColumn("address.street");
            _sut.columns = new ArrayCollection([streetColumn]);

            const tenObjects:IList = generateVOs(10);
            const firstObject:FLEX_34837_VO = tenObjects.getItemAt(0) as FLEX_34837_VO;
            const dataProvider:ListCollectionView = new ListCollectionView(tenObjects);

            //when
            UIImpersonator.addChild(_sut);
            assertNotNull("UIImpersonator doesn't work correctly!", _sut.grid);
            _sut.dataProvider = dataProvider;
            _sut.sortByColumns(new <int>[0]); //sort by address.street
            firstObject.address.street = "zzz"; //should move it at the end of the list

            //then
            assertEquals("The object should have moved to the end of the list!", dataProvider.length - 1, dataProvider.getItemIndex(firstObject));
            dataProvider.removeItemAt(dataProvider.getItemIndex(firstObject)); //make sure there's no RTE
            assertEquals("The item wasn't removed!", 9, dataProvider.length);
        }

        [Test]
        public function test_removing_selected_item_on_complex_field_sorted_grid_with_formatter_after_renaming_it():void
        {
            //given
            var dateColumn:GridColumn = new GridColumn("address.dateMovedIn");
            var dateTimeFormatter:DateTimeFormatter = new DateTimeFormatter();
            dateTimeFormatter.dateTimePattern = "MMMM"; //Full month name
            dateColumn.formatter = dateTimeFormatter;

            _sut.columns = new ArrayCollection([dateColumn]);

            const tenObjects:IList = generateVOs(10);
            const dataProvider:ListCollectionView = new ListCollectionView(tenObjects);

            //when
            UIImpersonator.addChild(_sut);
            assertNotNull("UIImpersonator doesn't work correctly!", _sut.grid);
            _sut.dataProvider = dataProvider;
            _sut.sortByColumns(new <int>[0]); //sort by address.dateMovedIn, in effect by month name

            //then
            const aprilObject:FLEX_34837_VO = tenObjects.getItemAt(3) as FLEX_34837_VO;
            assertEquals(0, dataProvider.getItemIndex(aprilObject));

            //when
            const septemberObject:FLEX_34837_VO = tenObjects.getItemAt(8) as FLEX_34837_VO;
            septemberObject.address.dateMovedIn = new Date(2000, 3, 2); //"April"; should move it at the start of the list

            const firstObject:FLEX_34837_VO = tenObjects.getItemAt(0) as FLEX_34837_VO;
            firstObject.address.dateMovedIn = new Date(2000, 8, 2); //"September"; should move it at the end of the list

            //then
            assertEquals("The object should have moved to the end of the list!", dataProvider.length - 1, dataProvider.getItemIndex(firstObject));
            dataProvider.removeItemAt(dataProvider.getItemIndex(firstObject)); //make sure there's no RTE
            assertEquals("The item wasn't removed!", 9, dataProvider.length);
        }

        [Test]
        public function test_removing_selected_item_on_multiple_field_sorted_grid_with_formatter_changed_after_first_sort_and_after_renaming():void
        {
            //given
            var dateColumn:GridColumn = new GridColumn("address.dateMovedIn");
            _sut.columns = new ArrayCollection([dateColumn]);

            const tenObjects:IList = generateVOs(10);
            const dataProvider:ListCollectionView = new ListCollectionView(tenObjects);

            //when
            UIImpersonator.addChild(_sut);
            assertNotNull("UIImpersonator doesn't work correctly!", _sut.grid);
            _sut.dataProvider = dataProvider;

            var dateTimeFormatter:DateTimeFormatter = new DateTimeFormatter();
            dateTimeFormatter.dateTimePattern = "MMMM"; //Full month name
            dateColumn.formatter = dateTimeFormatter; //this should re-sort the items in the grid according to the month

            _sut.sortByColumns(new <int>[0]); //sort by address.dateMovedIn

            //then
            const aprilObject:FLEX_34837_VO = tenObjects.getItemAt(3) as FLEX_34837_VO;
            assertEquals(0, dataProvider.getItemIndex(aprilObject));

            //when
            const septemberObject:FLEX_34837_VO = tenObjects.getItemAt(8) as FLEX_34837_VO;
            septemberObject.address.dateMovedIn = new Date(2000, 3, 2); //"April"; should move it at the start of the list

            const firstObject:FLEX_34837_VO = tenObjects.getItemAt(0) as FLEX_34837_VO;
            firstObject.address.dateMovedIn = new Date(2000, 8, 2); //"September"; should move it at the end of the list

            //then
            assertEquals("The object should have moved to the end of the list!", dataProvider.length - 1, dataProvider.getItemIndex(firstObject));
            dataProvider.removeItemAt(dataProvider.getItemIndex(firstObject)); //make sure there's no RTE
            assertEquals("The item wasn't removed!", 9, dataProvider.length);
        }

        private static function generateVOs(no:int, reverse:Boolean = false):IList
        {
            return generateObjects(no, reverse, generateOneObject);
        }

        private static function generateObjects(no:int, reverse:Boolean, generator:Function):IList
        {
            var result:Array = [];
            for(var i:int = 0; i < no; i++)
            {
                result.push(generator(i));
            }

            if(reverse)
                result.reverse();

            return new ArrayList(result);
        }

        private static function generateOneObject(i:Number):FLEX_34837_VO
        {
            return new FLEX_34837_VO(i, "Object", "Street");
        }
    }
}

[Bindable]
class FLEX_34837_VO
{
    public var name:String;
    public var address:FLEX_34837_AddressVO;
    public var index:Number;

    public function FLEX_34837_VO(index:Number, namePrefix:String, streetPrefix:String)
    {
        this.index = index;
        this.name = namePrefix + index;
        this.address = new FLEX_34837_AddressVO(streetPrefix + index, Math.floor(index), new Date(2000 + Math.floor(index), Math.floor(index), 1, 0, 0, 0, 1));
    }
}

[Bindable]
class FLEX_34837_AddressVO
{
    public var street:String;
    public var houseNumber:int;
    public var dateMovedIn:Date;

    public function FLEX_34837_AddressVO(street:String, houseNumber:int, dateMovedIn:Date)
    {
        this.street = street;
        this.houseNumber = houseNumber;
        this.dateMovedIn = dateMovedIn;
    }
}