/**
 * Copyright (c) 2024 Huawei Technologies Co., Ltd.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE-MIT file in the root directory of this source tree.
 */

import {
  Platform,
  StyleSheet,
  Text,
  TouchableWithoutFeedback,
  View,
} from 'react-native';
import { TestSuite, TestCase } from '@rnoh/testerino';
import React, { useState } from 'react';
import { Button } from '../components';

export function ViewTest() {
  return (
    <TestSuite name="View">
      <TestCase
        modal
        itShould="log the descriptor on the native side when 'debug' hint is provided">
        <View
          id="__harmony::debug:sampleNativeId"
          style={{ width: 64, height: 64, backgroundColor: 'red' }}
        />
      </TestCase>
      <TestCase itShould="render square with transparent background on gray background">
        <View style={{ width: '100%', height: 100, backgroundColor: 'gray' }}>
          <View
            style={{
              width: 100,
              height: 100,
              borderWidth: 3,
              borderColor: 'white',
            }}
          />
        </View>
      </TestCase>
      <TestCase itShould="render square with rounded corners with different radii (left/right)">
        <View style={{ width: '100%', height: 100, backgroundColor: 'gray' }}>
          <View
            style={{
              width: 100,
              height: 100,
              borderWidth: 3,
              borderColor: 'white',
              borderTopLeftRadius: 10,
              borderTopRightRadius: 20,
              borderBottomRightRadius: 30,
              borderBottomLeftRadius: 40,
            }}
          />
        </View>
      </TestCase>
      <TestCase itShould="render square with rounded corners with different radii (start/end)">
        <View style={{ width: '100%', height: 100, backgroundColor: 'gray' }}>
          <View
            style={{
              width: 100,
              height: 100,
              borderWidth: 3,
              borderColor: 'white',
              borderTopStartRadius: 10,
              borderTopEndRadius: 20,
              borderBottomEndRadius: 30,
              borderBottomStartRadius: 40,
            }}
          />
        </View>
      </TestCase>
      <TestCase itShould="render squares with borderTopStartRadius and borderTopEndRadius">
        <View style={styles.squaresContainer}>
          <View style={[styles.square, { borderTopStartRadius: 24 }]}>
            <Text style={styles.squareContent}>borderTopStartRadius</Text>
          </View>
          <View style={[styles.square, { borderTopEndRadius: 24 }]}>
            <Text style={styles.squareContent}>borderTopEndRadius</Text>
          </View>
          <View
            style={[
              styles.square,
              { borderTopEndRadius: 24, borderTopStartRadius: 20 },
            ]}>
            <Text style={styles.squareContent}>
              borderTopEndRadius + borderTopStartRadius
            </Text>
          </View>
        </View>
      </TestCase>
      <TestCase itShould="render squares with borderBottomStartRadius + borderBottomEndRadius">
        <View style={styles.squaresContainer}>
          <View style={[styles.square, { borderBottomStartRadius: 24 }]}>
            <Text style={styles.squareContent}>borderBottomStartRadius</Text>
          </View>
          <View style={[styles.square, { borderBottomEndRadius: 24 }]}>
            <Text style={styles.squareContent}>borderBottomEndRadius</Text>
          </View>
          <View
            style={[
              styles.square,
              { borderBottomEndRadius: 24, borderBottomStartRadius: 24 },
            ]}>
            <Text style={styles.squareContent}>
              borderBottomStartRadius + borderBottomEndRadius
            </Text>
          </View>
        </View>
      </TestCase>
      <TestCase itShould="render circles">
        <View style={styles.squaresContainer}>
          <View style={[styles.square, { borderRadius: 50 }]} />
          <View
            style={[
              styles.square,
              {
                borderBottomStartRadius: 50,
                borderBottomEndRadius: 50,
                borderTopStartRadius: 50,
                borderTopEndRadius: 50,
              },
            ]}
          />
          <View
            style={[
              styles.square,
              {
                borderBottomLeftRadius: 50,
                borderBottomRightRadius: 50,
                borderTopLeftRadius: 50,
                borderTopRightRadius: 50,
              },
            ]}
          />
        </View>
      </TestCase>
      <TestCase itShould="render square with borders with different widths">
        <View style={{ width: '100%', height: 100, backgroundColor: 'gray' }}>
          <View
            style={{
              width: 100,
              height: 100,
              borderColor: 'white',
              borderLeftWidth: 2,
              borderTopWidth: 4,
              borderRightWidth: 6,
              borderBottomWidth: 8,
            }}
          />
        </View>
      </TestCase>
      <TestCase itShould="render rectangle with borders with different widths and colors">
        <View style={{ width: '100%', height: 100, backgroundColor: 'gray' }}>
          <View
            style={{
              height: 80,
              width: 200,
              borderLeftWidth: 1,
              borderTopWidth: 10,
              borderRightWidth: 5,
              borderBottomWidth: 20,
              borderLeftColor: '#ff0000',
              borderRightColor: '#ffff00',
              borderTopColor: 'pink',
              borderBottomColor: 'skyblue',
            }}
          />
        </View>
      </TestCase>
      <TestCase itShould="render square with borders with different colors">
        <View style={{ width: '100%', height: 100, backgroundColor: 'gray' }}>
          <View
            style={{
              width: 100,
              height: 100,
              borderWidth: 3,
              borderLeftColor: 'blue',
              borderTopColor: 'red',
              borderRightColor: 'green',
              borderBottomColor: 'yellow',
            }}
          />
        </View>
      </TestCase>
      <TestCase itShould="render square with borders with different start/end colors">
        <View style={{ width: '100%', height: 100, backgroundColor: 'gray' }}>
          <View
            style={{
              width: 100,
              height: 100,
              borderWidth: 3,
              borderStartColor: 'blue',
              borderEndColor: 'green',
            }}
          />
        </View>
      </TestCase>
      <TestCase itShould="render squares with borders with different style">
        <View
          style={{
            width: '100%',
            height: 100,
            backgroundColor: 'gray',
            flexDirection: 'row',
          }}>
          <View
            style={{
              width: 100,
              height: 100,
              marginEnd: 4,
              borderWidth: 3,
              borderColor: 'white',
              borderStyle: 'solid',
            }}
          />
          <View
            style={{
              width: 100,
              height: 100,
              marginEnd: 4,
              borderWidth: 3,
              borderColor: 'white',
              borderStyle: 'dotted',
            }}
          />
          <View
            style={{
              width: 100,
              height: 100,
              borderWidth: 3,
              borderColor: 'white',
              borderStyle: 'dashed',
            }}
          />
        </View>
      </TestCase>
      <TestCase itShould="hide the overflow">
        <View
          style={{
            width: 64,
            height: 64,
            backgroundColor: 'red',
            overflow: 'hidden',
          }}
          collapsable={false}>
          <View
            style={{
              width: 64,
              height: 64,
              backgroundColor: 'green',
              marginLeft: 32,
            }}
          />
        </View>
      </TestCase>
      <TestCase itShould="not hide the overflow">
        <View
          style={{
            width: 64,
            height: 64,
            backgroundColor: 'red',
          }}
          collapsable={false}>
          <View
            style={{
              width: 64,
              height: 64,
              backgroundColor: 'green',
              marginLeft: 32,
            }}
          />
        </View>
      </TestCase>
      <TestCase itShould="render blue rectangle (zIndex test)">
        <View>
          <View
            style={{
              width: 64,
              height: 64,
              backgroundColor: 'blue',
              zIndex: 2,
              position: 'relative', // https://github.com/facebook/react-native/issues/38513
            }}
          />
          <View
            style={{
              width: 64,
              height: 64,
              backgroundColor: 'red',
              zIndex: 1,
              position: 'absolute',
            }}
          />
        </View>
      </TestCase>
      <TestCase
        itShould="render square with elevation"
        skip
      //https://gl.swmansion.com/rnoh/react-native-harmony/-/issues/238
      >
        <View style={{ width: '100%', height: 100 }}>
          <View
            style={{
              width: 80,
              height: 80,
              margin: 10,
              backgroundColor: 'blue',
              elevation: 10,
            }}
          />
        </View>
      </TestCase>
      <TestCase
        skip
        itShould="show inner rectangle with the same color as the reference (needsOffscreenAlphaCompositing)"
      //https://gl.swmansion.com/rnoh/react-native-harmony/-/issues/322
      >
        <View
          style={{
            opacity: 0.5,
            backgroundColor: 'red',
            height: 100,
            width: 100,
          }}
          needsOffscreenAlphaCompositing>
          <View
            style={{
              backgroundColor: 'black',
              width: 60,
              height: 40,
              opacity: 0.5,
            }}
          />
        </View>
        <Text style={{ height: 20 }}>
          Reference black color with opacity: 0.5
        </Text>
        <View
          style={{
            width: 60,
            height: 40,
            backgroundColor: 'black',
            opacity: 0.5,
          }}
        />
      </TestCase>
      <TestSuite name="pointerEvents">
        <TestCase
          itShould="call inner and outer view when pressing inner"
          initialState={{ inner: false, outer: false, outerContainer: false }}
          arrange={({ setState, reset }) => {
            return (
              <PointerEventsView
                pointerEventsOuter="auto"
                setState={setState}
                reset={reset}
              />
            );
          }}
          assert={({ expect, state }) => {
            expect(state).to.be.deep.eq({
              inner: true,
              outer: true,
              outerContainer: true,
            });
          }}
        />
        <TestCase
          itShould="call only outer when pressing inner view"
          initialState={{ inner: false, outer: false, outerContainer: true }}
          arrange={({ setState, reset }) => {
            return (
              <PointerEventsView
                pointerEventsOuter="box-only"
                setState={setState}
                reset={reset}
              />
            );
          }}
          assert={({ expect, state }) => {
            expect(state).to.be.deep.eq({
              inner: false,
              outer: true,
              outerContainer: true,
            });
          }}
        />
        <TestCase
          itShould="call inner and outer only when pressing inner view"
          initialState={{ inner: false, outer: false, outerContainer: false }}
          arrange={({ setState, reset }) => {
            return (
              <PointerEventsView
                disableOuterContainerTouch
                pointerEventsOuter="box-none"
                setState={setState}
                reset={reset}
              />
            );
          }}
          assert={({ expect, state }) => {
            expect(state.inner).to.be.true;
            expect(state.outer).to.be.true;
          }}
        />
        <TestCase
          itShould="not call inner or outer when pressing inner or outer views"
          initialState={{ inner: false, outer: false, outerContainer: false }}
          arrange={({ setState, reset }) => {
            return (
              <PointerEventsView
                pointerEventsOuter="none"
                setState={setState}
                reset={reset}
              />
            );
          }}
          assert={({ expect, state }) => {
            expect(state).to.be.deep.eq({
              inner: false,
              outer: false,
              outerContainer: true,
            });
          }}
        />
      </TestSuite>
      <TestCase
        itShould="pass on touching blue background"
        initialState={false}
        arrange={({ setState }) => (
          <View style={{ backgroundColor: 'blue', alignSelf: 'center' }}>
            <View
              hitSlop={{ top: 48, left: 48, bottom: 48, right: 48 }}
              style={{
                width: 48,
                height: 48,
                backgroundColor: 'green',
                margin: 48,
              }}
              onTouchEnd={() => {
                setState(true);
              }}>
              <View
                style={{ width: 48, height: 48, backgroundColor: 'red' }}
                onTouchEnd={e => {
                  e.stopPropagation();
                }}
              />
            </View>
          </View>
        )}
        assert={({ expect, state }) => {
          expect(state).to.be.true;
        }}
      />
      <TestCase
        itShould="blue view should not allow clicks with non-touch input device"
        modal
        initialState={{ first: false, second: false, third: false }}
        arrange={({ setState }) => (
          <View style={{ width: '100%', height: 100, flexDirection: 'row' }}>
            <TouchableWithoutFeedback
              onPress={() => setState(prev => ({ ...prev, first: true }))}>
              <View
                style={{
                  width: 76,
                  height: 76,
                  marginRight: 4,
                  backgroundColor: 'red',
                }}
              />
            </TouchableWithoutFeedback>
            <TouchableWithoutFeedback
              onPress={() => setState(prev => ({ ...prev, second: true }))}>
              <View
                style={{
                  width: 76,
                  height: 76,
                  marginRight: 4,
                  backgroundColor: 'blue',
                }}
                // @ts-ignore
                tabIndex={-1}
              />
            </TouchableWithoutFeedback>
            <TouchableWithoutFeedback
              onPress={() => setState(prev => ({ ...prev, third: true }))}>
              <View
                style={{
                  width: 76,
                  height: 76,
                  marginRight: 4,
                  backgroundColor: 'red',
                }}
              />
            </TouchableWithoutFeedback>
          </View>
        )}
        assert={({ state, expect }) => {
          expect(state).to.be.deep.eq({
            first: true,
            second: false,
            third: true,
          });
        }}
      />
      <TestCase itShould="render view with fixed width and aspectRatio 1">
        <View style={{ width: '100%', height: 100 }}>
          <View
            style={{
              width: 100,
              backgroundColor: 'blue',
              aspectRatio: 1,
            }}
          />
        </View>
      </TestCase>
      <TestCase itShould="render views with set flex and aspectRatio 1">
        <View style={{ width: '100%', height: 100 }}>
          <View
            style={{
              width: 100,
              backgroundColor: 'blue',
              flex: 1,
              aspectRatio: 1,
            }}
          />
          <View
            style={{
              width: 100,
              backgroundColor: 'blue',
              flex: 2,
              aspectRatio: 1,
            }}
          />
        </View>
      </TestCase>
      <TestCase itShould="show view rotated by 180deg(backfaceVisibility: visible)">
        <View style={{ width: '100%', height: 20 }}>
          <View
            style={{
              width: 100,
              backgroundColor: 'blue',
              transform: [{ rotateY: '180deg' }],
              backfaceVisibility: 'visible',
            }}>
            <Text style={{ height: 20 }}>Backface</Text>
          </View>
        </View>
      </TestCase>
      <TestCase itShould="not show view rotated by 180deg(backfaceVisibility: hidden)">
        <View style={{ width: '100%', height: 20 }}>
          <View
            style={{
              width: 100,
              backgroundColor: 'blue',
              transform: [{ rotateY: '180deg' }],
              backfaceVisibility: 'hidden',
            }}>
            <Text style={{ height: 20 }}>Backface</Text>
          </View>
        </View>
      </TestCase>
      <TestCase itShould="render light blue shadow shifted towards bottom and right">
        <View
          style={{
            width: 64,
            height: 64,
            margin: 8,
            backgroundColor: 'green',
            shadowColor: 'blue',
            shadowOffset: { width: 16, height: 16 },
            shadowOpacity: 0.25,
            shadowRadius: 16,
          }}
        />
      </TestCase>
      <TestCase
        itShould="render a view with role"
        skip // https://gl.swmansion.com/rnoh/react-native-harmony/-/issues/603
      >
        <View role="alert">
          <Text>Alert</Text>
        </View>
      </TestCase>
      <TestCase
        skip={Platform.select({
          android: 'bug in RN',
          harmony: 'bug in RN, fails on Android',
        })}
        itShould="pass on blue rect touch (onResponderReject)"
        initialState={{
          responderRejectedCount: 0,
          responderGrantedCount: 0,
          childResponderGrantedCount: 0,
        }}
        arrange={({ setState }) => {
          return (
            <View
              onStartShouldSetResponder={() => true}
              onResponderReject={() => {
                setState(prev => ({
                  ...prev,
                  responderRejectedCount: prev.responderRejectedCount + 1,
                }));
              }}
              onResponderGrant={() => {
                setState(prev => ({
                  ...prev,
                  responderGrantedCount: prev.responderGrantedCount + 1,
                }));
              }}
              style={{
                backgroundColor: 'green',
                padding: 20,
              }}>
              <View
                style={{ backgroundColor: 'blue', width: 64, height: 64 }}
                onResponderTerminationRequest={() => false}
                onStartShouldSetResponder={() => true}
                onResponderGrant={() => {
                  setState(prev => ({
                    ...prev,
                    childResponderGrantedCount:
                      prev.childResponderGrantedCount + 1,
                  }));
                }}
              />
            </View>
          );
        }}
        assert={({ expect, state }) => {
          expect(state.responderRejectedCount).to.be.greaterThan(0);
        }}
      />
      <TestCase
        modal
        itShould='call the "escape" gesture handler'
        initialState={false}
        skip // https://gl.swmansion.com/rnoh/react-native-harmony/-/issues/602
        arrange={({ setState }) => (
          <View
            accessible={true}
            style={{ width: '100%', height: 100, backgroundColor: 'gray' }}
            onAccessibilityEscape={() => {
              console.log('onAccessibilityEscape called!');
              setState(true);
            }}>
            <View
              style={{
                width: 100,
                height: 100,
                backgroundColor: 'red',
              }}
            />
          </View>
        )}
        assert={({ expect, state }) => {
          expect(state).to.be.true;
        }}
      />
      <TestCase
        modal
        itShould='render "First Layout" view and ignore "Ignored Layout" when accessibility is true'>
        <View accessible={true} style={styles.accessibilityContainer}>
          <View
            style={[styles.accessibilityLayout, { backgroundColor: 'green' }]}
            importantForAccessibility="yes">
            <Text>First layout</Text>
          </View>
          <View
            style={[styles.accessibilityLayout, { backgroundColor: 'yellow' }]}
            importantForAccessibility="no-hide-descendants">
            <Text>Ignored Layout</Text>
          </View>
        </View>
      </TestCase>
      <TestCase
        modal
        skip // https://gl.swmansion.com/rnoh/react-native-harmony/-/issues/600
        itShould="render a view with aria-valuemax accessibility prop">
        <View
          accessible={true}
          aria-valuemax={1000}
          style={[styles.accessibilityLayout, { backgroundColor: 'green' }]}>
          <Text>aria-valuemax: 100</Text>
        </View>
      </TestCase>
      <TestCase
        modal
        skip // https://gl.swmansion.com/rnoh/react-native-harmony/-/issues/600
        itShould="render a view with aria-valuemin accessibility prop">
        <View
          accessible={true}
          aria-valuemin={10}
          style={[styles.accessibilityLayout, { backgroundColor: 'green' }]}>
          <Text>aria-valuemin: 10</Text>
        </View>
      </TestCase>
      <TestCase
        modal
        skip // https://gl.swmansion.com/rnoh/react-native-harmony/-/issues/600
        itShould="render a view with aria-valuenow accessibility prop">
        <View
          accessible={true}
          aria-valuenow={55}
          style={[styles.accessibilityLayout, { backgroundColor: 'green' }]}>
          <Text>aria-valuemin: 55</Text>
        </View>
      </TestCase>
      <TestCase
        modal
        skip // https://gl.swmansion.com/rnoh/react-native-harmony/-/issues/600
        itShould="render a view with aria-valuetext accessibility prop">
        <View
          accessible={true}
          aria-valuetext={'Test Text'}
          style={[styles.accessibilityLayout, { backgroundColor: 'green' }]}>
          <Text>aria-valuemin: Test Text</Text>
        </View>
      </TestCase>
      <TestCase
        modal
        skip // https://gl.swmansion.com/rnoh/react-native-harmony/-/issues/599
        itShould="render a view with aria-selected accessibility prop">
        <ViewAccessibilityAriaSelected />
      </TestCase>
      <TestCase
        modal
        itShould="make the screen reader say 'This view has a red background and no text' when clicking on the View component with accessibilityLabel prop">
        <View
          accessible={true}
          accessibilityLabel="This view has a red background and no text"
          style={[styles.accessibilityLayout, { backgroundColor: 'red' }]}
        />
      </TestCase>
      <TestCase
        modal
        itShould="make the screen reader say/display 'This view has a red background and no text' when clicking on the View component with aria-label prop">
        <View
          accessible={true}
          aria-label="This view has a red background and no text"
          style={[styles.accessibilityLayout, { backgroundColor: 'red' }]}
        />
      </TestCase>
      <TestCase
        modal
        itShould="make the screen reader say/display 'busy' after clicking on the backgroud">
        <View
          accessible={true}
          aria-busy={true}
          style={styles.accessibilityLayout}
        />
      </TestCase>
      <TestCase
        modal
        itShould="make the screen reader say/display: 'checked, mixed' when both button are 'checked', 'mixed' when one of the button is 'checked' and 'unchecked' when none of the button is 'checked'">
        <ViewAccessibilityAriaChecked />
      </TestCase>
      <TestCase modal itShould="make the screen reader say/display: 'disabled'">
        <View
          accessible={true}
          aria-disabled={true}
          style={styles.accessibilityLayout}
        />
      </TestCase>
      <TestCase modal itShould="make the screen reader hide 'Hidden layout'">
        <View accessible={true} style={styles.accessibilityContainer}>
          <View
            style={[styles.accessibilityLayout, { backgroundColor: 'green' }]}
            importantForAccessibility="yes">
            <Text>First layout</Text>
          </View>
          <View
            style={[styles.accessibilityLayout, { backgroundColor: 'yellow' }]}
            aria-hidden={true}>
            <Text>Hidden Layout</Text>
          </View>
        </View>
      </TestCase>
      <TestCase
        modal
        skip // works only on iOS
        itShould="make the screen reader hide 'Hidden layout' accessibilityHidden">
        <View accessible={true} style={styles.accessibilityContainer}>
          <View
            style={[styles.accessibilityLayout, { backgroundColor: 'green' }]}>
            <Text>First layout</Text>
          </View>
          <View
            style={[styles.accessibilityLayout, { backgroundColor: 'yellow' }]}
            accessibilityElementsHidden={true}>
            <Text>Hidden Layout</Text>
          </View>
        </View>
      </TestCase>
      <TestCase
        modal
        itShould="make the screen reader say/display 'This view has a red background' and 'Hint: and no text'">
        <View
          accessible={true}
          aria-label="This view has a red background"
          accessibilityHint="Hint: and no text"
          style={[styles.accessibilityLayout, { backgroundColor: 'red' }]}
        />
      </TestCase>
    </TestSuite>
  );
}

