import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:intl/intl.dart';
import 'package:superport/models/equipment_unified_model.dart';
import 'package:superport/models/company_model.dart';
import 'package:superport/models/company_branch_info.dart';
import 'package:superport/services/equipment_service.dart';
import 'package:superport/screens/equipment/controllers/equipment_history_controller.dart';
import 'package:superport/services/company_service.dart';
import 'package:superport/data/models/equipment_history_dto.dart';

/// 장비 출고 폼 컨트롤러
///
/// 폼의 전체 상태, 유효성, 저장, 데이터 로딩 등 비즈니스 로직을 담당한다.
class EquipmentOutFormController extends ChangeNotifier {
  // final EquipmentService _equipmentService = GetIt.instance<EquipmentService>(); // 사용되지 않음 - 제거
  final CompanyService _companyService = GetIt.instance<CompanyService>();
  int? equipmentOutId;
  
  // 편집 모드 여부
  bool isEditMode = false;
  
  // 상태 관리
  final bool _isLoading = false;
  String? _errorMessage;
  
  // Getters
  bool get isLoading => _isLoading;
  String? get errorMessage => _errorMessage;
  
  // 폼 키
  final GlobalKey<FormState> formKey = GlobalKey<FormState>();
  
  // 선택된 장비 정보
  Equipment? selectedEquipment;
  int? selectedEquipmentInId;
  List<Map<String, dynamic>>? selectedEquipments;
  
  // 출고처 정보
  List<String?> selectedCompanies = [null];
  List<bool> hasManagersPerCompany = [false];
  List<List<String>> filteredManagersPerCompany = [[]];
  List<String?> selectedManagersPerCompany = [null];
  
  // 라이선스 정보
  String? selectedLicense;
  
  // 출고 타입
  String outType = 'O'; // 기본값: 출고
  
  // 드롭다운 데이터
  List<CompanyBranchInfo> companies = [];
  List<String> licenses = [];
  
  // 날짜
  DateTime outDate = DateTime.now();
  
  // 회사 정보 (지점 포함)
  List<CompanyBranchInfo> get companiesWithBranches => companies;
  
  // 비고
  final TextEditingController remarkController = TextEditingController();
  
  EquipmentOutFormController({
    this.equipmentOutId,
  }) {
    isEditMode = equipmentOutId != null;
  }
  
  // 이용 가능한 회사 목록 (선택된 회사 제외)
  List<List<CompanyBranchInfo>> get availableCompaniesPerDropdown {
    return List.generate(selectedCompanies.length, (index) {
      final selectedBefore = selectedCompanies.sublist(0, index).whereType<String>().toSet();
      return companies.where((company) => !selectedBefore.contains(company.name)).toList();
    });
  }
  
  // 드롭다운 데이터 로드
  Future<void> loadDropdownData() async {
    try {
      // API를 통해 회사 목록 로드
      final response = await _companyService.getCompanies();
      companies = response.items
          .where((c) => c.companyTypes.contains(CompanyType.customer))
          .map((c) => CompanyBranchInfo(
                id: c.id,
                name: c.name,
                originalName: c.name,
                isMainCompany: true,
                companyId: c.id,
              branchId: null,
            ))
        .toList();
      
      // TODO: 라이선스 목록도 API로 로드
      licenses = []; // 임시로 빈 목록
      
      notifyListeners();
    } catch (e) {
      debugPrint('드롭다운 데이터 로드 실패: $e');
      companies = [];
      licenses = [];
      notifyListeners();
    }
  }
  
  // 선택된 장비로 초기화
  void initializeWithSelectedEquipment(Equipment equipment) {
    selectedEquipment = equipment;
    notifyListeners();
  }
  
  // 회사 선택 시 담당자 목록 필터링
  void filterManagersForCompany(int index) {
    if (index >= selectedCompanies.length || selectedCompanies[index] == null) {
      hasManagersPerCompany[index] = false;
      filteredManagersPerCompany[index] = [];
      return;
    }
    
    // TODO: API를 통해 회사별 담당자 목록 로드
    // 현재는 임시로 빈 목록 사용
    hasManagersPerCompany[index] = false;
    filteredManagersPerCompany[index] = [];
    
    notifyListeners();
  }
  
