import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:intl/intl.dart';

import '../../models/score_model.dart';
import '../../models/participant_model.dart';
import '../../services/event_service.dart';
import '../../widgets/loading_indicator.dart';

class ScoreFormScreen extends StatefulWidget {
  final String eventId;
  final Score? score; // null이면 새 점수 추가, 아니면 점수 수정
  final List<Participant> participants;

  const ScoreFormScreen({
    super.key,
    required this.eventId,
    this.score,
    required this.participants,
  });

  @override
  State<ScoreFormScreen> createState() => _ScoreFormScreenState();
}

class _ScoreFormScreenState extends State<ScoreFormScreen> {
  final _formKey = GlobalKey<FormState>();
  bool _isLoading = false;
  bool _useFrameInput = false; // 프레임별 입력 사용 여부

  // 폼 필드 컨트롤러
  final _notesController = TextEditingController();
  final _totalScoreController = TextEditingController(); // 총점 컨트롤러 추가
  final List<TextEditingController> _frameControllers = List.generate(
    10,
    (_) => TextEditingController(),
  );

  // 점수 데이터
  String? _selectedParticipantId;
  DateTime _scoreDate = DateTime.now();
  int _totalScore = 0;
  final _handicapController = TextEditingController(); // 핸디캡 컨트롤러

  @override
  void initState() {
    super.initState();

    // 수정 모드인 경우 기존 데이터 로드
    if (widget.score != null) {
      _notesController.text = widget.score!.notes ?? '';
      _selectedParticipantId = widget.score!.memberId;
      _scoreDate = widget.score!.date;
      _totalScoreController.text = widget.score!.totalScore.toString();
      _totalScore = widget.score!.totalScore;

      // 핸디캡 설정
      if (widget.score!.handicap != null) {
        _handicapController.text = widget.score!.handicap.toString();
      }

      // 프레임별 점수가 있는 경우 프레임별 입력 모드로 설정
      if (widget.score!.frames.isNotEmpty) {
        setState(() {
          _useFrameInput = true;
        });

        // 프레임별 점수 설정
        for (int i = 0; i < widget.score!.frames.length && i < 10; i++) {
          _frameControllers[i].text = widget.score!.frames[i].toString();
        }
      }
    } else if (widget.participants.isNotEmpty) {
      // 새 점수 추가 시 첫 번째 참가자 선택
      _selectedParticipantId = widget.participants.first.memberId;
    }
  }

  @override
  void dispose() {
    _notesController.dispose();
    _handicapController.dispose();
    _totalScoreController.dispose();
    for (var controller in _frameControllers) {
      controller.dispose();
    }
    super.dispose();
  }

  // 총점 계산 (프레임별 입력 모드에서만 사용)
  void _calculateTotalScore() {
    if (_useFrameInput) {
      int total = 0;
      for (var controller in _frameControllers) {
        if (controller.text.isNotEmpty) {
          total += int.tryParse(controller.text) ?? 0;
        }
      }

      setState(() {
        _totalScore = total;
        _totalScoreController.text = total.toString();
      });
    } else {
      setState(() {
        _totalScore = int.tryParse(_totalScoreController.text) ?? 0;
      });
    }
  }

