// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';

// Each TabBarView contains a _Page and for each _Page there is a list
// of _CardData objects. Each _CardData object is displayed by a _CardItem.

class _Page {
  _Page({ this.label });
  final GlobalKey<ScrollableState> scrollableKey = new GlobalKey<ScrollableState>();
  final String label;
  String get id => label[0];
}

class _CardData {
  const _CardData({ this.title, this.imageAsset });
  final String title;
  final String imageAsset;
}

final Map<_Page, List<_CardData>> _allPages = <_Page, List<_CardData>>{
  new _Page(label: 'LEFT'): <_CardData>[
    const _CardData(
      title: 'Vintage Bluetooth Radio',
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/radio.png'
    ),
    const _CardData(
      title: 'Sunglasses',
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/sunnies.png'
    ),
    const _CardData(
      title: 'Clock',
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/clock.png'
    ),
    const _CardData(
      title: 'Red popsicle',
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/popsicle.png'
    ),
    const _CardData(
      title: 'Folding Chair',
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/lawn_chair.png'
    ),
    const _CardData(
      title: 'Green comfort chair',
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/chair.png'
    ),
  ],
  new _Page(label: 'RIGHT'): <_CardData>[
    const _CardData(
      title: 'Beachball',
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/beachball.png'
    ),
    const _CardData(
      title: 'Old Binoculars',
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/binoculars.png'
    ),
    const _CardData(
      title: 'Teapot',
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/teapot.png'
    ),
    const _CardData(
      title: 'Blue suede shoes',
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/chucks.png'
    ),
    const _CardData(
      title: 'Dipped Brush',
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/brush.png'
    ),
    const _CardData(
      title: 'Perfect Goldfish Bowl',
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/fish_bowl.png'
    ),
  ]
};

class _CardDataItem extends StatelessWidget {
  _CardDataItem({ this.page, this.data });

  static final double height = 272.0;
  final _Page page;
  final _CardData data;

  @override
  Widget build(BuildContext context) {
    return new Card(
      child: new Padding(
        padding: const EdgeInsets.all(16.0),
        child: new Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[
            new Align(
              alignment: page.id == 'L'
                ? FractionalOffset.centerLeft
                : FractionalOffset.centerRight,
              child: new CircleAvatar(child: new Text('${page.id}'))
            ),
            new SizedBox(
              width: 144.0,
              height: 144.0,
              child: new Image.asset(data.imageAsset, fit: ImageFit.contain)
            ),
            new Center(
              child: new Text(data.title, style: Theme.of(context).textTheme.title)
            )
          ]
        )
      )
    );
  }
}

class TabsDemo extends StatefulWidget {
  TabsDemo({ Key key }) : super(key: key);

  static const String routeName = '/tabs';

  @override
  _TabsDemoState createState() => new _TabsDemoState();
}

class _TabsDemoState extends State<TabsDemo> {
  _Page _selectedPage;

  @override
  void initState() {
    super.initState();
    _selectedPage = _allPages.keys.first;
  }

  @override
  Widget build(BuildContext context) {
    return new TabBarSelection<_Page>(
      values: _allPages.keys.toList(),
      onChanged: (_Page value) {
        setState(() {
          _selectedPage = value;
       });
      },
      child: new Scaffold(
        scrollableKey: _selectedPage.scrollableKey,
        appBar: new AppBar(
          title: new Text('Tabs and scrolling'),
          bottom: new TabBar<_Page>(
            labels: new Map<_Page, TabLabel>.fromIterable(_allPages.keys, value: (_Page page) {
              return new TabLabel(text: page.label);
            })
          )
        ),
        body: new TabBarView<_Page>(
          children: _allPages.keys.map((_Page page) {
            return new ScrollableList(
              scrollableKey: page.scrollableKey,
              padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0),
              itemExtent: _CardDataItem.height,
              children: _allPages[page].map((_CardData data) {
                return new Padding(
                  padding: const EdgeInsets.symmetric(vertical: 8.0),
                  child: new _CardDataItem(page: page, data: data)
                );
              }).toList()
            );
          }).toList()
        )
      )
    );
  }
}