import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:superport/models/warehouse_location_model.dart';
import 'package:superport/models/address_model.dart';
import 'package:superport/services/warehouse_service.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 managerNameController = TextEditingController();

  /// 담당자 연락처 입력 컨트롤러
  final TextEditingController managerPhoneController = TextEditingController();

  /// 수용량 입력 컨트롤러
  final TextEditingController capacityController = TextEditingController();

  /// 주소 입력 컨트롤러 (단일 필드)
  final TextEditingController addressController = TextEditingController();

  /// 백엔드 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);
    }
  }

  // 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;

  /// 기존 데이터 세팅 (수정 모드)
  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 ?? '';
        managerNameController.text = _originalLocation!.managerName ?? '';
        managerPhoneController.text = _originalLocation!.managerPhone ?? '';
        capacityController.text = _originalLocation!.capacity?.toString() ?? '';
      }
    } 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(),
        managerName: managerNameController.text.trim().isEmpty ? null : managerNameController.text.trim(),
        managerPhone: managerPhoneController.text.trim().isEmpty ? null : managerPhoneController.text.trim(),
        capacity: capacityController.text.trim().isEmpty ? null : int.tryParse(capacityController.text.trim()),
        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();
    managerNameController.clear();
    managerPhoneController.clear();
    capacityController.clear();
    _error = null;
    formKey.currentState?.reset();
    notifyListeners();
  }

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


  /// 수용량 유효성 검사
  String? validateCapacity(String? value) {
    if (value != null && value.isNotEmpty) {
      final capacity = int.tryParse(value);
      if (capacity == null) {
        return '올바른 숫자를 입력해주세요';
      }
      if (capacity < 0) {
        return '수용량은 0 이상이어야 합니다';
      }
    }
    return null;
  }

  /// 전화번호 유효성 검사
  String? validatePhoneNumber(String? value) {
    if (value != null && value.isNotEmpty) {
      // 기본적인 전화번호 형식 검사 (숫자, 하이픈 허용)
      if (!RegExp(r'^[0-9-]+$').hasMatch(value)) {
        return '올바른 전화번호 형식을 입력해주세요';
      }
    }
    return null;
  }

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