  // 점수 저장
  Future<void> _saveScore() async {
    if (!_formKey.currentState!.validate()) {
      return;
    }

    setState(() {
      _isLoading = true;
    });

    try {
      final eventService = Provider.of<EventService>(context, listen: false);

      // 점수 데이터 준비
      final Map<String, dynamic> scoreData = {
        'eventId': widget.eventId,
        'memberId': _selectedParticipantId,
        'date': _scoreDate.toIso8601String(),
        'handicap': _handicapController.text.isEmpty
            ? null
            : int.parse(_handicapController.text),
        'notes': _notesController.text.trim().isEmpty
            ? null
            : _notesController.text.trim(),
      };

      // 프레임별 입력 모드인 경우
      if (_useFrameInput) {
        final frames = _frameControllers
            .map(
              (controller) =>
                  controller.text.isEmpty ? 0 : int.parse(controller.text),
            )
            .toList();
        scoreData['frames'] = frames;
        scoreData['totalScore'] = _totalScore;
      } else {
        // 총점 입력 모드인 경우
        scoreData['totalScore'] = int.tryParse(_totalScoreController.text) ?? 0;
        scoreData['frames'] = []; // 빈 프레임 배열 전송
      }

      if (widget.score == null) {
        // 새 점수 추가
        await eventService.addScore(widget.eventId, scoreData);
        if (mounted) {
          ScaffoldMessenger.of(
            context,
          ).showSnackBar(const SnackBar(content: Text('점수가 추가되었습니다')));
        }
      } else {
        // 기존 점수 수정
        await eventService.updateScore(
          widget.eventId,
          widget.score!.id,
          scoreData,
        );
        if (mounted) {
          ScaffoldMessenger.of(
            context,
          ).showSnackBar(const SnackBar(content: Text('점수가 수정되었습니다')));
        }
      }

      if (mounted) {
        Navigator.of(context).pop(true); // 성공 결과와 함께 이전 화면으로 돌아가기
      }
    } catch (e) {
      if (mounted) {
        setState(() {
          _isLoading = false;
        });

        ScaffoldMessenger.of(
          context,
        ).showSnackBar(SnackBar(content: Text('점수 저장에 실패했습니다: $e')));
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.score == null ? '점수 추가' : '점수 수정'),
        actions: [
          IconButton(icon: const Icon(Icons.save), onPressed: _saveScore),
        ],
      ),
      body: _isLoading
          ? const LoadingIndicator()
          : SingleChildScrollView(
              padding: const EdgeInsets.all(16.0),
              child: Form(
                key: _formKey,
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    // 기본 정보 섹션
                    _buildSectionTitle('기본 정보'),

                    // 참가자 선택
                    DropdownButtonFormField<String>(
                      key: const Key('score_form_participant_dropdown'),
                      value: _selectedParticipantId,
                      decoration: const InputDecoration(labelText: '참가자 *'),
                      isExpanded: true,
                      items: widget.participants.map((participant) {
                        return DropdownMenuItem(
                          value: participant.memberId,
                          child: Text(
                            participant.name ?? '이름 없음',
                            maxLines: 1,
                            overflow: TextOverflow.ellipsis,
                          ),
                        );
                      }).toList(),
                      onChanged: (value) {
                        setState(() {
                          _selectedParticipantId = value;
                        });
                      },
                      validator: (value) {
                        if (value == null || value.isEmpty) {
                          return '참가자를 선택해주세요';
                        }
                        return null;
                      },
                    ),
                    const SizedBox(height: 16),

                    // 날짜 선택
                    ListTile(
                      title: const Text('점수 기록 날짜 *'),
                      subtitle: Text(
                        DateFormat('yyyy년 MM월 dd일').format(_scoreDate),
                      ),
                      trailing: const Icon(Icons.calendar_today),
                      onTap: () async {
                        final date = await showDatePicker(
                          context: context,
                          initialDate: _scoreDate,
                          firstDate: DateTime(2020),
                          lastDate: DateTime(2030),
                        );

                        if (date != null && mounted) {
                          setState(() {
                            _scoreDate = date;
                          });
                        }
                      },
                    ),
                    const SizedBox(height: 24),

                    // 점수 입력 섹션
                    _buildSectionTitle('점수 입력'),

                    // 점수 입력 모드 전환 스위치
                    SwitchListTile(
                      title: const Text('프레임별 점수 입력'),
                      subtitle: const Text('각 프레임마다 점수를 개별적으로 입력합니다'),
                      value: _useFrameInput,
                      activeColor: Theme.of(context).primaryColor,
                      onChanged: (value) {
                        setState(() {
                          _useFrameInput = value;
                          if (!value) {
                            // 총점 입력 모드로 전환 시 현재 계산된 총점 유지
                            _totalScoreController.text = _totalScore.toString();
                          } else {
                            // 프레임별 입력 모드로 전환 시 총점 계산
                            _calculateTotalScore();
                          }
                        });
                      },
                    ),
                    const SizedBox(height: 16),

                    // 입력 모드에 따라 다른 UI 표시
                    _useFrameInput
                        ? Column(
                            children: [
                              // 프레임별 점수 입력
                              GridView.builder(
                                shrinkWrap: true,
                                physics: const NeverScrollableScrollPhysics(),
                                gridDelegate:
                                    const SliverGridDelegateWithFixedCrossAxisCount(
                                      crossAxisCount: 5,
                                      childAspectRatio: 1.5,
                                      crossAxisSpacing: 10,
                                      mainAxisSpacing: 10,
                                    ),
                                itemCount: 10,
                                itemBuilder: (context, index) {
                                  return _buildFrameInput(index);
                                },
                              ),
                              const SizedBox(height: 16),

                              // 계산된 총점 표시
                              Container(
                                padding: const EdgeInsets.all(16),
                                decoration: BoxDecoration(
                                  color: Colors.blue.shade50,
                                  borderRadius: BorderRadius.circular(8),
                                ),
                                child: Row(
                                  mainAxisAlignment:
                                      MainAxisAlignment.spaceBetween,
                                  children: [
                                    const Text(
                                      '계산된 총점:',
                                      style: TextStyle(
                                        fontSize: 18,
                                        fontWeight: FontWeight.bold,
                                      ),
                                    ),
                                    Text(
                                      _totalScore.toString(),
                                      style: const TextStyle(
                                        fontSize: 24,
                                        fontWeight: FontWeight.bold,
                                        color: Colors.blue,
                                      ),
                                    ),
                                  ],
                                ),
                              ),
                            ],
                          )
                        : TextFormField(
                            // 총점 직접 입력
                            controller: _totalScoreController,
                            keyboardType: TextInputType.number,
                            decoration: const InputDecoration(
                              labelText: '총점 *',
                              hintText: '게임 총점을 입력하세요',
                              prefixIcon: Icon(Icons.score),
                            ),
                            validator: (value) {
                              if (value == null || value.isEmpty) {
                                return '총점을 입력해주세요';
                              }
                              final score = int.tryParse(value);
                              if (score == null) {
                                return '숫자만 입력해주세요';
                              }
                              if (score < 0 || score > 300) {
                                return '0-300 사이의 값을 입력해주세요';
                              }
                              return null;
                            },
                            onChanged: (value) {
                              setState(() {
                                _totalScore = int.tryParse(value) ?? 0;
                              });
                            },
                          ),
                    const SizedBox(height: 16),

                    const SizedBox(height: 16),

                    // 핸디캡 입력
                    TextFormField(
                      controller: _handicapController,
                      keyboardType: TextInputType.number,
                      decoration: const InputDecoration(
                        labelText: '핸디캡',
                        hintText: '핸디캡 점수를 입력하세요',
                        prefixIcon: Icon(Icons.add_circle_outline),
                      ),
                      validator: (value) {
                        if (value != null && value.isNotEmpty) {
                          final handicap = int.tryParse(value);
                          if (handicap == null) {
                            return '숫자만 입력해주세요';
                          }
                          if (handicap < 0 || handicap > 200) {
                            return '0-200 사이의 값을 입력해주세요';
                          }
                        }
                        return null;
                      },
                    ),
                    // 핸디캡 포함 총점 표시
                    Padding(
                      padding: const EdgeInsets.symmetric(vertical: 8.0),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.end,
                        children: [
                          const Text(
                            '핸디캡 포함 총점: ',
                            style: TextStyle(fontWeight: FontWeight.bold),
                          ),
                          Text(
                            '${_totalScore + (int.tryParse(_handicapController.text) ?? 0)}',
                            style: const TextStyle(
                              fontWeight: FontWeight.bold,
                              color: Colors.green,
                            ),
                          ),
                        ],
                      ),
                    ),
                    const SizedBox(height: 24),

                    // 메모 섹션
                    _buildSectionTitle('추가 정보'),

                    // 메모
                    TextFormField(
                      controller: _notesController,
                      decoration: const InputDecoration(
                        labelText: '메모',
                        hintText: '점수에 대한 메모를 입력하세요',
                      ),
                      maxLines: 3,
                    ),
                    const SizedBox(height: 32),

                    // 저장 버튼
                    SizedBox(
                      width: double.infinity,
                      child: ElevatedButton(
                        onPressed: _saveScore,
                        style: ElevatedButton.styleFrom(
                          padding: const EdgeInsets.symmetric(vertical: 16),
                        ),
                        child: Text(
                          widget.score == null ? '점수 추가' : '점수 수정',
                          style: const TextStyle(fontSize: 16),
                        ),
                      ),
                    ),
                  ],
                ),
              ),
            ),
    );
  }

  // 프레임 입력 위젯
  Widget _buildFrameInput(int frameIndex) {
    return Column(
      children: [
        Text(
          '${frameIndex + 1}',
          style: const TextStyle(fontWeight: FontWeight.bold),
        ),
        Expanded(
          child: TextFormField(
            controller: _frameControllers[frameIndex],
            keyboardType: TextInputType.number,
            textAlign: TextAlign.center,
            decoration: InputDecoration(
              border: OutlineInputBorder(
                borderRadius: BorderRadius.circular(8),
              ),
              contentPadding: const EdgeInsets.symmetric(horizontal: 8),
            ),
            validator: (value) {
              if (value != null && value.isNotEmpty) {
                final score = int.tryParse(value);
                if (score == null) {
                  return '숫자만';
                }
                if (score < 0 || score > 300) {
                  return '0-300';
                }
              }
              return null;
            },
            onChanged: (_) => _calculateTotalScore(),
          ),
        ),
      ],
    );
  }

  // 섹션 제목 위젯
  Widget _buildSectionTitle(String title) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text(
          title,
          style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
        ),
        const Divider(),
        const SizedBox(height: 8),
      ],
    );
  }
}
