// template/src/components/Tile/index.tsx
import React from 'react';
import { View, Text, TouchableOpacity } from 'react-native';
import {
  TileProps,
  AccountTileData,
  CreditTileData,
  ServiceTileData,
  ServiceGridData,
  PromotionalTileData
} from './types';
import { createTileStyles } from './styles';
import { useTheme } from '../../theme/ThemeProvider';

const Tile: React.FC<TileProps> = ({ type, data, style }) => {
  // Get theme from context
  const { theme, isLoading } = useTheme();

  // Show loading state while theme is loading
  if (isLoading || !theme) {
    return (
      <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#000' }}>
        <Text style={{ color: 'white', fontSize: 16 }}>Loading theme...</Text>
      </View>
    );
  }

  // Create theme-aware styles
  const styles = createTileStyles(theme);

  const renderTile = () => {
    // ... rest of your existing code stays the same
    switch (type) {
      case 'account':
        return renderAccountTile(data as AccountTileData);
      case 'creditCard':
        return renderCreditTile(data as CreditTileData);
      case 'service':
        return renderServiceTile(data as ServiceTileData);
      case 'serviceGrid':
        return renderServiceGrid(data as ServiceGridData);
      case 'promotional':
        return renderPromotionalTile(data as PromotionalTileData);
      default:
        return <Text>Unknown tile type</Text>;
    }
  };

  const renderAccountTile = (tileData: AccountTileData) => {
    if (tileData.variant === 'condensed') {
      return (
        <>
          <TouchableOpacity
            style={[
              styles.tile, 
              styles.condensedAccountTile, 
              tileData.promoMessage ? styles.tileWithPromo : null,
              style
            ]}
            onPress={tileData.onPress}
            activeOpacity={0.7}
          >
            <View style={styles.condensedAccountLeft}>
              <Text style={styles.condensedAccountTitle}>{tileData.title}</Text>
              {tileData.subtitle && (
                <Text style={styles.condensedAccountSubtitle}>{tileData.subtitle}</Text>
              )}
            </View>
            
            <View style={styles.condensedAccountRight}>
              <Text style={[styles.condensedBalance, tileData.balance < 0 ? styles.negativeBalance : styles.positiveBalance]}>
                {tileData.balance < 0 ? '-' : ''}£{Math.abs(tileData.balance).toFixed(2)}
              </Text>
            </View>
          </TouchableOpacity>

          {/* Promo Message as separate element */}
          {tileData.promoMessage && (
            <TouchableOpacity
              style={styles.promoContainer}
              onPress={tileData.promoMessage.onPress}
              activeOpacity={0.7}
            >
              <Text style={styles.promoText}>{tileData.promoMessage.text}</Text>
              {tileData.promoMessage.showArrow && (
                <Text style={styles.promoArrow}>→</Text>
              )}
            </TouchableOpacity>
          )}
        </>
      );
    }

    // Detailed variant (existing layout)
    return (
      <>
        <TouchableOpacity
          style={[
            styles.tile, 
            tileData.promoMessage ? styles.tileWithPromo : null,
            style
          ]}
          onPress={tileData.onPress}
          activeOpacity={0.7}
        >
          <View style={styles.tileHeader}>
            <View style={styles.tileHeaderLeft}>
              <Text style={styles.tileTitle}>{tileData.title}</Text>
              <Text style={styles.tileSubtitle}>{tileData.subtitle}</Text>
            </View>
            {tileData.showMenu && (
              <TouchableOpacity style={styles.menuButton}>
                <Text style={styles.menuDots}>•••</Text>
              </TouchableOpacity>
            )}
          </View>

          <Text style={[styles.balance, tileData.balance < 0 ? styles.negativeBalance : styles.positiveBalance]}>
            {tileData.balance < 0 ? '-' : ''}£{Math.abs(tileData.balance).toFixed(2)}
          </Text>

          {tileData.balanceLabel && (
            <Text style={styles.balanceLabel}>{tileData.balanceLabel}</Text>
          )}

          {tileData.additionalInfo && (
            <Text style={styles.additionalInfo}>{tileData.additionalInfo}</Text>
          )}

          {/* Actions inside the main tile */}
          {tileData.actions && tileData.actions.length > 0 && (
            <View style={styles.actionsContainer}>
              {tileData.actions.map((action, index) => (
                <TouchableOpacity
                  key={index}
                  style={styles.actionButton}
                  onPress={action.onPress}
                >
                  <Text style={styles.actionButtonText}>{action.label}</Text>
                </TouchableOpacity>
              ))}
            </View>
          )}
        </TouchableOpacity>

        {/* Promo Message as separate element */}
        {tileData.promoMessage && (
          <TouchableOpacity
            style={styles.promoContainer}
            onPress={tileData.promoMessage.onPress}
            activeOpacity={0.7}
          >
            <Text style={styles.promoText}>{tileData.promoMessage.text}</Text>
            {tileData.promoMessage.showArrow && (
              <Text style={styles.promoArrow}>→</Text>
            )}
          </TouchableOpacity>
        )}
      </>
    );
  };

  const renderCreditTile = (tileData: CreditTileData) => (
    <TouchableOpacity
      style={[styles.tile, style]}
      onPress={tileData.onPress}
      activeOpacity={0.7}
    >
      <View style={styles.tileHeader}>
        <View style={styles.tileHeaderLeft}>
          <Text style={styles.tileTitle}>{tileData.title}</Text>
          <Text style={styles.tileSubtitle}>{tileData.subtitle}</Text>
        </View>
        {tileData.showMenu && (
          <TouchableOpacity style={styles.menuButton}>
            <Text style={styles.menuDots}>•••</Text>
          </TouchableOpacity>
        )}
      </View>

      <Text style={styles.balance}>£{tileData.balance.toLocaleString()}</Text>

      {tileData.balanceLabel && (
        <Text style={styles.balanceLabel}>{tileData.balanceLabel}</Text>
      )}

      {tileData.availableCredit && (
        <Text style={styles.additionalInfo}>
          Available credit: £{tileData.availableCredit.toLocaleString()}
        </Text>
      )}

      {tileData.details && tileData.details.length > 0 && (
        <View style={styles.detailsContainer}>
          {tileData.details.map((detail, index) => (
            <View key={index} style={styles.detailRow}>
              <Text style={styles.detailLabel}>{detail.label}</Text>
              <Text style={styles.detailValue}>{detail.value}</Text>
            </View>
          ))}
        </View>
      )}

      {tileData.primaryAction && (
        <TouchableOpacity
          style={styles.primaryActionButton}
          onPress={tileData.primaryAction.onPress}
        >
          <Text style={styles.primaryActionText}>{tileData.primaryAction.label}</Text>
        </TouchableOpacity>
      )}
    </TouchableOpacity>
  );

  const renderServiceTile = (tileData: ServiceTileData) => (
    <TouchableOpacity
      style={[styles.tile, styles.serviceTile, style]}
      onPress={tileData.onPress}
      activeOpacity={0.7}
    >
      <View style={styles.serviceTileContent}>
        <View style={[styles.serviceIcon, { backgroundColor: tileData.icon.color }]}>
          <Text style={styles.serviceIconText}>{tileData.icon.name}</Text>
        </View>

        <View style={styles.serviceTextContainer}>
          <View style={styles.serviceTitleRow}>
            <Text style={styles.serviceTitle}>{tileData.title}</Text>
            {tileData.badge && (
              <View style={[styles.badge, { backgroundColor: tileData.badge.color }]}>
                <Text style={styles.badgeText}>{tileData.badge.text}</Text>
              </View>
            )}
          </View>
          <Text style={styles.serviceDescription}>{tileData.description}</Text>
        </View>

        {tileData.showArrow && (
          <Text style={styles.arrow}>→</Text>
        )}
      </View>
    </TouchableOpacity>
  );

  const renderServiceGrid = (gridData: ServiceGridData) => (
    <View style={[styles.serviceGrid, style]}>
      {gridData.items.map((item) => (
        <TouchableOpacity
          key={item.id}
          style={styles.gridItem}
          onPress={item.onPress}
          activeOpacity={0.7}
        >
          <View style={[styles.gridIcon, { backgroundColor: item.icon.color }]}>
            <Text style={styles.gridIconText}>{item.icon.name}</Text>
          </View>
          <Text style={styles.gridTitle}>{item.title}</Text>
          <Text style={styles.gridDescription}>{item.description}</Text>
        </TouchableOpacity>
      ))}
    </View>
  );

  const renderPromotionalTile = (tileData: PromotionalTileData) => (
    <TouchableOpacity
      style={[styles.tile, styles.promotionalTile, style]}
      onPress={tileData.onPress}
      activeOpacity={0.7}
    >
      <View style={styles.promotionalContent}>
        <View style={styles.promotionalText}>
          <Text style={styles.promotionalTitle}>{tileData.title}</Text>
          <Text style={styles.promotionalDescription}>{tileData.description}</Text>

          <TouchableOpacity
            style={styles.promotionalAction}
            onPress={tileData.action.onPress}
          >
            <Text style={styles.promotionalActionText}>{tileData.action.label}</Text>
            <Text style={styles.promotionalArrow}>→</Text>
          </TouchableOpacity>
        </View>

        {tileData.image && (
          <View style={[styles.promotionalImage, { backgroundColor: tileData.image.color }]}>
            <Text style={styles.promotionalImageText}>{tileData.image.name}</Text>
          </View>
        )}
      </View>
    </TouchableOpacity>
  );

  return renderTile();
};

export default Tile;

// Re-export types for convenience
export * from './types';