import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:superport/models/warehouse_location_model.dart';
import 'package:superport/services/warehouse_service.dart';
import 'package:superport/data/models/zipcode_dto.dart';

/// 입고지 폼 상태 및 저장/수정 로직을 담당하는 컨트롤러
class WarehouseLocationFormController extends ChangeNotifier {
  late final WarehouseService _warehouseService;
  
  /// 폼 키
  final GlobalKey<FormState> formKey = GlobalKey<FormState>();

  /// 입고지명 입력 컨트롤러
  final TextEditingController nameController = TextEditingController();

  /// 비고 입력 컨트롤러
  final TextEditingController remarkController = TextEditingController();


  /// 주소 입력 컨트롤러 (단일 필드)
  final TextEditingController addressController = TextEditingController();
  
  /// 우편번호 입력 컨트롤러
  final TextEditingController zipcodeController = TextEditingController();
  
  /// 선택된 우편번호 정보
  ZipcodeDto? _selectedZipcode;
  
  /// 우편번호 검색 로딩 상태
  bool _isSearchingZipcode = false;

  /// 백엔드 API에 맞는 단순 필드들 (주소는 단일 String)

  /// 저장 중 여부
  bool _isSaving = false;

  /// 수정 모드 여부
  bool _isEditMode = false;

  /// 입고지 id (수정 모드)
  int? _id;

  /// 로딩 상태
  bool _isLoading = false;

  /// 에러 메시지
  String? _error;

  /// 원본 창고 위치 (수정 모드)
  WarehouseLocation? _originalLocation;

  WarehouseLocationFormController({
    int? locationId,
  }) {
    if (GetIt.instance.isRegistered<WarehouseService>()) {
      _warehouseService = GetIt.instance<WarehouseService>();
    } else {
      throw Exception('WarehouseService not registered in GetIt');
    }
    
    if (locationId != null) {
      initialize(locationId);
    }
  }
  
  // 사전 로드된 데이터로 초기화하는 생성자
  WarehouseLocationFormController.withPreloadedData({
    required Map<String, dynamic> preloadedData,
  }) {
    if (GetIt.instance.isRegistered<WarehouseService>()) {
      _warehouseService = GetIt.instance<WarehouseService>();
    } else {
      throw Exception('WarehouseService not registered in GetIt');
    }
    
    // 전달받은 데이터로 즉시 초기화
    _id = preloadedData['locationId'] as int?;
    _isEditMode = _id != null;
    _originalLocation = preloadedData['location'] as WarehouseLocation?;
    
    if (_originalLocation != null) {
      nameController.text = _originalLocation!.name;
      addressController.text = _originalLocation!.address ?? '';
      remarkController.text = _originalLocation!.remark ?? '';
      // zipcodes_zipcode가 있으면 표시
      if (_originalLocation!.zipcode != null) {
        zipcodeController.text = _originalLocation!.zipcode!;
      }
    }
    
    _isLoading = false;
    _error = null;
  }

  // Getters
  bool get isSaving => _isSaving;
  bool get isEditMode => _isEditMode;
  int? get id => _id;
  bool get isLoading => _isLoading;
  String? get error => _error;
  WarehouseLocation? get originalLocation => _originalLocation;
  ZipcodeDto? get selectedZipcode => _selectedZipcode;
  bool get isSearchingZipcode => _isSearchingZipcode;

  /// 기존 데이터 세팅 (수정 모드)
  Future<void> initialize(int locationId) async {
    _id = locationId;
    _isEditMode = true;
    _isLoading = true;
    _error = null;
    notifyListeners();

    try {
      _originalLocation = await _warehouseService.getWarehouseLocationById(locationId);

      if (_originalLocation != null) {
        nameController.text = _originalLocation!.name;
        addressController.text = _originalLocation!.address ?? '';
        remarkController.text = _originalLocation!.remark ?? '';
        // zipcodes_zipcode가 있으면 표시
        if (_originalLocation!.zipcode != null) {
          zipcodeController.text = _originalLocation!.zipcode!;
        }
      }
    } catch (e) {
      _error = e.toString();
    } finally {
      _isLoading = false;
      notifyListeners();
    }
  }


  /// 저장 처리 (추가/수정)
  Future<bool> save() async {
    if (!formKey.currentState!.validate()) return false;
    
    _isSaving = true;
    _error = null;
    notifyListeners();

    try {
      final location = WarehouseLocation(
        id: _isEditMode ? _id! : 0,
        name: nameController.text.trim(),
        address: addressController.text.trim().isEmpty ? null : addressController.text.trim(),
        remark: remarkController.text.trim().isEmpty ? null : remarkController.text.trim(),
        zipcode: zipcodeController.text.trim().isEmpty ? null : zipcodeController.text.trim(), // zipcodes_zipcode 추가
        managerName: null, // 백엔드에서 지원하지 않음
        managerPhone: null, // 백엔드에서 지원하지 않음
        capacity: null, // 백엔드에서 지원하지 않음
        isActive: true, // 새로 생성 시 항상 활성화
        createdAt: DateTime.now(),
      );

      if (_isEditMode) {
        await _warehouseService.updateWarehouseLocation(location);
      } else {
        await _warehouseService.createWarehouseLocation(location);
      }

      return true;
    } catch (e) {
      _error = e.toString();
      notifyListeners();
      return false;
    } finally {
      _isSaving = false;
      notifyListeners();
    }
  }

  /// 폼 초기화
  void resetForm() {
    nameController.clear();
    addressController.clear();
    remarkController.clear();
    zipcodeController.clear();
    _selectedZipcode = null;
    _error = null;
    formKey.currentState?.reset();
    notifyListeners();
  }
  
  /// 우편번호 선택
  void selectZipcode(ZipcodeDto zipcode) {
    _selectedZipcode = zipcode;
    zipcodeController.text = zipcode.zipcode;
    // 주소를 자동으로 채움
    addressController.text = '${zipcode.sido} ${zipcode.gu} ${zipcode.etc ?? ''}'.trim();
    notifyListeners();
  }
  
  /// 우편번호 검색 상태 변경
  void setSearchingZipcode(bool searching) {
    _isSearchingZipcode = searching;
    notifyListeners();
  }

  /// 유효성 검사
  String? validateName(String? value) {
    if (value == null || value.isEmpty) {
      return '입고지명을 입력해주세요';
    }
    if (value.length < 2) {
      return '입고지명은 2자 이상이어야 합니다';
    }
    return null;
  }

  /// 창고명 중복 확인
  Future<bool> checkDuplicateName(String name, {int? excludeId}) async {
    try {
      // 전체 창고 목록 조회
      final response = await _warehouseService.getWarehouseLocations(
        perPage: 100, // 충분한 수의 창고 조회
        includeInactive: false,
      );
      
      // 중복 검사
      final duplicates = response.items.where((warehouse) {
        // 수정 모드일 때 자기 자신은 제외
        if (excludeId != null && warehouse.id == excludeId) {
          return false;
        }
        // 대소문자 구분 없이 이름 비교
        return warehouse.name.toLowerCase() == name.toLowerCase();
      }).toList();
      
      return duplicates.isNotEmpty;
    } catch (e) {
      // 에러 발생 시 false 반환 (중복 없음으로 처리)
      return false;
    }
  }



  /// 컨트롤러 해제
  @override
  void dispose() {
    nameController.dispose();
    addressController.dispose();
    remarkController.dispose();
    super.dispose();
  }
}