function PointerEventsView(props: {
  disableOuterContainerTouch?: boolean;
  pointerEventsOuter?: 'box-none' | 'none' | 'box-only' | 'auto';
  pointerEventsInner?: 'box-none' | 'none' | 'box-only' | 'auto';
  setState: React.Dispatch<
    React.SetStateAction<{
      inner: boolean;
      outer: boolean;
      outerContainer: boolean;
    }>
  >;
  reset: () => void;
}) {
  return (
    <View style={{ height: 100, width: '100%', flexDirection: 'row' }}>
      <View
        style={{ backgroundColor: 'green' }}
        onTouchEnd={
          props.disableOuterContainerTouch
            ? undefined
            : () => {
              props.setState(prev => ({ ...prev, outerContainer: true }));
            }
        }>
        <View
          style={{ height: 100, width: 100, backgroundColor: 'red' }}
          pointerEvents={props.pointerEventsOuter}
          onTouchEnd={() => {
            props.setState(prev => ({ ...prev, outer: true }));
          }}>
          <View
            style={{
              height: 40,
              width: 40,
              backgroundColor: 'blue',
              margin: 30,
            }}
            onTouchEnd={() => {
              props.setState(prev => ({ ...prev, inner: true }));
            }}
            pointerEvents={props.pointerEventsInner}
          />
        </View>
      </View>
      <Button label="reset" onPress={props.reset} />
    </View>
  );
}

