import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';
import '../../plugins/utils.dart';
import '../../plugins/api.dart';
import '../../dialogs/response_dialog.dart';
import '../login/login_page.dart'; // 로그인 페이지 임포트

class WithdrawalPage extends StatefulWidget {
  const WithdrawalPage({Key? key}) : super(key: key);

  @override
  _WithdrawalPageState createState() => _WithdrawalPageState();
}

class _WithdrawalPageState extends State<WithdrawalPage> {
  bool _isAgreed = false; // 체크박스 상태
  final TextEditingController _passwordController = TextEditingController(); // 비밀번호 입력 컨트롤러
  String _oauthType = 'idpw'; // 로그인 방식

  @override
  void initState() {
    super.initState();
    _loadOAuthType(); // SharedPreferences에서 oauth_type 불러오기
  }

  /// SharedPreferences에서 oauth_type 불러오기
  Future<void> _loadOAuthType() async {
    final prefs = await SharedPreferences.getInstance();
    setState(() {
      _oauthType = prefs.getString('oauth_type') ?? 'idpw';
    });
  }

  @override
  Widget build(BuildContext context) {
    // 화면 가로 길이 가져오기
    final screenWidth = MediaQuery.of(context).size.width;

    // oauth_type == 'google'인 경우 비밀번호 입력 무시
    final isGoogleUser = (_oauthType.toLowerCase() == 'google');

    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: const Text(
          'Withdrawal', // '회원탈퇴'
          style: TextStyle(color: Colors.black),
        ),
        backgroundColor: Colors.transparent,
        leading: IconButton(
          icon: const Icon(Icons.arrow_back_ios, color: Colors.black),
          onPressed: () => Navigator.pop(context),
        ),
      ),
      // 작은 화면에서도 스크롤 가능하도록 SingleChildScrollView 사용
      body: SingleChildScrollView(
        child: Padding(
          padding: const EdgeInsets.all(16.0),
          // Column이 화면을 넘어가면 스크롤되도록
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              const SizedBox(height: 20),
              const Center(
                child: Text(
                  'We will proceed with account withdrawal.\nPlease enter your current password.', 
                  // '회원탈퇴를 진행합니다.\n현재 비밀번호를 입력해주세요.'
                  textAlign: TextAlign.center,
                  style: TextStyle(fontSize: 18),
                ),
              ),
              const SizedBox(height: 20),

              // 구글 로그인 사용자는 비밀번호 입력란 생략
              if (!isGoogleUser) ...[
                TextField(
                  controller: _passwordController,
                  obscureText: true,
                  decoration: InputDecoration(
                    hintText: 'Enter password', // '비밀번호 입력'
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(10),
                      borderSide: const BorderSide(color: Colors.black),
                    ),
                    contentPadding: const EdgeInsets.all(10),
                  ),
                ),
                const SizedBox(height: 20),
              ],

              Container(
                decoration: BoxDecoration(
                  border: Border.all(color: Colors.black54, width: 1),
                  borderRadius: BorderRadius.circular(10),
                ),
                padding: const EdgeInsets.all(16.0),
                child: const Text(
                  '[Withdrawal Guide]\n' // '[회원 탈퇴 안내]'
                  'Do you really want to withdraw?\n' // '회원 탈퇴를 진행하시겠습니까?'
                  ' - All personal information (ID, password, nickname, email, affiliation, self-introduction, etc.) you have registered will be deleted immediately and cannot be recovered.\n' 
                  // ' - 회원 탈퇴 시 등록하신 모든 개인정보(...)는 즉시 삭제되며 복구가 불가능합니다.'
                  ' - You may not be able to re-register with the same ID after withdrawal.\n'
                  // ' - 탈퇴 후 동일한 아이디로 재가입이 불가능할 수 있습니다.'
                  ' - In accordance with relevant laws, if certain data must be retained for a specified period, it will be stored within the scope permitted by the law for that period only.\n'
                  // ' - 관련 법령에 따라 일정 기간 보관이 필요한 경우 해당 기간 동안 법령이 허용하는 범위 내에서만 보관됩니다.'
                  'If you wish to withdraw, please check "Agree" below.', 
                  // '탈퇴를 원하시면 아래의 "동의" 버튼을 눌러주시기 바랍니다.'
                  textAlign: TextAlign.left,
                  style: TextStyle(fontSize: 12),
                ),
              ),
              const SizedBox(height: 20),

              Row(
                children: [
                  Checkbox(
                    value: _isAgreed,
                    activeColor: Colors.black,
                    checkColor: Colors.white,
                    onChanged: (value) {
                      setState(() {
                        _isAgreed = value ?? false;
                      });
                    },
                  ),
                  const Expanded(
                    child: Text(
                      'I agree to the withdrawal.', // '회원탈퇴에 동의합니다.'
                      style: TextStyle(fontSize: 16),
                    ),
                  ),
                ],
              ),
              const SizedBox(height: 20),

              // "탈퇴하기" 버튼
              Center(
                child: ElevatedButton(
                  onPressed: () {
                    _requestWithdrawal(_passwordController.text, _isAgreed);
                  },
                  style: ElevatedButton.styleFrom(
                    backgroundColor: Colors.black54,
                    // 화면 너비에 따라 버튼의 좌우 패딩 동적 조정
                    padding: EdgeInsets.symmetric(
                      vertical: 12,
                      horizontal: screenWidth * 0.15,
                    ),
                  ),
                  child: const Text(
                    'Withdraw', // '탈퇴하기'
                    style: TextStyle(color: Colors.white, fontSize: 16),
                  ),
                ),
              ),
              const SizedBox(height: 20),
            ],
          ),
        ),
      ),
    );
  }

  Future<void> _requestWithdrawal(String password, bool isAgreed) async {
    if (!isAgreed) {
      showResponseDialog(
        context, 
        'Withdrawal Agreement Required', // '회원탈퇴 동의 확인'
        'You must agree to withdraw.' // '회원탈퇴 동의 체크가 필요합니다.'
      );
      return;
    }

    // 구글 로그인 사용자가 아닌데 비밀번호를 입력 안 했다면
    if (_oauthType != 'google' && password.isEmpty) {
      showResponseDialog(
        context, 
        'Password Required', // '비밀번호 확인'
        'Please enter your password.' // '비밀번호를 입력해야 합니다.'
      );
      return;
    }

    // 구글 로그인 사용자는 비밀번호가 비어있어도 ''로 진행
    if (password.isEmpty) {
      password = '';
    }

    final response = await Api.serverRequest(
      uri: '/user/withdraw/user',
      body: {
        'user_pw': Utils.hashPassword(password),
        'oauth_type': _oauthType,
      },
    );

    if (response['result'] == 'OK') {
      final serverResponse = response['response'];
      if (serverResponse['result'] == 'OK') {
        // 회원탈퇴 완료 시 토큰 제거 & 로그인 페이지로 이동
        SharedPreferences prefs = await SharedPreferences.getInstance();
        await prefs.remove('auth_token');
        await showResponseDialog(
          context, 
          'Withdrawal Completed', // '회원탈퇴 완료'
          'Your account has been successfully withdrawn.' // '회원탈퇴가 완료되었습니다.'
        );
        Navigator.pushReplacement(
          context,
          MaterialPageRoute(builder: (context) => const LoginPage()),
        );
      } else {
        showResponseDialog(
          context,
          serverResponse['response_info']['msg_title'],
          serverResponse['response_info']['msg_content'],
        );
      }
    } else {
      showResponseDialog(
        context, 
        'Withdrawal Failed', // '회원탈퇴 실패'
        'There is a problem with the server. Please contact the administrator.' 
        // '서버에 문제가 있습니다. 관리자에게 문의해주세요.'
      );
    }
  }
}
