import React, { useState, useEffect, useMemo } from 'react';
import { ChevronDown, BarChart2, Shield, Trophy, Users, ArrowRight, RefreshCw } from
'lucide-react';
// --- Pre-loaded Squad Data with Positions ---
const preloadedSquadsWithPositions = {
"Arsenal": {
"GK": ["David Raya", "Kepa Arrizabalaga", "Karl Hein"],
"DF": ["William Saliba", "Ben White", "Gabriel Magalhães", "Jurriën Timber", "Jakub Kiwior",
"Oleksandr Zinchenko", "Riccardo Calafiori", "Myles Lewis-Skelly"],
"MF": ["Martin Ødegaard", "Christian Nørgaard", "Fábio Vieira", "Mikel Merino", "Albert Sambi
Lokonga", "Martín Zubimendi", "Declan Rice"],
"FW": ["Bukayo Saka", "Gabriel Jesus", "Gabriel Martinelli", "Leandro Trossard", "Ethan
Nwaneri", "Reiss Nelson", "Kai Havertz", "Noni Madueke", "Viktor Gyokeres"]
},
"Aston Villa": {
"GK": ["Joe Gauci", "Emiliano Martínez", "Filip Marschall", "Marco Bizot"],
"DF": ["Matty Cash", "Ezri Konsa", "Tyrone Mings", "Lucas Digne", "Pau Torres", "Álex
Moreno", "Andrés García", "lan Maatsen", "Lamare Bogarde", "Yasin Özcan"],
"MF": ["Ross Barkley", "John McGinn", "Youri Tielemans", "Emiliano Buendía", "Enzo
Barrenechea", "Amadou Onana", "Morgan Rogers", "Leander Dendoncker", "Jacob Ramsey",
"Boubacar Kamara"],
"FW": ["Ollie Watkins", "Donyell Malen", "Leon Bailey", "Lewis Dobbin", "Samuel Iling-Junior"]
},
"Bournemouth": {
"GK": ["Neto", "Will Dennis", "Callan McKenna", "Alex Paulsen"],
"DF": ["Adrien Truffert", "Marcos Senesi", "Chris Mepham", "Adam Smith", "Julio Soler",
"Julián Araujo", "James Hill", "Illya Zabarnyi", "Owen Bevan", "Matai Akinmboni"],
"MF": ["Lewis Cook", "David Brooks", "Alex Scott", "Ryan Christie", "Dango Ouattara", "Tyler
Adams", "Marcus Tavernier", "Luis Sinisterra", "Philip Billing", "Ben Winterburn", "Dominic Sadi",
"Romain Faivre", "Hamed Traorè"],
"FW": ["Evanilson", "Justin Kluivert", "Antoine Semenyo", "Enes Ünal", "Zain
Silcott-Duberry", "Daniel Adu-Adjei", "Remy Rees-Dottin", "Eli Junior Kroupi"]
},
"Brentford": {
"GK": ["Hákon Valdimarsson", "Matthew Cox", "Ellery Balcombe", "Julian Eyestone",
"Caoimhín Kelleher"],
"DF": ["Aaron Hickey", "Rico Henry", "Sepp van den Berg", "Ethan Pinnock", "Kristoffer Ajer",
"Jayden Meghoma", "Nathan Collins", "Mads Roerslev", "Michael Kayode", "Kim Ji-soo",
"Benjamin Arthur"],
"MF": ["Jordan Henderson", "Mathias Jensen", "Josh Dasilva", "Fábio Carvalho", "Frank
Onyeka", "Antoni Milambo", "Yehor Yarmolyuk", "Keane Lewis-Potter", "Mikkel Damsgaard",
"Myles Peart-Harris", "Yunus Emre Konak", "Vitaly Janelt", "Ryan Trevitt", "Paris Maghoma"],
"FW": ["Kevin Schade", "Igor Thiago", "Yoane Wissa", "Bryan Mbeumo", "Gustavo Nunes",
"Romelle Donovan"]
},
"Brighton & Hove Albion": {
"GK": ["Bart Verbruggen", "Jason Steele", "Tom McGill", "Carl Rushworth", "Kjell Scherpen"],
"DF": ["Tariq Lamptey", "Igor Julio", "Adam Webster", "Lewis Dunk", "Eiran Cashin", "Ferdi
Kadıoğlu", "Jan Paul van Hecke", "Pervis Estupiñán", "Joël Veltman", "Olivier Boscagli", "Diego
Coppola", "Maxim De Cuyper"],
"MF": ["James Milner", "Solly March", "Brajan Gruda", "Carlos Baleba", "Kaoru Mitoma",
"Diego Gómez", "Yasin Ayari", "Mats Wieffer", "Abdallah Sima", "Matt O'Riley", "Andrew Moran",
"Malick Yalcouyé", "Jack Hinshelwood", "Facundo Buonanotte", "Yoon Do-young", "Jeremy
Sarmiento", "Tom Watson"],
"FW": ["Julio Enciso", "Georginio Rutter", "Yankuba Minteh", "Danny Welbeck", "Evan
Ferguson", "Charalampos Kostoulas", "Stefanos Tzimas"]
},
"Burnley": {
"GK": ["James Trafford", "Etienne Green", "Václav Hladký", "Max Weiß"],
"DF": ["Oliver Sonne", "Shurandy Sambo", "Joe Worrall", "Maxime Estève", "Bashir
Humphreys", "Connor Roberts", "Hjalmar Ekdal", "Lucas Pires", "Jordan Beyer", "Owen
Dodgson", "Hannes Delcroix", "Axel Tuanzebe", "Quilindschy Hartman", "Kyle Walker"],
"MF": ["Aaron Ramsey", "Josh Cullen", "Hannibal Mejbri", "Josh Laurent", "Mike Trésor"],
"FW": ["Manuel Benson", "Jaidon Anthony", "Lyle Foster", "Zian Flemming", "Marcus
Edwards", "Zeki Amdouni", "Darko Churlinov", "Luca Koleosho", "Jaydon Banel", "Ashley
Barnes", "Michael Obafemi", "Enock Agyei", "Jacob Bruun Larsen", "Loum Tchaouna"]
},
"Chelsea": {
"GK": ["Filip Jörgensen", "Mike Penders"],
"DF": ["Marc Cucurella", "Tosin Adarabioyo", "Benoît Badiashile", "Levi Colwill", "Mamadou
Sarr", "Trevoh Chalobah", "Reece James", "Malo Gusto", "Wesley Fofana", "Aarón Anselmino",
"Josh Acheampong"],
"MF": ["Enzo Fernández", "Cole Palmer", "Dário Essugo", "Andrey Santos", "Kiernan
Dewsbury-Hall", "Moisés Caicedo", "Omari Kellyman", "Roméo Lavia", "Kendry Páez"],
"FW": ["Pedro Neto", "Liam Delap", "Bulumko Mabusela", "Nicolas Jackson", "Christopher
Nkunku", "João Pedro", "Tyrique George", "Marc Guiu", "Estêvão", "Jamie Gittens"]
},
"Crystal Palace": {
"GK": ["Dean Henderson", "Remi Matthews", "Walter Benítez"],
"DF": ["Tyrick Mitchell", "Rob Holding", "Maxence Lacroix", "Marc Guéhi", "Daniel Muñoz",
"Nathaniel Clyne", "Borna Sosa", "Chris Richards", "Chadi Riad", "Caleb Kporha"],
"MF": ["Jefferson Lerma", "Eberechi Eze", "Matheus França", "Daichi Kamada", "Will
Hughes", "Adam Wharton", "Cheick Doucouré", "Naouirou Ahamada", "David Ozoh", "Justin
Devenny"],
"FW": ["Ismaïla Sarr", "Eddie Nketiah", "Jean-Philippe Mateta", "Romain Esse", "Odsonne
Édouard", "Malcolm Ebiowei", "Jesurun Rak-Sakyi"]
},
"Everton": {
"GK": ["Jordan Pickford", "Harry Tyrer", "Mark Travers"],
"DF": ["Nathan Patterson", "Michael Keane", "James Tarkowski", "Jake O'Brien", "Vitalii
Mykolenko", "Séamus Coleman", "Jarrad Branthwaite"],
"MF": ["Charly Alcaraz", "Idrissa Gana Gueye", "James Garner", "Tim Iroegbunam",
"Harrison Armstrong"],
"FW": ["Dwight McNeil", "Iliman Ndiaye", "Beto", "Youssef Chermiti", "Thierno Barry"]
},
"Fulham": {
"GK": ["Bernd Leno", "Steven Benda"],
"DF": ["Kenny Tete", "Calvin Bassey", "Joachim Andersen", "Jorge Cuenca", "Timothy
Castagne", "Issa Diop", "Antonee Robinson"],
"MF": ["Harrison Reed", "Harry Wilson", "Tom Cairney", "Sander Berge", "Alex Iwobi",
"Andreas Pereira", "Saša Lukić", "Josh King", "Ryan Sessegnon", "Emile Smith Rowe", "Luke
Harris"],
"FW": ["Raúl Jiménez", "Rodrigo Muniz", "Adama Traoré"]
},
"Leeds United": {
"GK": ["Illan Meslier", "Alex Cairns", "Karl Darlow"],
"DF": ["Jayden Bogle", "Pascal Struijk", "Joe Rodon", "Sam Byram", "Isaac Schmidt", "Jaka
Bijol", "Sebastiaan Bornauw", "Gabriel Gudmundsson"],
"MF": ["Ethan Ampadu", "Daniel James", "Brenden Aaronson", "Ao Tanaka", "Ilia Gruev",
"Jack Harrison"],
"FW": ["Patrick Bamford", "Joël Piroe", "Largie Ramazani", "Mateo Joseph", "Wilfried
Gnonto", "Joe Gelhardt", "Sam Greenwood", "Lukas Nmecha"]
},
"Liverpool": {
"GK": ["Alisson Becker", "Freddie Woodman", "Giorgi Mamardashvili", "Ármin Pécsi"],
"DF": ["Joe Gomez", "Virgil van Dijk", "Ibrahima Konaté", "Kostas Tsimikas", "Calvin
Ramsay", "Andy Robertson", "Jeremie Frimpong", "Rhys Williams", "Milos Kerkez", "Conor
Bradley"],
"MF": ["Wataru Endo", "Dominik Szoboszlai", "Alexis Mac Allister", "Curtis Jones", "Harvey
Elliott", "Ryan Gravenberch", "Stefan Bajcetic", "Tyler Morton"],
"FW": ["Luis Díaz", "Darwin Núñez", "Mohamed Salah", "Federico Chiesa", "Cody Gakpo",
"Florian Wirtz", "Ben Doak"]
},
"Manchester City": {
"GK": ["Marcus Bettinelli", "Stefan Ortega", "Ederson"],
"DF": ["Rúben Dias", "John Stones", "Nathan Aké", "Rayan Aït-Nouri", "Vitor Reis", "Joško
Gvardiol", "Manuel Akanji", "Abdukodir Khusanov", "Issa Kaboré", "Rico Lewis", "Josh
Wilson-Esbrand"],
"MF": ["Tijjani Reijnders", "Mateo Kovačić", "Jack Grealish", "Jérémy Doku", "Nico
González", "Rodri", "İlkay Gündoğan", "Bernardo Silva", "Matheus Nunes", "Rayan Cherki",
"Claudio Echeverri", "Máximo Perrone", "Phil Foden", "Oscar Bobb", "Nico O'Reilly", "James
McAtee", "Kalvin Phillips"],
"FW": ["Omar Marmoush", "Erling Haaland", "Savinho"]
},
"Manchester United": {
"GK": ["Altay Bayındır", "Tom Heaton", "André Onana"],
"DF": ["Diogo Dalot", "Noussair Mazraoui", "Matthijs de Ligt", "Harry Maguire", "Lisandro
Martínez", "Tyrell Malacia", "Patrick Dorgu", "Leny Yoro", "Luke Shaw", "Ayden Heaven", "Tyler
Fredricson", "Harry Amass", "Diego León"],
"MF": ["Mason Mount", "Bruno Fernandes", "Amad Diallo", "Casemiro", "Manuel Ugarte",
"Kobbie Mainoo", "Toby Collyer", "Dan Gore"],
"FW": ["Rasmus Højlund", "Matheus Cunha", "Joshua Zirkzee", "Alejandro Garnacho",
"Antony", "Chido Obi", "Ethan Wheatley", "Marcus Rashford", "Jadon Sancho"]
},
"Newcastle United": {
"GK": ["Martin Dúbravka", "Odysseas Vlachodimos", "Nick Pope", "John Ruddy", "Mark
Gillespie"],
"DF": ["Kieran Trippier", "Sven Botman", "Fabian Schär", "Jamaal Lascelles", "Matt Targett",
"Emil Krafth", "Lewis Hall", "Tino Livramento", "Harrison Ashby", "Dan Burn", "Alex Murphy"],
"MF": ["Joelinton", "Sandro Tonali", "Jacob Murphy", "Joe Willock", "Sean Longstaff", "Bruno
Guimarães", "Joe White", "Lewis Miley", "Antonio Cordero"],
"FW": ["Anthony Gordon", "Harvey Barnes", "Alexander Isak", "William Osula", "Anthony
Elanga"]
},
"Nottingham Forest": {
"GK": ["Matt Turner", "Matz Sels", "Carlos Miguel"],
"DF": ["Neco Williams", "Morato", "Murillo", "Eric da Silva Moreira", "Omar Richards", "Willy
Boly", "Nikola Milenković", "Ola Aina", "David Carmo", "Jonathan Panzo", "Zach Abbott", "Jair
Cunha"],
"MF": ["Ibrahim Sangaré", "Elliot Anderson", "Morgan Gibbs-White", "Nicolás Domínguez",
"Ryan Yates", "Danilo", "Lewis O'Brien", "Marko Stamenić"],
"FW": ["Callum Hudson-Odoi", "Taiwo Awoniyi", "Chris Wood", "Jota Silva", "Emmanuel
Dennis", "Josh Bowler", "Igor Jesus"]
},
"Sunderland": {
"GK": ["Anthony Patterson", "Blondy Nna Noukeu", "Simon Moore", "Mike Penders"],
"DF": ["Niall Huggins", "Dennis Cirkin", "Daniel Ballard", "Timothée Pembélé", "Luke
O'Brien", "Jenson Seelt", "Nectarios Triantis", "Trai Hume", "Leo Hjelde", "Zak Johnson", "Aji
Alese", "Joe Anderson", "Reinildo Mandava"],
"MF": ["Dan Neil", "Alan Browne", "Chris Rigg", "Abdoullah Ba", "Habib Diarra", "Jay
Matete", "Enzo Le Fée", "Milan Aleksić", "lan Poveda", "Pierre Ekwah", "Harrison Jones",
"Chemsdine Talbi", "Noah Sadiki"],
"FW": ["Luís Semedo", "Patrick Roberts", "Eliezer Mayenda", "Romaine Mundle", "Nazariy
Rusyn", "Wilson Isidor", "Ahmed Abdullahi", "Simon Adingra"]
},
"Tottenham Hotspur": {
"GK": ["Guglielmo Vicario", "Antonín Kinský", "Brandon Austin"],
"DF": ["Kevin Danso", "Radu Drăguşin", "Destiny Udogie", "Cristian Romero", "Pedro Porro",
"Djed Spence", "Ben Davies", "Ashley Phillips", "Micky van de Ven", "Kōta Takai", "Luka
Vušković"],
"MF": ["Yves Bissouma", "James Maddison", "Archie Gray", "Lucas Bergvall", "Pape Matar
Sarr", "Rodrigo Bentancur", "Alfie Devine"],
"FW": ["Son Heung-min", "Richarlison", "Mathys Tel", "Yang Min-hyeok", "Dominic Solanke",
"Mohammed Kudus", "Dejan Kulusevski", "Brennan Johnson", "Manor Solomon", "Wilson
Odobert", "Dane Scarlett", "Bryan Gil"]
},
"West Ham United": {
"GK": ["Wes Foderingham", "Alphonse Areola", "Krisztián Hegyi"],
"DF": ["Maximilian Kilman", "El Hadji Malick Diouf", "Konstantinos Mavropanos", "Jean-Clair
Todibo", "Nayef Aguerd", "Aaron Wan-Bissaka", "Oliver Scarles", "Emerson Palmieri", "Kaelan
Casey"],
"MF": ["James Ward-Prowse", "Lucas Paquetá", "Edson Álvarez", "Guido Rodríguez",
"Tomáš Souček", "Freddie Potts", "Andy Irving", "George Earthy", "Lewis Orford"],
"FW": ["Crysencio Summerville", "Niclas Füllkrug", "Luis Guilherme", "Jarrod Bowen",
"Maxwel Cornet", "Callum Marshall"]
},
"Wolverhampton Wanderers": {
"GK": ["José Sá", "Dan Bentley", "Sam Johnstone", "Tom King"],
"DF": ["Matt Doherty", "Santiago Bueno", "Emmanuel Agbadou", "Yerson Mosquera", "Hugo
Bueno", "Toti Gomes", "Bastien Meupiyou", "Ki-Jana Hoever", "Pedro Lima", "Alfie Pond"],
"MF": ["Marshall Munetsi", "Boubacar Traoré", "André", "João Gomes", "Jean-Ricner
Bellegarde", "Fer López", "Joe Hodge"],
"FW": ["Jørgen Strand Larsen", "Hwang Hee-chan", "Saša Kalajdžić", "Rodrigo Gomes",
"Gonçalo Guedes", "Enso González", "Nathan Fraser", "Tawanda Chirewa", "Fábio Silva"]
},
"Barcelona": {
"GK": ["Marc-André ter Stegen", "Iñaki Peña", "Wojciech Szczęsny", "Joan García"],
"DF": ["Pau Cubarsí", "Alejandro Balde", "Ronald Araújo", "Iñigo Martínez", "Andreas
Christensen", "Jules Koundé", "Eric García"],
"MF": ["Gavi", "Pedri", "Fermín López", "Marc Casadó", "Dani Olmo", "Frenkie de Jong",
"Oriol Romeu"],
"FW": ["Ferran Torres", "Robert Lewandowski", "Lamine Yamal", "Raphinha", "Pau Víctor",
"Roony Bardghji"]
},
"Inter Milan": {
"GK": ["Yann Sommer", "Raffaele Di Gennaro", "Josep Martínez", "Robert Sánchez"],
"DF": ["Denzel Dumfries", "Stefan de Vrij", "Francesco Acerbi", "Benjamin Pavard", "Carlos
Augusto", "Yann Aurel Bisseck", "Federico Dimarco", "Matteo Darmian", "Tomás Palacios",
"Alessandro Bastoni"],
"MF": ["Piotr Zieliński", "Petar Sučić", "Davide Frattesi", "Hakan Çalhanoğlu", "Kristjan
Asllani", "Henrikh Mkhitaryan", "Nicolò Barella", "Nicola Zalewski"],
"FW": ["Marcus Thuram", "Lautaro Martínez", "Luis Henrique", "Sebastiano Esposito",
"Francesco Pio Esposito", "Mehdi Taremi", "Ange-Yoan Bonny"]
},
"Atlético Madrid": {
"GK": ["Juan Musso", "Jan Oblak"],
"DF": ["José María Giménez", "Clément Lenglet", "Nahuel Molina", "Javi Galán", "Robin Le
Normand", "Matteo Ruggeri"],
"MF": ["Conor Gallagher", "Rodrigo De Paul", "Koke", "Pablo Barrios", "Thomas Lemar",
"Samuel Lino", "Marcos Llorente", "Álex Baena"],
"FW": ["Antoine Griezmann", "Alexander Sørloth", "Carlos Martín", "Julián Alvarez",
"Giuliano Simeone"]
},
"Bayer Leverkusen": {
"GK": ["Lukáš Hradecký", "Matěj Kovář", "Mark Flekken", "Niklas Lomb"],
"DF": ["Piero Hincapié", "Jarell Quansah", "Edmond Tapsoba", "Arthur", "Álex Grimaldo",
"Jeanuël Belocian", "Axel Tape", "Abdoulaye Faye"],
"MF": ["Jonas Hofmann", "Robert Andrich", "Amine Adli", "Aleix García", "Exequiel Palacios",
"Ibrahim Maza", "Granit Xhaka", "Malik Tillman"],
"FW": ["Martin Terrier", "Patrik Schick", "Alejo Sarco", "Victor Boniface", "Nathan Tella",
"Christian Kofane"]
},
"Lille": {
"GK": ["Arnaud Bodart", "Marc-Aurèle Caillard", "Lucas Chevalier"],
"DF": ["Aïssa Mandi", "Alexsandro", "Thomas Meunier", "Bafodé Diakité", "Tiago Santos",
"Ousmane Touré", "Rafael Fernandes"],
"MF": ["Nabil Bentaleb", "Hákon Arnar Haraldsson", "Ngal'ayel Mukau", "Benjamin André",
"Edon Zhegrova", "André Gomes", "Ethan Mbappé", "Ayyoub Bouaddi"],
"FW": ["Olivier Giroud", "Osame Sahraoui", "Marius Broholm", "Matias Fernandez-Pardo",
"Mohamed Bayo", "Tiago Morais"]
},
"Atalanta": {
"GK": ["Marco Carnesecchi", "Francesco Rossi"],
"DF": ["Raoul Bellanova", "Berat Djimsiti", "Isak Hien", "Sead Kolašinac", "Odilon
Kossounou", "Marco Palestra", "Giorgio Scalvini", "Davide Zappacosta", "Honest Ahanor"],
"MF": ["Marco Brescianini", "Charles De Ketelaere", "Marten de Roon", "Éderson", "Mario
Pašalić", "Lazar Samardžić", "Ibrahim Sulemana", "Kamaldeen Sulemana"],
"FW": ["Ademola Lookman", "Daniel Maldini", "Mateo Retegui", "Gianluca Scamacca"]
},
"Borussia Dortmund": {
"GK": ["Gregor Kobel", "Silas Ostrzinski", "Alexander Meyer", "Patrick Drewes", "Diant
Ramaj"],
"DF": ["Yan Couto", "Waldemar Anton", "Nico Schlotterbeck", "Ramy Bensebaini", "Daniel
Svensson", "Niklas Süle", "Julian Ryerson", "Filippo Mane"],
"MF": ["Salih Özcan", "Giovanni Reyna", "Felix Nmecha", "Julian Brandt", "Pascal Groß",
"Marcel Sabitzer", "Emre Can", "Jobe Bellingham"],
"FW": ["Serhou Guirassy", "Maximilian Beier", "Julien Duranville", "Karim Adeyemi", "Cole
Campbell", "Sébastien Haller"]
},
"Real Madrid": {
"GK": ["Thibaut Courtois", "Andriy Lunin"],
"DF": ["Dani Carvajal", "Éder Militão", "David Alaba", "Trent Alexander-Arnold", "Álvaro
Carreras", "Fran García", "Antonio Rüdiger", "Ferland Mendy", "Dean Huijsen", "Raúl Asencio"],
"MF": ["Jude Bellingham", "Eduardo Camavinga", "Federico Valverde", "Aurélien
Tchouaméni", "Arda Güler", "Dani Ceballos"],
"FW": ["Vinícius Júnior", "Kylian Mbappé", "Rodrygo", "Endrick", "Brahim Díaz"]
},
"Bayern Munich": {
"GK": ["Manuel Neuer", "Daniel Peretz", "Jonas Urbig"],
"DF": ["Dayot Upamecano", "Kim Min-jae", "Jonathan Tah", "Hiroki Itō", "Raphaël Guerreiro",
"Sacha Boey", "Tarek Buchmann", "Josip Stanišić", "Adam Aznou"],
"MF": ["Joshua Kimmich", "Leon Goretzka", "Jamal Musiala", "Paul Wanner", "João
Palhinha", "Michael Olise", "Tom Bischof", "Konrad Laimer", "Lovro Zvonarek", "Aleksandar
Pavlović", "Lennart Karl"],
"FW": ["Serge Gnabry", "Harry Kane", "Kingsley Coman", "Jonah Kusi-Asare", "Bryan
Zaragoza"]
},
"AC Milan": {
"GK": ["Mike Maignan", "Marco Sportiello", "Lapo Nava", "Lorenzo Torriani"],
"DF": ["Álex Jiménez", "Emerson Royal", "Fikayo Tomori", "Malick Thiaw", "Strahinja
Pavlović", "Davide Bartesaghi", "Filippo Terracciano", "Matteo Gabbia"],
"MF": ["Samuele Ricci", "Ruben Loftus-Cheek", "Luka Modrić", "Youssouf Fofana", "Warren
Bondo", "Alexis Saelemaekers", "Yunus Musah"],
"FW": ["Santiago Giménez", "Rafael Leão", "Christian Pulisic", "Samuel Chukwueze", "Mattia
Liberali"]
},
"PSV Eindhoven": {
"GK": ["Nick Olij", "Joël Drommel", "Niek Schiks"],
"DF": ["Yarek Gąsiorowski", "Armando Obispo", "Ryan Flamingo", "Sergiño Dest", "Mauro
Júnior", "Adamo Nagalo"],
"MF": ["Guus Til", "Jerdy Schouten", "Joey Veerman", "Isaac Babadi", "Tygo Land", "Ismael
Saibari"],
"FW": ["Ivan Perišić", "Ruben van Bommel", "Noa Lang", "Johan Bakayoko", "Ricardo Pepi",
"Esmir Bajraktarević", "Couhaib Driouech"]
},
"Paris Saint-Germain": {
"GK": ["Gianluigi Donnarumma", "Matvey Safonov", "Lucas Lavallée", "Arnau Tenas"],
"DF": ["Achraf Hakimi", "Presnel Kimpembe", "Lucas Beraldo", "Marquinhos", "Lucas
Hernandez", "Nuno Mendes", "Noham Kamara", "Willian Pacho"],
"MF": ["Fabián Ruiz", "Vitinha", "Lee Kang-in", "Gabriel Moscardo", "Senny Mayulu",
"Warren Zaïre-Emery", "João Neves"],
"FW": ["Khvicha Kvaratskhelia", "Gonçalo Ramos", "Ousmane Dembélé", "Désiré Doué",
"Bradley Barcola", "Ibrahim Mbaye"]
},
"Benfica": {
"GK": ["Anatoliy Trubin", "Samuel Soares"],
"DF": ["António Silva", "Alexander Bah", "Samuel Dahl", "Nicolás Otamendi", "Tomás
Araújo", "Leandro Santos", "Rafa Obrador", "Amar Dedić"],
"MF": ["Fredrik Aursnes", "Manu Silva", "Leandro Barreiro", "Nuno Félix", "Florentino", "João
Rego", "Diogo Prioste"],
"FW": ["Vangelis Pavlidis", "Kerem Aktürkoğlu", "Andreas Schjelderup", "Gianluca
Prestianni", "Bruma", "Tiago Gouveia"]
},
"AS Monaco": {
"GK": ["Radosław Majecki", "Philipp Köhn", "Yann Liénard"],
"DF": ["Vanderson", "Eric Dier", "Jordan Teze", "Thilo Kehrer", "Caio Henrique", "Christian
Mawissa", "Wilfried Singo", "Kassoum Ouattara", "Mohammed Salisu", "Soungoutou Magassa"],
"MF": ["Denis Zakaria", "Eliesse Ben Seghir", "Paul Pogba", "Aleksandr Golovin", "Maghnes
Akliouche", "Lamine Camara", "Takumi Minamino", "Krépin Diatta", "Mamadou Coulibaly", "Edan
Diop"],
"FW": ["Folarin Balogun", "Mika Biereth", "George llenikhena", "Ansu Fati", "Breel Embolo"]
},
"Brest": {
"GK": ["Grégoire Coudert"],
"DF": ["Bradley Locko", "Junior Diaz", "Brendan Chardonnet", "Kenny Lala", "Luck Zogbé",
"Justin Bourgault", "Julien Le Cardinal"],
"MF": ["Hugo Magnetti", "Kamory Doumbia", "Pierre Lees-Melou", "Hamidou Makalou",
"Mahdi Camara", "Hianga'a Mbock"],
"FW": ["Romain Del Castillo", "Mama Baldé", "Ludovic Ajorque", "Axel Camblan"]
},
"Feyenoord": {
"GK": ["Justin Bijlow", "Plamen Andreev", "Timon Wellenreuther", "Liam Bossin"],
"DF": ["Bart Nieuwkoop", "Thomas Beelen", "Gijs Smal", "Gernot Trauner", "Jeyland
Mitchell", "Givairo Read", "Jordan Lotomba", "Dávid Hancko", "Jan Plug", "Neraysho
Kasanwirjo", "Antef Tsoungui"],
"MF": ["Hwang In-beom", "Ramiz Zerrouki", "Jakub Moder", "Quinten Timber", "Sem Steijn",
"Oussama Targhalline", "Ezequiel Bullaude", "Chris-Kévin Nadje", "Luciano Valente", "Thijs
Kraaijeveld"],
"FW": ["Ayase Ueda", "Calvin Stengs", "Igor Paixão", "Julián Carranza", "Anis Hadj Moussa",
"Shiloh 't Zand", "Gaoussou Diarra", "Stephano Carrillo", "Jaden Slory", "Aymen Sliti", "Jivayno
Zinhagel", "Leo Sauer"]
},
"Juventus": {
"GK": ["Mattia Perin", "Carlo Pinsoglio", "Michele Di Gregorio"],
"DF": ["Alberto Costa", "Bremer", "Federico Gatti", "Lloyd Kelly", "Pierre Kalulu", "Daniele
Rugani", "Andrea Cambiaso", "Nicolò Savona", "Juan Cabal", "Jonas Rouhi"],
"MF": ["Manuel Locatelli", "Teun Koopmeiners", "Weston McKennie", "Vasilije Adžić", "Filip
Kostić", "Khéphren Thuram", "Douglas Luiz"],
"FW": ["Francisco Conceição", "Dušan Vlahović", "Kenan Yıldız", "Nico González",
"Arkadiusz Milik", "Timothy Weah", "Samuel Mbangula", "Jonathan David"]
},
"Celtic": {
"GK": ["Kasper Schmeichel", "Viljami Sinisalo", "Ross Doohan"],
"DF": ["Alistair Johnston", "Liam Scales", "Auston Trusty", "Cameron Carter-Vickers",
"Hayato Inamura", "Anthony Ralston", "Stephen Welsh", "Kieran Tierney"],
"MF": ["Kwon Hyeok-kyu", "Arne Engels", "Paulo Bernardo", "Reo Hatate", "Callum
McGregor", "James Forrest"],
"FW": ["Jota", "Benjamin Nygren", "Adam Idah", "Yang Hyun-jun", "Luke McCowan", "Callum
Osmand", "Marco Tilio", "Johnny Kenny", "Daizen Maeda", "Luis Palma"]
},
"Sporting CP": {
"GK": ["Franco Israel", "Rui Silva", "Diego Callai"],
"DF": ["Matheus Reis", "Jerry St. Juste", "Zeno Debast", "Iván Fresneda", "Gonçalo Inácio",
"Ousmane Diomande", "Ricardo Esgaio", "Eduardo Quaresma"],
"MF": ["Hidemasa Morita", "Pedro Gonçalves", "Daniel Bragança", "Morten Hjulmand", "João
Simões", "Eduardo Felicissimo", "Giorgi Kochorashvili"],
"FW": ["Nuno Santos", "Francisco Trincão", "Conrad Harder", "Maximiliano Araújo", "Geny
Catamo", "Biel Teixeira", "Geovany Quenda", "Afonso Moreira", "Alisson Santos"]
},
"Club Brugge": {
"GK": ["Dani van den Heuvel", "Simon Mignolet", "Nordin Jackers"],
"DF": ["Zaid Romero", "Joel Ordóñez", "Bjorn Meijer", "Vince Osuji", "Hugo Siquet",
"Brandon Mechele", "Jorne Spileers", "Kyriani Sabbe", "Joaquin Seys", "Bi Abdoul Kader
Yameogo"],
"MF": ["Hugo Vetlesen", "Raphael Onyedika", "Hans Vanaken", "Ardon Jashari", "Alejandro
Granados", "Ludovit Reis"],
"FW": ["Christos Tzolis", "Romeo Vermant", "Gustaf Nilsson", "Michał Skóraś", "Nicolò
Tresoldi"]
},
"Dinamo Zagreb": {
"GK": ["Danijel Zagorac", "Nikola Čavlina", "Ivan Nevistić", "Ivan Filipović"],
"DF": ["Moreno Živković", "Bruno Goda", "Raúl Torrente", "Niko Galešić", "Ronaël
Pierre-Gabriel", "Matteo Pérez Vinlöf", "Moris Valinčić", "Kévin Théophile-Catherine", "Noa
Mikić", "Sergi Domínguez", "Leon Jakirović"],
"MF": ["Gonzalo Villar", "Luka Stojković", "Gabriel Vidović", "Marko Soldo", "Robert
Mudražija", "Josip Mišić", "Marko Bulat", "Branko Pavić", "Dejan Ljubičić"],
"FW": ["Arbër Hoxha", "Sandro Kulenović", "Juan Córdoba", "Mateo Lisica", "Cardoso
Varela", "Lovre Kulušić", "Fran Topić"]
},
"VfB Stuttgart": {
"GK": ["Fabian Bredlow", "Stefan Drljača", "Alexander Nübel"],
"DF": ["Ameen Al-Dakhil", "Ramon Hendriks", "Josha Vagnoman", "Maximilian Mittelstädt",
"Luca Jaquez", "Pascal Stenzel", "Leonidas Stergiou", "Lorenz Assignon", "Dan-Axel Zagadou",
"Jeff Chabot", "Finn Jeltsch", "Anrie Chase"],
"MF": ["Yannik Keitel", "Angelo Stiller", "Enzo Millot", "Chris Führich", "Atakan Karazor",
"Noah Darvich", "Nikolas Nartey"],
"FW": ["Ermedin Demirović", "Nick Woltemade", "Justin Diehl", "Jamie Leweling", "Deniz
Undav", "Lazar Jovanović", "Mohamed Sankoh", "Thomas Kastanaras", "Juan José Perea",
"Silas"]
},
"Shakhtar Donetsk": {
"GK": ["Tymur Puzankov", "Kiril Fesyun", "Dmytro Riznyk", "Denys Tvardovskyi"],
"DF": ["Diego Arroyo", "Valeriy Bondar", "Pedro Henrique", "Irakli Azarovi", "Vinicius Tobias",
"Alaa Ghram", "Mykola Matviyenko", "Yukhym Konoplya", "Maryan Faryna", "Marlon Santos"],
"MF": ["Marlon Gomes", "Dmytro Kryskiv", "Maryan Shved", "Heorhiy Sudakov", "Kevin",
"Artem Bondarenko", "Viktor Tsukanov", "Oleh Ocheretko", "Yehor Nazaryna", "Pedrinho",
"Newerton"],
"FW": ["Lassina Traoré", "Eguinaldo", "Kauã Elias", "Alisson"]
},
"Bologna": {
"GK": ["Łukasz Skorupski", "Federico Ravaglia"],
"DF": ["Emil Holm", "Martin Erlić", "Nicolò Casale", "Charalampos Lykogiannis", "Jhon
Lucumí", "Lorenzo De Silvestri", "Sam Beukema", "Juan Miranda", "Martin Vitík"],
"MF": ["Nikola Moro", "Remo Freuler", "Oussama El Azzouzi", "Lewis Ferguson", "Michel
Aebischer", "Giovanni Fabbian"],
"FW": ["Riccardo Orsolini", "Santiago Castro", "Dan Ndoye", "Jens Odgaard", "Thijs
Dallinga", "Nicolò Cambiaghi", "Benjamín Domínguez", "Ciro Immobile"]
},
"Red Star Belgrade": {
"GK": ["Matheus", "Omri Glazer", "Vuk Draškić", "Savo Radanović", "Ivan Guteša"],
"DF": ["Keimer Sandoval", "Rodrigão", "Miloš Veljković", "Nair Tiknizyan", "Veljko
Milosavljević", "Strahinja Stojković", "Young-woo Seol", "Ebenezer Annan"],
"MF": ["Mirko Ivanić", "Jovan Šljivić", "Aleksandar Katai", "Timi Max Elšnik", "Milson", "Luka
Ilić", "Rade Krunić", "Nemanja Radonjić", "Andrija Maksimović", "Vasilije Kostov"],
"FW": ["Cherif Ndiaye", "Peter Olayinka", "Bruno Duarte"]
},
"Sturm Graz": {
"GK": ["Matteo Bignetti", "Elias Lorenz", "Daniil Khudyakov"],
"DF": ["Max Johnston", "Tim Oermann", "Aleksandar Borković", "Emir Karić", "Arjan Malić",
"Dimitri Lavalée", "Niklas Geyrhofer", "Emanuel Aiwu"],
"MF": ["Jon Gorenc Stanković", "Filip Rózga", "Otar Kiteishvili", "William Bøving", "Emran
Soglo", "Tomi Horvat", "Tochi Chukwuani", "Julius Beck", "Stefan Hierländer", "Martin Kern",
"Jacob Peter Hödl"],
"FW": ["Szymon Włodarczyk", "Axel Kayombo", "Seedy Jatta", "Amady Camara", "Leon
Grgić"]
},
"Sparta Prague": {
"GK": ["Peter Vindahl", "Jakub Surovčík", "Joeri Heerkens"],
"DF": ["Martin Suchomel", "Pavel Kadeřábek", "Matěj Ryneš", "Emmanuel Uchenna",
"Ángelo Preciado", "Adam Ševínský", "Asger Sørensen", "Filip Panák", "Jaroslav Zelený", "Elias
Cobbaut"],
"MF": ["Santiago Eneme", "Kaan Kairinen", "Magnus Kofod Andersen", "Veljko Birmančević",
"Lukáš Sadílek", "Qazim Laçi", "Dominik Hollý", "Lukáš Haraslín", "Patrik Vydra", "Ermal
Krasniqi", "Roman Mokrovics", "Adam Karabec"],
"FW": ["Victor Olatunji", "Albion Rrahmani", "Jan Kuchta"]
},
"RB Leipzig": {
"GK": ["Péter Gulácsi", "Leopold Zingerle", "Maarten Vandevoordt", "Janis Blaswich"],
"DF": ["Lutsharel Geertruida", "Willi Orbán", "El Chadaille Bitshiabu", "Lukas Klostermann",
"Ridle Baku", "David Raum", "Castello Lukeba", "Benjamin Henrichs", "Leon Koß", "Lionel
Voufack", "Max Finkgräfe", "Tim Köhler"],
"MF": ["Antonio Nusa", "Amadou Haidara", "Xavi Simons", "Nicolas Seiwald", "Christoph
Baumgartner", "Arthur Vermeeren", "Assan Ouédraogo", "Xaver Schlager", "Faik Sakar", "Kevin
Kampl", "Viggo Gebel", "Ezechiel Banzuzi", "Eljif Elmas"],
"FW": ["Loïs Openda", "Robert Ramsak", "Benjamin Šeško", "Tidiam Gomis", "Yannick
Eduardo", "André Silva", "Timo Werner"]
},
"Girona": {
"GK": ["Juan Carlos", "Paulo Gazzaniga", "Vladyslav Krapyvtsov", "Toni Fuidias"],
"DF": ["Miguel Gutiérrez", "Arnau Martínez", "David López", "Alejandro Francés", "Daley
Blind", "Ladislav Krejčí", "Valery Fernández"],
"MF": ["Donny van de Beek", "Yangel Herrera", "Jhon Solís", "Iván Martín"],
"FW": ["Cristhian Stuani", "Viktor Tsyhankov", "Abel Ruiz", "Yáser Asprilla", "Bojan Miovski",
"Portu", "Gabriel Misehouy", "Joel Roca"]
},
"Red Bull Salzburg": {
"GK": ["Alexander Schlager", "Christian Zawieschitzky", "Salko Hamzić"],
"DF": ["Jacob Rasmussen", "Aleksa Terzić", "John Mellberg", "Samson Baidoo", "Frans
Krätzig", "Stefan Lainer", "Joane Gadou", "Jannik Schuster"],
"MF": ["Soumaila Diabate", "Sõta Kitano", "Bobby Clark", "Maurits Kjærgaard", "Mamady
Diambou", "Takumu Kawamura", "Mads Bidstrup", "Oscar Gloukh", "Tim Trummer", "Valentin
Sulzbacher"],
"FW": ["Karim Onisiwo", "Yorbe Vertessen", "Karim Konaté", "Edmund Baidoo", "Petar
Ratkov", "Kerim Alajbegović", "Adam Daghim", "Enrique Aguilar", "Dorgeles Nene", "Moussa
Yeo"]
},
"Slovan Bratislava": {
"GK": ["Andrej Mikoláš", "Martin Trnovský", "Matúš Macík", "Dominik Takáč"],
"DF": ["Guram Kashia", "Kevin Wimmer", "Kenan Bajrić", "Jurij Medveděv", "Zuberu
Sharani", "César Blackman", "Sandro Cruz"],
"MF": ["Peter Pokorný", "Rahim Ibrahim", "Vladimír Weiss Jr.", "Marko Tolić", "Tigran
Barseghyan", "Alen Mustafić", "Danylo Ihnatenko", "Kyriakos Savvidis"],
"FW": ["Mykola Kukharevych", "David Strelec", "Alasana Yirajang", "Nino Marcelli", "Róbert
Mak", "Kelvin Ofori"]
},
"Young Boys": {
"GK": ["Marvin Keller", "Heinz Lindner", "Ardian Bajrami", "David von Ballmoos", "Dario
Marzino"],
"DF": ["Jaouen Hadjam", "Tanguy Zoukrou", "Gregory Wüthrich", "Mohamed Ali Camara",
"Saidy Janko", "Noah Persson", "Loris Benito", "Zachary Athekame", "Lewin Blum", "Mats
Seiler", "Rhodri Smith"],
"MF": ["Filip Ugrinić", "Łukasz Łakomy", "Kastriot Imeri", "Ebrima Colley", "Miguel Chaiwa",
"Christian Fassnacht", "Donat Rrudhani", "Sandro Lauper", "Darian Maleš", "Rayan Raveloson",
"Théo Golliard", "Joël Monteiro"],
"FW": ["Cedric Itten", "Meschak Elia", "Alan Virginius", "Emmanuel Tsimba", "Chris Bedia",
"Facinet Conte"]
}
};
// --- Defined Competition Lists ---
const PREMIER_LEAGUE_TEAMS = [
"Arsenal", "Aston Villa", "Bournemouth", "Brentford", "Brighton & Hove Albion",
"Burnley", "Chelsea", "Crystal Palace", "Everton", "Fulham", "Leeds United",
"Liverpool", "Manchester City", "Manchester United", "Newcastle United",
"Nottingham Forest", "Sunderland", "Tottenham Hotspur", "West Ham United", "Wolverhampton
Wanderers"
];
const CHAMPIONS_LEAGUE_TEAMS = [
"Liverpool", "Barcelona", "Arsenal", "Inter Milan", "Atlético Madrid", "Bayer Leverkusen",
"Lille", "Chelsea", "Atalanta", "Borussia Dortmund", "Real Madrid", "Bayern Munich",
"AC Milan", "PSV Eindhoven", "Paris Saint-Germain", "Benfica", "AS Monaco", "Brest",
"Feyenoord", "Juventus", "Celtic", "Manchester City", "Sporting CP", "Club Brugge",
"Dinamo Zagreb", "VfB Stuttgart", "Shakhtar Donetsk", "Bologna", "Red Star Belgrade",
"Sturm Graz", "Sparta Prague", "RB Leipzig", "Girona", "Red Bull Salzburg",
"Slovan Bratislava", "Young Boys"
];
// --- Helper Functions ---
const shuffleArray = (array) => {
let currentIndex = [Link], randomIndex;
while (currentIndex !== 0) {
randomIndex = [Link]([Link]() * currentIndex);
currentIndex--;
[array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];
}
return array;
};
// --- Main App Component ---
const App = () => {
const [view, setView] = useState('loading'); // loading, simulation, plStandings, uclStandings,
playerStats, teamStats
const [squads, setSquads] = useState({});
const [combinedSchedule, setCombinedSchedule] = useState([]);
const [currentMatchIndex, setCurrentMatchIndex] = useState(0);
const [plStandings, setPlStandings] = useState({});
const [uclStandings, setUclStandings] = useState({});
const [playerStats, setPlayerStats] = useState({ premierLeague: { goals: {}, assists: {} },
championsLeague: { goals: {}, assists: {} } });
const [uclPhase, setUclPhase] = useState('league');
const [uclKnockoutTies, setUclKnockoutTies] = useState([]);
const [modal, setModal] = useState({ isOpen: false, match: null, leg: null, step: 'score' });
const [homeScore, setHomeScore] = useState('');
const [awayScore, setAwayScore] = useState('');
const [matchDetails, setMatchDetails] = useState({ home: [], away: [] });
const [penaltyWinner, setPenaltyWinner] = useState(null);
const [error, setError] = useState('');
const [loading, setLoading] = useState(false);
const [selectedTeam, setSelectedTeam] = useState(null); // { name: 'Arsenal', competition:
'premierLeague' }
// --- Memoized Statistics and Standings ---
const sortedPlStandings = useMemo(() => {
return [Link](plStandings).sort((a, b) => {
if ([Link] !== [Link]) return [Link] - [Link];
if ([Link] !== [Link]) return [Link] - [Link];
if ([Link] !== [Link]) return [Link] - [Link];
return [Link]([Link]);
});
}, [plStandings]);
const sortedUclStandings = useMemo(() => {
return [Link](uclStandings).sort((a, b) => {
if ([Link] !== [Link]) return [Link] - [Link];
if ([Link] !== [Link]) return [Link] - [Link];
if ([Link] !== [Link]) return [Link] - [Link];
return [Link]([Link]);
});
}, [uclStandings]);
const getTopScorers = (league) => {
const leagueKey = league === 'pl' ? 'premierLeague' : 'championsLeague';
if (!playerStats[leagueKey] || !playerStats[leagueKey].goals) return [];
return [Link](playerStats[leagueKey].goals).sort(([, a], [, b]) => b - a).slice(0, 25);
};
const getTopAssisters = (league) => {
const leagueKey = league === 'pl' ? 'premierLeague' : 'championsLeague';
if (!playerStats[leagueKey] || !playerStats[leagueKey].assists) return [];
return [Link](playerStats[leagueKey].assists).sort(([, a], [, b]) => b - a).slice(0, 25);
};
// --- Core Logic ---
const initializeNewSeason = () => {
setLoading(true);
setError('');
try {
setSquads(preloadedSquadsWithPositions);
// Initialize Stats
const initialStats = { played: 0, wins: 0, draws: 0, losses: 0, goalsFor: 0, goalsAgainst: 0,
goalDifference: 0, points: 0 };
const newPlStandings = {};
PREMIER_LEAGUE_TEAMS.forEach(name => { newPlStandings[name] = { name,
...initialStats }; });
const newUclStandings = {};
CHAMPIONS_LEAGUE_TEAMS.forEach(name => { newUclStandings[name] = { name,
...initialStats }; });
setPlStandings(newPlStandings);
setUclStandings(newUclStandings);
setPlayerStats({ premierLeague: { goals: {}, assists: {} }, championsLeague: { goals: {},
assists: {} } });
// Generate Schedules
const plTeams = [...PREMIER_LEAGUE_TEAMS];
let plFixtures = [];
if ([Link] % 2 !== 0) [Link]('dummy');
const rounds = [Link] - 1;
for (let round = 0; round < rounds; round++) {
for (let match = 0; match < [Link] / 2; match++) {
const home = plTeams[match];
const away = plTeams[[Link] - 1 - match];
if (home !== 'dummy' && away !== 'dummy') {
[Link]({ competition: 'premierLeague', home, away, matchday: round + 1 });
}
}
[Link](1, 0, [Link]());
}
let secondHalfFixtures = [Link](f => ({ ...f, home: [Link], away: [Link], matchday:
[Link] + rounds }));
plFixtures = [...plFixtures, ...shuffleArray(secondHalfFixtures)];
const uclTeams = [...CHAMPIONS_LEAGUE_TEAMS];
let uclFixtures = [];
const uclMatchdays = 8;
[Link](team => {
let opponents = [Link](t => t !== team);
shuffleArray(opponents);
let homeCount = 0;
let awayCount = 0;
let assignedOpponents = new Set();
for (const opponent of opponents) {
if ([Link] >= 8) break;
if ([Link](opponent)) continue;
const playHome = (homeCount < 4 && [Link]() > 0.5) || awayCount >= 4;
if (playHome && homeCount < 4) {
[Link]({ home: team, away: opponent });
homeCount++;
} else if (awayCount < 4) {
[Link]({ home: opponent, away: team });
awayCount++;
}
[Link](opponent);
}
});
let uniqueUCLFixtures = [Link](new Set([Link](m => [Link]({ home:
[Link], away: [Link], competition: 'championsLeague' })))).map(s => [Link](s));
shuffleArray(uniqueUCLFixtures);
let finalUclFixtures = [];
let assignedMatchesPerDay = [Link]({ length: uclMatchdays }, () => new Set());
[Link](match => {
for (let md = 0; md < uclMatchdays; md++) {
if (!assignedMatchesPerDay[md].has([Link]) &&
!assignedMatchesPerDay[md].has([Link])) {
[Link]({ ...match, matchday: md + 1 });
assignedMatchesPerDay[md].add([Link]);
assignedMatchesPerDay[md].add([Link]);
break;
}
}
});
let combined = [];
const plMatchdays = 38;
const uclInsertionPoints = [3, 6, 9, 12, 15, 18, 21, 24];
let plMatchday = 1;
let uclMatchday = 1;
while(plMatchday <= plMatchdays) {
[Link](...[Link](f => [Link] === plMatchday));
if([Link](plMatchday) && uclMatchday <= uclMatchdays) {
[Link](...[Link](f => [Link] === uclMatchday));
uclMatchday++;
}
plMatchday++;
}
setCombinedSchedule(combined);
setCurrentMatchIndex(0);
setUclPhase('league');
setUclKnockoutTies([]);
setView('simulation');
} catch (e) {
setError(`Error starting new season: ${[Link]}.`);
} finally {
setLoading(false);
}
};
const handleNextMatch = () => {
const match = combinedSchedule[currentMatchIndex];
if (!match) {
setError("End of season.");
return;
}
resetInputs();
setModal({ isOpen: true, match, leg: [Link] || null, step: 'score' });
};
const handleScoreSet = () => {
const hScore = parseInt(homeScore, 10);
const aScore = parseInt(awayScore, 10);
if (isNaN(hScore) || isNaN(aScore) || hScore < 0 || aScore < 0) {
setError("Please enter valid, non-negative numbers for scores.");
return;
}
setMatchDetails({
home: Array(hScore).fill({ scorer: '', assister: '' }),
away: Array(aScore).fill({ scorer: '', assister: '' }),
});
setModal(prev => ({ ...prev, step: 'details' }));
setError('');
};
const handleDetailChange = (team, index, type, value) => {
setMatchDetails(prev => {
const newDetails = [Link]([Link](prev));
newDetails[team][index][type] = value;
if (type === 'scorer' && newDetails[team][index].assister === value) {
newDetails[team][index].assister = '';
}
return newDetails;
});
};
const handleDetailsSubmit = () => {
for (const team of ['home', 'away']) {
for (const detail of matchDetails[team]) {
if (![Link] || ![Link]) {
setError("Please assign a scorer and assister for every goal.");
return;
}
if ([Link] === [Link]) {
setError(`A player cannot assist their own goal. Check ${team} team's assignments.`);
return;
}
}
}
setError('');
setModal(prev => ({ ...prev, step: 'summary' }));
};
const processMatchResult = () => {
const { match } = modal;
const hScore = parseInt(homeScore, 10);
const aScore = parseInt(awayScore, 10);
const updatedSchedule = [...combinedSchedule];
updatedSchedule[currentMatchIndex] = { ...updatedSchedule[currentMatchIndex], result:
[hScore, aScore] };
setCombinedSchedule(updatedSchedule);
const updateStandings = (standings, setStandings) => {
const newStandings = [Link]([Link](standings));
const home = newStandings[[Link]];
const away = newStandings[[Link]];
[Link]++; [Link]++;
[Link] += hScore; [Link] += aScore;
[Link] += aScore; [Link] += hScore;
[Link] = [Link] - [Link];
[Link] = [Link] - [Link];
if (hScore > aScore) { [Link]++; [Link]++; [Link] += 3; }
else if (aScore > hScore) { [Link]++; [Link]++; [Link] += 3; }
else { [Link]++; [Link]++; [Link] += 1; [Link] += 1; }
setStandings(newStandings);
};
const updatePlayerStats = (leagueKey) => {
const newStats = [Link]([Link](playerStats));
[Link](({ scorer, assister }) => {
newStats[leagueKey].goals[scorer] = (newStats[leagueKey].goals[scorer] || 0) + 1;
newStats[leagueKey].assists[assister] = (newStats[leagueKey].assists[assister] || 0) + 1;
});
[Link](({ scorer, assister }) => {
newStats[leagueKey].goals[scorer] = (newStats[leagueKey].goals[scorer] || 0) + 1;
newStats[leagueKey].assists[assister] = (newStats[leagueKey].assists[assister] || 0) + 1;
});
setPlayerStats(newStats);
};
if ([Link] === 'premierLeague') {
updateStandings(plStandings, setPlStandings);
updatePlayerStats('premierLeague');
} else if ([Link]('championsLeague')) {
const leagueKey = 'championsLeague';
if (uclPhase === 'league') {
updateStandings(uclStandings, setUclStandings);
}
updatePlayerStats(leagueKey);
}
setModal({ isOpen: false, match: null, leg: null, step: 'score' });
setCurrentMatchIndex(prev => prev + 1);
checkUCLPhaseTransition(currentMatchIndex + 1);
};
const checkUCLPhaseTransition = (nextIndex) => {
const remainingMatches = [Link](nextIndex);
const uclLeagueMatchesRemain = [Link](m => [Link] ===
'championsLeague');
if (uclPhase === 'league' && !uclLeagueMatchesRemain &&
CHAMPIONS_LEAGUE_TEAMS.length > 0) {
setupUCLPlayoffs();
}
};
const setupUCLPlayoffs = () => {
setUclPhase('playoff');
const rankedTeams = [Link](t => [Link]);
const playoffTeams = [Link](8, 24);
const seeded = [Link](0, 8);
const unseeded = [Link](8, 16);
shuffleArray(unseeded);
const playoffTies = [Link]((team, i) => ({ team1: team, team2: unseeded[i], leg1Score:
null, leg2Score: null, winner: null }));
setUclKnockoutTies(playoffTies);
const playoffFixtures = [];
[Link](tie => {
[Link]({ competition: 'championsLeague-playoff', home: tie.team2, away:
tie.team1, leg: 1 });
[Link]({ competition: 'championsLeague-playoff', home: tie.team1, away:
tie.team2, leg: 2 });
});
setCombinedSchedule(prev => [...prev, ...shuffleArray(playoffFixtures)]);
};
const resetInputs = () => {
setHomeScore('');
setAwayScore('');
setMatchDetails({ home: [], away: [] });
setPenaltyWinner(null);
setError('');
};
const handleTeamClick = (teamName, competition) => {
setSelectedTeam({ name: teamName, competition });
setView('teamStats');
};
const handleResetProgress = () => {
if ([Link]("Are you sure you want to reset all progress? This cannot be undone.")) {
[Link]('seasonSimulatorSave');
setView('loading');
setTimeout(() => initializeNewSeason(), 100);
}
};
// --- Save & Load from Local Storage ---
useEffect(() => {
const savedStateJSON = [Link]('seasonSimulatorSave');
if (savedStateJSON) {
try {
const savedState = [Link](savedStateJSON);
setSquads([Link] || {});
setCombinedSchedule([Link] || []);
setCurrentMatchIndex([Link] || 0);
setPlStandings([Link] || {});
setUclStandings([Link] || {});
setPlayerStats([Link] || { premierLeague: { goals: {}, assists: {} },
championsLeague: { goals: {}, assists: {} } });
setUclPhase([Link] || 'league');
setUclKnockoutTies([Link] || []);
setView('simulation');
} catch (e) {
[Link]("Failed to parse saved state, starting new season.", e);
initializeNewSeason();
}
} else {
initializeNewSeason();
}
}, []);
useEffect(() => {
if (view !== 'loading' && [Link](squads).length > 0) {
const stateToSave = {
squads,
combinedSchedule,
currentMatchIndex,
plStandings,
uclStandings,
playerStats,
uclPhase,
uclKnockoutTies,
};
[Link]('seasonSimulatorSave', [Link](stateToSave));
}
}, [squads, combinedSchedule, currentMatchIndex, plStandings, uclStandings, playerStats,
uclPhase, uclKnockoutTies]);
const currentMatch = combinedSchedule[currentMatchIndex];
const renderLoadingScreen = () => (
<div className="flex items-center justify-center h-screen">
<div className="animate-spin rounded-full h-32 w-32 border-t-2 border-b-2
border-blue-500"></div>
</div>
);
const renderSimulation = () => (
<div className="p-4 sm:p-6 lg:p-8">
<header className="flex flex-wrap justify-between items-center mb-6 pb-4 border-b">
<h1 className="text-3xl font-bold text-gray-800">Football Season Simulator</h1>
<div className="flex items-center space-x-2 text-sm text-gray-500">
<span>Match {currentMatchIndex} / {[Link]}</span>
<span className="font-semibold capitalize">| {[Link](/-/g, ' ')} Phase</span>
</div>
</header>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<div className="md:col-span-2 bg-white p-6 rounded-xl shadow-lg">
<h2 className="text-2xl font-semibold mb-4 text-gray-700">Upcoming Match</h2>
{currentMatch ? (
<div className="text-center bg-gray-50 p-6 rounded-lg">
<p className="text-sm font-medium text-indigo-600 uppercase
tracking-wider">{[Link](/([A-Z])/g, ' $1').replace(/-/g, ' ')}
{[Link] && `- Matchday ${[Link]}`} {[Link] && `-
Leg ${[Link]}`}</p>
<div className="flex items-center justify-center my-4">
<span className="text-2xl md:text-3xl font-bold text-right w-2/5 truncate"
title={[Link]}>{[Link]}</span>
<span className="text-xl md:text-2xl font-light text-gray-400 mx-4">vs</span>
<span className="text-2xl md:text-3xl font-bold text-left w-2/5 truncate"
title={[Link]}>{[Link]}</span>
</div>
<button onClick={handleNextMatch} className="mt-4 bg-green-500 text-white
font-bold py-3 px-8 rounded-lg hover:bg-green-600 transition-transform transform
hover:scale-105 shadow-md">Simulate Match</button>
</div>
):(
<div className="text-center p-6 bg-gray-50 rounded-lg">
<h3 className="text-2xl font-bold text-green-600">Season Finished!</h3>
<p className="text-gray-600 mt-2">All matches have been simulated.</p>
</div>
)}
</div>
<div className="bg-white p-6 rounded-xl shadow-lg">
<h2 className="text-2xl font-semibold mb-4 text-gray-700">Dashboard</h2>
<div className="space-y-3">
<p className="text-xs text-center text-gray-500">Progress is saved automatically.</p>
<button onClick={() => setView('plStandings')} className="w-full flex items-center
justify-between p-3 bg-gray-100 hover:bg-gray-200 rounded-lg transition"><div className="flex
items-center"><Shield className="w-5 h-5 mr-3 text-red-500" /> Premier
League</div><ArrowRight className="w-5 h-5" /></button>
<button onClick={() => setView('uclStandings')} className="w-full flex items-center
justify-between p-3 bg-gray-100 hover:bg-gray-200 rounded-lg transition"><div className="flex
items-center"><Trophy className="w-5 h-5 mr-3 text-blue-500" /> Champions
League</div><ArrowRight className="w-5 h-5" /></button>
<button onClick={() => setView('playerStats')} className="w-full flex items-center
justify-between p-3 bg-gray-100 hover:bg-gray-200 rounded-lg transition"><div className="flex
items-center"><BarChart2 className="w-5 h-5 mr-3 text-yellow-500" /> Player
Statistics</div><ArrowRight className="w-5 h-5" /></button>
<button onClick={handleResetProgress} className="w-full flex items-center
justify-center p-3 bg-red-100 hover:bg-red-200 text-red-700 rounded-lg transition
mt-4"><RefreshCw className="w-5 h-5 mr-2" /> Reset Progress</button>
</div>
</div>
</div>
</div>
);
const renderStandings = (title, standings, competition) => {
const fixtures = [Link](m =>
[Link]([Link](0,5)));
const groupedFixtures = [Link]((acc, m) => {
const key = [Link] || 'Playoff';
if (!acc[key]) acc[key] = [];
acc[key].push(m);
return acc;
}, {});
return (
<div className="p-4 sm:p-6 lg:p-8">
<div className="flex justify-between items-center mb-6">
<h1 className="text-3xl font-bold text-gray-800">{title}</h1>
<button onClick={() => setView('simulation')} className="bg-gray-200 hover:bg-gray-300
text-gray-800 font-bold py-2 px-4 rounded-lg transition">Back to Sim</button>
</div>
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
<div className="bg-white rounded-xl shadow-lg overflow-x-auto">
<table className="w-full min-w-[640px] text-sm text-left text-gray-500">
<thead className="text-xs text-gray-700 uppercase bg-gray-100"><tr><th scope="col"
className="px-4 py-3 w-8 text-center">Pos</th><th scope="col" className="px-6
py-3">Team</th><th scope="col" className="px-2 py-3 text-center">MP</th><th scope="col"
className="px-2 py-3 text-center">W</th><th scope="col" className="px-2 py-3
text-center">D</th><th scope="col" className="px-2 py-3 text-center">L</th><th scope="col"
className="px-2 py-3 text-center">GF</th><th scope="col" className="px-2 py-3
text-center">GA</th><th scope="col" className="px-2 py-3 text-center">GD</th><th
scope="col" className="px-2 py-3 text-center">Pts</th></tr></thead>
<tbody>
{[Link]((team, index) => (
<tr key={[Link]} className="border-b hover:bg-gray-50 cursor-pointer"
onClick={() => handleTeamClick([Link], competition)}>
<td className="px-4 py-3 font-medium text-gray-900 text-center">{index +
1}</td><td className="px-6 py-3 font-semibold text-gray-900">{[Link]}</td><td
className="px-2 py-3 text-center">{[Link]}</td><td className="px-2 py-3
text-center">{[Link]}</td><td className="px-2 py-3 text-center">{[Link]}</td><td
className="px-2 py-3 text-center">{[Link]}</td><td className="px-2 py-3
text-center">{[Link]}</td><td className="px-2 py-3
text-center">{[Link]}</td><td className="px-2 py-3
text-center">{[Link]}</td><td className="px-2 py-3 font-bold text-gray-900
text-center">{[Link]}</td>
</tr>
))}
</tbody>
</table>
</div>
<div className="bg-white rounded-xl shadow-lg overflow-hidden">
<h3 className="p-4 font-bold text-lg bg-gray-50 border-b">Fixtures & Results</h3>
<div className="overflow-y-auto max-h-[70vh]">
{[Link](groupedFixtures).map(([matchday, matches]) => (
<div key={matchday}>
<h4 className="p-2 font-semibold bg-gray-200 text-sm sticky top-0">Matchday
{matchday}</h4>
<ul className="divide-y divide-gray-200">
{[Link]((m, i) => (
<li key={i} className="p-3 flex justify-between items-center text-sm">
<span className="w-2/5 text-right truncate">{[Link]}</span>
<span className="w-1/5 text-center font-bold">{[Link] ?
`${[Link][0]} - ${[Link][1]}` : 'vs'}</span>
<span className="w-2/5 text-left truncate">{[Link]}</span>
</li>
))}
</ul>
</div>
))}
</div>
</div>
</div>
</div>
);
};
const renderUCLKnockouts = () => (
<div className="p-4 sm:p-6 lg:p-8">
<div className="flex justify-between items-center mb-6"><h1 className="text-3xl
font-bold text-gray-800">Champions League Knockouts</h1><button onClick={() =>
setView('simulation')} className="bg-gray-200 hover:bg-gray-300 text-gray-800 font-bold py-2
px-4 rounded-lg transition">Back to Sim</button></div>
<div className="space-y-8">
<div>
<h2 className="text-2xl font-semibold mb-4 border-b pb-2
capitalize">{[Link](/-/g, ' ')} Round</h2>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{[Link]((tie, i) => (
<div key={i} className="bg-white p-4 rounded-lg shadow-md">
<div className={`flex justify-between items-center ${[Link] === tie.team1
? 'font-bold text-green-600' : ''}`}><span>{tie.team1} (S)</span></div>
<div className={`flex justify-between items-center ${[Link] === tie.team2
? 'font-bold text-green-600' : ''}`}><span>{tie.team2} (U)</span></div>
{tie.leg1Score && <div className="text-xs text-gray-500 mt-1">Leg 1:
{tie.team2} {tie.leg1Score[1]} - {tie.leg1Score[0]} {tie.team1}</div>}
{tie.leg2Score && <div className="text-xs text-gray-500">Leg 2: {tie.team1}
{tie.leg2Score[0]} - {tie.leg2Score[1]} {tie.team2}</div>}
</div>
))}
</div>
</div>
</div>
</div>
);
const renderPlayerStats = () => (
<div className="p-4 sm:p-6 lg:p-8">
<div className="flex justify-between items-center mb-6"><h1 className="text-3xl
font-bold text-gray-800">Player Statistics</h1><button onClick={() => setView('simulation')}
className="bg-gray-200 hover:bg-gray-300 text-gray-800 font-bold py-2 px-4 rounded-lg
transition">Back to Sim</button></div>
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
{[{key: 'pl', name: 'Premier League', competition: 'premierLeague'}, {key: 'ucl', name:
'Champions League', competition: 'championsLeague'}].map(league => (
<div key={[Link]} className="space-y-6">
<h2 className="text-2xl font-semibold text-gray-700">{[Link]}</h2>
<div className="bg-white rounded-xl shadow-lg overflow-hidden"><h3 className="p-4
font-bold text-lg bg-gray-50 border-b">Top 25 Goalscorers</h3><ul className="divide-y
divide-gray-200">{getTopScorers([Link]).map(([player, goals], i) => (<li key={player}
className="p-3 flex justify-between items-center"><span className="font-medium
text-gray-800">{i+1}. {player}</span><span className="font-bold text-lg
text-blue-600">{goals}</span></li>))}</ul></div>
<div className="bg-white rounded-xl shadow-lg overflow-hidden"><h3 className="p-4
font-bold text-lg bg-gray-50 border-b">Top 25 Assisters</h3><ul className="divide-y
divide-gray-200">{getTopAssisters([Link]).map(([player, assists], i) => (<li key={player}
className="p-3 flex justify-between items-center"><span className="font-medium
text-gray-800">{i+1}. {player}</span><span className="font-bold text-lg
text-green-600">{assists}</span></li>))}</ul></div>
</div>
))}
</div>
</div>
);
const renderTeamStats = () => {
if (!selectedTeam) return null;
const { name, competition } = selectedTeam;
const teamSquad = [Link](squads[name] || {}).flatMap(([, players]) => players);
const competitionName = competition === 'premierLeague' ? 'Premier League' : 'Champions
League';
const playerStatData = playerStats[competition] || { goals: {}, assists: {} };
const standingsData = competition === 'premierLeague' ? [Link](plStandings) :
[Link](uclStandings);
const teamStandings = [Link](t => [Link] === name) || {};
// Calculate Ranks
const goalsForRank = [...standingsData].sort((a, b) => [Link] - [Link]).findIndex(t =>
[Link] === name) + 1;
const goalsAgainstRank = [...standingsData].sort((a, b) => [Link] -
[Link]).findIndex(t => [Link] === name) + 1;
// Calculate Clean Sheets and Rank
const playedMatches = [Link](m => [Link] &&
[Link]([Link](0,5)));
const cleanSheetsByTeam = [Link]((acc, team) => {
acc[[Link]] = [Link](m => {
return ([Link] === [Link] && [Link][1] === 0) || ([Link] === [Link] &&
[Link][0] === 0);
}).length;
return acc;
}, {});
const cleanSheetsRank = [Link](cleanSheetsByTeam).sort(([, a], [, b]) => b -
a).findIndex(([teamName]) => teamName === name) + 1;
const cleanSheets = cleanSheetsByTeam[name] || 0;
// Get Fixtures
const fixtures = [Link](m => ([Link] === name || [Link] === name) &&
[Link]([Link](0,5)));
const playerRows = [Link](player => ({
name: player,
goals: [Link][player] || 0,
assists: [Link][player] || 0,
})).sort((a,b) => ([Link] + [Link]) - ([Link] + [Link]));
return (
<div className="p-4 sm:p-6 lg:p-8">
<div className="flex justify-between items-center mb-6">
<h1 className="text-3xl font-bold text-gray-800">{name} - {competitionName}</h1>
<button onClick={() => setView(competition === 'premierLeague' ? 'plStandings' :
'uclStandings')} className="bg-gray-200 hover:bg-gray-300 text-gray-800 font-bold py-2 px-4
rounded-lg transition">Back to Standings</button>
</div>
<div className="grid grid-cols-1 lg:grid-cols-3 gap-4 mb-8">
<div className="bg-white p-4 rounded-lg shadow text-center"><div
className="text-sm text-gray-500">Goals Scored</div><div className="text-2xl
font-bold">{[Link]} <span className="text-lg font-normal
text-gray-600">({goalsForRank})</span></div></div>
<div className="bg-white p-4 rounded-lg shadow text-center"><div
className="text-sm text-gray-500">Goals Conceded</div><div className="text-2xl
font-bold">{[Link]} <span className="text-lg font-normal
text-gray-600">({goalsAgainstRank})</span></div></div>
<div className="bg-white p-4 rounded-lg shadow text-center"><div
className="text-sm text-gray-500">Clean Sheets</div><div className="text-2xl
font-bold">{cleanSheets} <span className="text-lg font-normal
text-gray-600">({cleanSheetsRank})</span></div></div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
<div className="bg-white rounded-xl shadow-lg overflow-hidden">
<h3 className="p-4 font-bold text-lg bg-gray-50 border-b">Player Stats</h3>
<div className="overflow-y-auto max-h-[60vh]">
<table className="w-full text-sm text-left text-gray-500">
<thead className="text-xs text-gray-700 uppercase bg-gray-100 sticky
top-0"><tr><th scope="col" className="px-6 py-3">Player</th><th scope="col"
className="px-6 py-3 text-center">Goals</th><th scope="col" className="px-6 py-3
text-center">Assists</th></tr></thead>
<tbody>{[Link](player => (<tr key={[Link]}
className="border-b hover:bg-gray-50"><td className="px-6 py-4 font-semibold
text-gray-900">{[Link]}</td><td className="px-6 py-4
text-center">{[Link]}</td><td className="px-6 py-4
text-center">{[Link]}</td></tr>))}</tbody>
</table>
</div>
</div>
<div className="bg-white rounded-xl shadow-lg overflow-hidden">
<h3 className="p-4 font-bold text-lg bg-gray-50 border-b">Fixtures & Results</h3>
<div className="overflow-y-auto max-h-[60vh]">
<ul className="divide-y divide-gray-200">
{[Link]((m, i) => {
const opponent = [Link] === name ? [Link] : [Link];
const isHome = [Link] === name;
let resultBadge = null;
if ([Link]) {
const homeScore = [Link][0];
const awayScore = [Link][1];
if ((isHome && homeScore > awayScore) || (!isHome && awayScore >
homeScore)) {
resultBadge = <span className="text-xs font-bold bg-green-500
text-white px-2 py-1 rounded-full">W</span>;
} else if ((isHome && awayScore > homeScore) || (!isHome && homeScore
> awayScore)) {
resultBadge = <span className="text-xs font-bold bg-red-500 text-white
px-2 py-1 rounded-full">L</span>;
} else {
resultBadge = <span className="text-xs font-bold bg-gray-500
text-white px-2 py-1 rounded-full">D</span>;
}
}
return (
<li key={i} className="p-4 flex justify-between items-center">
<div className="font-medium">{opponent} <span className="text-xs
text-gray-500">({isHome ? 'H' : 'A'})</span></div>
<div className="flex items-center gap-3">
{[Link] ? <span className="font-bold">{[Link][0]} -
{[Link][1]}</span> : <span className="text-sm text-gray-400">vs</span>}
{resultBadge}
</div>
</li>
);
})}
</ul>
</div>
</div>
</div>
</div>
);
};
const renderModal = () => {
if (![Link]) return null;
const { match, step } = modal;
const renderScoreInput = () => (
<div className="space-y-4">
<div className="flex gap-4 items-center">
<label className="w-1/3 font-medium text-gray-700 text-right">{[Link]}
Score</label>
<input type="number" min="0" value={homeScore} onChange={(e) =>
setHomeScore([Link])} className="w-2/3 p-2 border rounded-md shadow-inner" />
</div>
<div className="flex gap-4 items-center">
<label className="w-1/3 font-medium text-gray-700 text-right">{[Link]}
Score</label>
<input type="number" min="0" value={awayScore} onChange={(e) =>
setAwayScore([Link])} className="w-2/3 p-2 border rounded-md shadow-inner" />
</div>
<button onClick={handleScoreSet} className="w-full bg-blue-600 text-white font-bold py-3
rounded-lg hover:bg-blue-700 transition">Set Score & Assign Details</button>
</div>
);
const PlayerDropdown = ({ squad, selectedScorer, selectedValue, onChange, type }) => (
<select value={selectedValue} onChange={onChange} className="w-full p-2 border
rounded-md bg-white">
<option value="">Select {type}</option>
{[Link](squad).map(([position, players]) => (
<optgroup key={position} label={position}>
{[Link](p => p !== selectedScorer).map(p => <option key={p}
value={p}>{p}</option>)}
</optgroup>
))}
</select>
);
const renderDetailsInput = () => {
const homeSquad = squads[[Link]] || {};
const awaySquad = squads[[Link]] || {};
return (
<div className="space-y-6">
{[Link] > 0 && (
<div>
<h4 className="text-lg font-semibold text-gray-800 border-b pb-2
mb-3">{[Link]} Goals</h4>
{[Link]((goal, index) => (
<div key={`home-${index}`} className="grid grid-cols-1 md:grid-cols-2 gap-3
items-center mb-3 p-2 bg-gray-50 rounded-lg">
<div className="font-medium">Goal {index + 1}</div>
<div className="space-y-2">
<PlayerDropdown squad={homeSquad} selectedValue={[Link]}
onChange={(e) => handleDetailChange('home', index, 'scorer', [Link])} type="Scorer" />
<PlayerDropdown squad={homeSquad} selectedScorer={[Link]}
selectedValue={[Link]} onChange={(e) => handleDetailChange('home', index, 'assister',
[Link])} type="Assister" />
</div>
</div>
))}
</div>
)}
{[Link] > 0 && (
<div>
<h4 className="text-lg font-semibold text-gray-800 border-b pb-2
mb-3">{[Link]} Goals</h4>
{[Link]((goal, index) => (
<div key={`away-${index}`} className="grid grid-cols-1 md:grid-cols-2 gap-3
items-center mb-3 p-2 bg-gray-50 rounded-lg">
<div className="font-medium">Goal {index + 1}</div>
<div className="space-y-2">
<PlayerDropdown squad={awaySquad} selectedValue={[Link]}
onChange={(e) => handleDetailChange('away', index, 'scorer', [Link])} type="Scorer" />
<PlayerDropdown squad={awaySquad} selectedScorer={[Link]}
selectedValue={[Link]} onChange={(e) => handleDetailChange('away', index, 'assister',
[Link])} type="Assister" />
</div>
</div>
))}
</div>
)}
<button onClick={handleDetailsSubmit} className="w-full bg-green-500 text-white
font-bold py-3 rounded-lg hover:bg-green-600 transition">Review Summary</button>
</div>
);
};
const renderSummary = () => (
<div className="text-center space-y-4">
<div className="text-4xl font-bold text-gray-800">
<span>{[Link]}</span>
<span className="mx-4">{homeScore} - {awayScore}</span>
<span>{[Link]}</span>
</div>
<div className="grid grid-cols-2 gap-4 text-left">
<div>
{[Link]((g, i) => <p key={`h-sum-${i}`}>{[Link]}
({[Link]})</p>)}
</div>
<div>
{[Link]((g, i) => <p key={`a-sum-${i}`}>{[Link]}
({[Link]})</p>)}
</div>
</div>
<button onClick={processMatchResult} className="w-full bg-indigo-600 text-white
font-bold py-3 rounded-lg hover:bg-indigo-700 transition">Confirm & Proceed</button>
</div>
);
return (
<div className="fixed inset-0 bg-black bg-opacity-60 flex items-center justify-center p-4
z-50">
<div className="bg-white rounded-xl shadow-2xl w-full max-w-2xl max-h-[90vh]
overflow-y-auto">
<div className="p-6">
<h2 className="text-2xl font-bold text-gray-800 mb-2">Simulate Match</h2>
<div className="text-center bg-gray-100 p-4 rounded-lg mb-4">
<p className="font-semibold text-lg">{[Link]} vs {[Link]}</p>
<p className="text-sm text-gray-500 capitalize">{[Link](/-/g, ' ')}
{[Link] ? `- Leg ${[Link]}` : ''}</p>
</div>
{error && <p className="text-red-500 text-sm mb-4 bg-red-100 p-3
rounded-md">{error}</p>}
{step === 'score' && renderScoreInput()}
{step === 'details' && renderDetailsInput()}
{step === 'summary' && renderSummary()}
<button onClick={() => setModal({ isOpen: false, match: null, leg: null, step: 'score' })}
className="w-full mt-3 text-sm text-gray-600 hover:underline">Cancel</button>
</div>
</div>
</div>
);
};
const AppContent = () => {
switch (view) {
case 'loading': return renderLoadingScreen();
case 'simulation': return renderSimulation();
case 'plStandings': return renderStandings('Premier League', sortedPlStandings,
'premierLeague');
case 'uclStandings': return uclPhase === 'league' ? renderStandings('Champions League',
sortedUclStandings, 'championsLeague') : renderUCLKnockouts();
case 'playerStats': return renderPlayerStats();
case 'teamStats': return renderTeamStats();
default: return renderLoadingScreen();
}
}
return (
<div className="bg-gray-50 min-h-screen font-sans">
<AppContent />
{renderModal()}
</div>
);
};
export default App;