function SelectedView({
  itemId,
  selectedId,
  setSelectedId,
}: {
  itemId: number;
  selectedId: number;
  setSelectedId: React.Dispatch<React.SetStateAction<number>>;
}) {
  return (
    <View
      aria-selected={selectedId === itemId}
      accessibilityState={{ selected: selectedId === itemId }}
      style={[styles.accessibilityLayout, { borderBottomWidth: 2 }]}>
      <Text
        style={{ width: '100%', height: '100%' }}
        onPress={() => setSelectedId(itemId)}>
        aria-selected {String(selectedId === itemId)}
      </Text>
    </View>
  );
}

function ViewAccessibilityAriaSelected() {
  const [selectedId, setSelectedId] = useState<number>(1);

  return (
    <View accessible={true} style={styles.accessibilityContainer}>
      {Array.from({ length: 5 }, (_, index) => index + 1).map(id => (
        <SelectedView
          key={id}
          itemId={id}
          selectedId={selectedId}
          setSelectedId={setSelectedId}
        />
      ))}
    </View>
  );
}

function ViewAccessibilityAriaChecked() {
  const [firstChecked, setFirstChecked] = useState<boolean>(false);
  const [secondChecked, setSecondChecked] = useState<boolean>(false);

  const checked = firstChecked && secondChecked;
  const mixed = firstChecked !== secondChecked;

  return (
    <View
      accessible={true}
      aria-checked={checked ? true : mixed ? 'mixed' : false}
      style={[styles.accessibilityLayout, { height: 200 }]}
      accessibilityRole="checkbox"
      accessibilityState={{ checked }}>
      <Button
        label={`First Element is ${firstChecked ? 'checked' : 'unchecked'}`}
        onPress={() => setFirstChecked(!firstChecked)}
      />
      <Button
        label={`Second Element is ${secondChecked ? 'checked' : 'unchecked'}`}
        onPress={() => setSecondChecked(!secondChecked)}
      />
    </View>
  );
}

const styles = StyleSheet.create({
  squaresContainer: {
    flexDirection: 'row',
    justifyContent: 'space-between',
    alignItems: 'center',
    backgroundColor: 'gray',
  },
  square: {
    width: 100,
    height: 100,
    backgroundColor: 'lightblue',
    margin: 4,
  },
  squareContent: {
    textAlignVertical: 'center',
    textAlign: 'center',
    height: '100%',
  },
  accessibilityContainer: {
    width: '100%',
    backgroundColor: 'gray',
  },
  accessibilityLayout: {
    width: '100%',
    height: 100,
    backgroundColor: 'lightblue',
  },
});