import React, { useState, useEffect } from 'react';
import {
  View,
  Text,
  StyleSheet,
  ScrollView,
  TouchableOpacity,
  ActivityIndicator,
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { Ionicons } from '@expo/vector-icons';
import { useRouter } from 'expo-router';
import { RaceCard, BetTypeSelector } from '../src/components';
import { getBetTypes, generateTip } from '../src/services/api';
import { useAppStore } from '../src/store/appStore';
import { BetType } from '../src/types';
import { useScreenTracking } from '../src/analytics/useAnalytics';
import { analytics } from '../src/analytics';

export default function TipBuilderScreen() {
  const router = useRouter();
  const { 
    selectedRace, 
    selectedBetType, 
    setSelectedBetType, 
    setCurrentTip,
    setIsLoading,
    isLoading 
  } = useAppStore();

  useScreenTracking('tip_builder');
  
  const [simpleBets, setSimpleBets] = useState<BetType[]>([]);
  const [advancedBets, setAdvancedBets] = useState<BetType[]>([]);
  const [generating, setGenerating] = useState(false);
  const [loadingStep, setLoadingStep] = useState('');

  useEffect(() => {
    loadBetTypes();
  }, []);

  const loadBetTypes = async () => {
    try {
      const data = await getBetTypes();
      setSimpleBets(data.simple);
      setAdvancedBets(data.advanced);
    } catch (error) {
      console.error('Error loading bet types:', error);
    }
  };

  const handleGetTip = async () => {
    if (!selectedRace) {
      router.push('/race-picker');
      return;
    }

    setGenerating(true);
    setLoadingStep('Fetching race data...');

    try {
      await new Promise(resolve => setTimeout(resolve, 500));
      setLoadingStep('Analyzing runners...');
      
      await new Promise(resolve => setTimeout(resolve, 500));
      setLoadingStep('Building your tip...');
      
      const tip = await generateTip(selectedRace.id, selectedBetType);
      
      analytics.track('tip_generated', {
        race_id: selectedRace.id,
        bet_type: selectedBetType,
        confidence: tip.confidence,
      });
      
      setLoadingStep('Done!');
      await new Promise(resolve => setTimeout(resolve, 300));
      
      setCurrentTip(tip);
      router.push('/tip-result');
    } catch (error) {
      console.error('Error generating tip:', error);
      setLoadingStep('');
    } finally {
      setGenerating(false);
    }
  };

  const handleSelectRace = () => {
    analytics.track('change_race_clicked');
    router.push('/race-picker');
  };

  return (
    <SafeAreaView style={styles.container} edges={['top']}>
      {/* Header */}
      <View style={styles.header}>
        <TouchableOpacity 
          style={styles.backButton} 
          onPress={() => router.back()}
        >
          <Ionicons name="arrow-back" size={24} color="#111827" />
        </TouchableOpacity>
        <Text style={styles.headerTitle}>Get a Tip</Text>
        <View style={styles.headerSpacer} />
      </View>

      <ScrollView 
        style={styles.scrollView}
        contentContainerStyle={styles.scrollContent}
        showsVerticalScrollIndicator={false}
      >
        {/* Selected Race */}
        <View style={styles.section}>
          <Text style={styles.sectionLabel}>Race</Text>
          {selectedRace ? (
            <TouchableOpacity onPress={handleSelectRace}>
              <RaceCard race={selectedRace} showCountdown />
              <View style={styles.changeButton}>
                <Text style={styles.changeButtonText}>Change race</Text>
              </View>
            </TouchableOpacity>
          ) : (
            <TouchableOpacity style={styles.selectRaceCard} onPress={handleSelectRace}>
              <Ionicons name="flag-outline" size={32} color="#9ca3af" />
              <Text style={styles.selectRaceText}>Select a race</Text>
              <Ionicons name="chevron-forward" size={20} color="#9ca3af" />
            </TouchableOpacity>
          )}
        </View>

        {/* Bet Type */}
        <View style={styles.section}>
          <BetTypeSelector
            selectedType={selectedBetType}
            onSelect={(betType) => {
              analytics.track('bet_type_changed', { bet_type: betType });
              setSelectedBetType(betType);
            }}
            simpleBets={simpleBets}
            advancedBets={advancedBets}
          />
        </View>

        {/* Info Card */}
        <View style={styles.infoCard}>
          <Ionicons name="information-circle-outline" size={20} color="#6b7280" />
          <Text style={styles.infoText}>
            Tips are model estimates based on form, conditions, and other factors. 
            They are not guarantees. Please gamble responsibly.
          </Text>
        </View>
      </ScrollView>

      {/* Action Button */}
      <View style={styles.footer}>
        <TouchableOpacity
          style={[
            styles.actionButton,
            !selectedRace && styles.actionButtonDisabled,
          ]}
          onPress={handleGetTip}
          disabled={generating || !selectedRace}
        >
          {generating ? (
            <View style={styles.loadingContent}>
              <ActivityIndicator color="#fff" size="small" />
              <Text style={styles.actionButtonText}>{loadingStep}</Text>
            </View>
          ) : (
            <>
              <Ionicons name="flash" size={22} color="#fff" />
              <Text style={styles.actionButtonText}>Get Tip</Text>
            </>
          )}
        </TouchableOpacity>
      </View>
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#f9fafb',
  },
  header: {
    flexDirection: 'row',
    alignItems: 'center',
    justifyContent: 'space-between',
    paddingHorizontal: 16,
    paddingVertical: 12,
    borderBottomWidth: 1,
    borderBottomColor: '#e5e7eb',
    backgroundColor: '#fff',
  },
  backButton: {
    width: 40,
    height: 40,
    alignItems: 'center',
    justifyContent: 'center',
  },
  headerTitle: {
    fontSize: 18,
    fontWeight: '700',
    color: '#111827',
  },
  headerSpacer: {
    width: 40,
  },
  scrollView: {
    flex: 1,
  },
  scrollContent: {
    padding: 20,
  },
  section: {
    marginBottom: 24,
  },
  sectionLabel: {
    fontSize: 14,
    fontWeight: '600',
    color: '#374151',
    marginBottom: 12,
  },
  selectRaceCard: {
    backgroundColor: '#fff',
    borderRadius: 16,
    padding: 24,
    flexDirection: 'row',
    alignItems: 'center',
    gap: 16,
    borderWidth: 2,
    borderColor: '#e5e7eb',
    borderStyle: 'dashed',
  },
  selectRaceText: {
    flex: 1,
    fontSize: 16,
    color: '#6b7280',
    fontWeight: '500',
  },
  changeButton: {
    alignItems: 'center',
    marginTop: -4,
  },
  changeButtonText: {
    fontSize: 14,
    color: '#3b82f6',
    fontWeight: '600',
  },
  infoCard: {
    flexDirection: 'row',
    backgroundColor: '#f3f4f6',
    borderRadius: 12,
    padding: 14,
    gap: 12,
    alignItems: 'flex-start',
  },
  infoText: {
    flex: 1,
    fontSize: 13,
    color: '#6b7280',
    lineHeight: 20,
  },
  footer: {
    padding: 20,
    backgroundColor: '#fff',
    borderTopWidth: 1,
    borderTopColor: '#e5e7eb',
  },
  actionButton: {
    backgroundColor: '#111827',
    borderRadius: 14,
    paddingVertical: 18,
    flexDirection: 'row',
    alignItems: 'center',
    justifyContent: 'center',
    gap: 10,
  },
  actionButtonDisabled: {
    backgroundColor: '#9ca3af',
  },
  actionButtonText: {
    fontSize: 17,
    fontWeight: '700',
    color: '#fff',
  },
  loadingContent: {
    flexDirection: 'row',
    alignItems: 'center',
    gap: 12,
  },
});