  // 인덱스별 담당자 필터링
  void filterManagersByCompanyAtIndex(int index) {
    filterManagersForCompany(index);
  }
  
  // 회사 추가
  void addCompany() {
    selectedCompanies.add(null);
    hasManagersPerCompany.add(false);
    filteredManagersPerCompany.add([]);
    selectedManagersPerCompany.add(null);
    notifyListeners();
  }
  
  // 회사 제거
  void removeCompany(int index) {
    if (selectedCompanies.length > 1) {
      selectedCompanies.removeAt(index);
      hasManagersPerCompany.removeAt(index);
      filteredManagersPerCompany.removeAt(index);
      selectedManagersPerCompany.removeAt(index);
      notifyListeners();
    }
  }
  
  // 회사 선택 초기화
  void resetCompanySelection() {
    selectedCompanies = [null];
    hasManagersPerCompany = [false];
    filteredManagersPerCompany = [[]];
    selectedManagersPerCompany = [null];
    notifyListeners();
  }
  
  // 에러 초기화
  void clearError() {
    _errorMessage = null;
    notifyListeners();
  }
  
  // 이용 가능한 회사 목록 업데이트
  void updateAvailableCompanies() {
    notifyListeners();
  }
  
  // 날짜 포맷팅
  String formatDate(DateTime date) {
    return DateFormat('yyyy-MM-dd').format(date);
  }
  
  // 출고 정보 저장
  Future<bool> saveEquipmentOut(BuildContext context, {String? note}) async {
    // 유효성 검사
    if (selectedCompanies.isEmpty || selectedCompanies[0] == null) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('출고처를 선택해주세요.')),
      );
      return false;
    }
    
    if (selectedEquipment == null && (selectedEquipments == null || selectedEquipments!.isEmpty)) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('출고할 장비를 선택해주세요.')),
      );
      return false;
    }
    
    try {
      // API를 통한 출고 처리
      final equipmentService = GetIt.instance<EquipmentService>();
      final companyService = GetIt.instance<CompanyService>();
      
      // 회사 ID 가져오기
      int? companyId;
      int? branchId;
      
      // 선택된 회사 정보에서 ID 추출
      if (selectedCompanies[0] != null) {
        final response = await companyService.getCompanies(search: selectedCompanies[0]);
        if (response.items.isNotEmpty) {
          companyId = response.items.first.id;
          // TODO: 지점 ID 처리 로직 추가
        }
      }
      
      if (companyId == null) {
        throw Exception('출고처 정보를 찾을 수 없습니다.');
      }
      
      if (isEditMode) {
        // 수정 모드 - 현재 미구현
        throw UnimplementedError('출고 수정 기능은 아직 구현되지 않았습니다.');
      } else {
        // 생성 모드
        if (selectedEquipments != null && selectedEquipments!.isNotEmpty) {
          // 다중 장비 출고 (새로운 EquipmentHistoryController 사용)
          final historyController = EquipmentHistoryController();
          
          for (var equipmentData in selectedEquipments!) {
            final equipment = equipmentData['equipment'] as Equipment;
            if (equipment.id != null) {
              final historyRequest = EquipmentHistoryRequestDto(
                equipmentsId: equipment.id!,
                warehousesId: 1, // 기본 창고 ID (실제로는 사용자 선택 필요)
                transactionType: 'OUT',
                quantity: equipment.quantity,
                remark: note ?? remarkController.text,
              );
              await historyController.createHistory(historyRequest);
            }
          }
        } else if (selectedEquipment != null && selectedEquipment!.id != null) {
          // 단일 장비 출고 (새로운 EquipmentHistoryController 사용)
          final historyController = EquipmentHistoryController();
          
          final historyRequest = EquipmentHistoryRequestDto(
            equipmentsId: selectedEquipment!.id!,
            warehousesId: 1, // 기본 창고 ID (실제로는 사용자 선택 필요)
            transactionType: 'OUT',
            quantity: selectedEquipment!.quantity,
            remark: note ?? remarkController.text,
          );
          await historyController.createHistory(historyRequest);
        }
      }
      
      return true;
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('저장 중 오류가 발생했습니다: $e')),
      );
      return false;
    }
  }
  
  @override
  void dispose() {
    remarkController.dispose();
    super.dispose();
  }
}