import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:superport/models/user_model.dart';
import 'package:superport/models/company_model.dart';
import 'package:superport/services/mock_data_service.dart';
import 'package:superport/services/user_service.dart';

/// 담당자 목록 화면의 상태 및 비즈니스 로직을 담당하는 컨트롤러
class UserListController extends ChangeNotifier {
  final MockDataService dataService;
  final UserService _userService = GetIt.instance<UserService>();
  
  // 상태 변수
  List<User> _users = [];
  bool _isLoading = false;
  String? _error;
  bool _useApi = true; // Feature flag
  
  // 페이지네이션
  int _currentPage = 1;
  final int _perPage = 20;
  bool _hasMoreData = true;
  bool _isLoadingMore = false;
  
  // 검색/필터
  String _searchQuery = '';
  int? _filterCompanyId;
  String? _filterRole;
  bool? _filterIsActive;
  
  // Getters
  List<User> get users => _users;
  bool get isLoading => _isLoading;
  bool get isLoadingMore => _isLoadingMore;
  String? get error => _error;
  bool get hasMoreData => _hasMoreData;
  String get searchQuery => _searchQuery;
  int? get filterCompanyId => _filterCompanyId;
  String? get filterRole => _filterRole;
  bool? get filterIsActive => _filterIsActive;

  UserListController({required this.dataService});

  /// 사용자 목록 초기 로드
  Future<void> loadUsers({bool refresh = false}) async {
    if (refresh) {
      _currentPage = 1;
      _hasMoreData = true;
      _users.clear();
    }
    
    if (_isLoading) return;
    
    _isLoading = true;
    _error = null;
    notifyListeners();
    
    try {
      if (_useApi) {
        final newUsers = await _userService.getUsers(
          page: _currentPage,
          perPage: _perPage,
          isActive: _filterIsActive,
          companyId: _filterCompanyId,
          role: _filterRole,
        );
        
        if (newUsers.isEmpty || newUsers.length < _perPage) {
          _hasMoreData = false;
        }
        
        if (_currentPage == 1) {
          _users = newUsers;
        } else {
          _users.addAll(newUsers);
        }
        
        _currentPage++;
      } else {
        // Mock 데이터 사용
        var allUsers = dataService.getAllUsers();
        
        // 필터 적용
        if (_filterCompanyId != null) {
          allUsers = allUsers.where((u) => u.companyId == _filterCompanyId).toList();
        }
        if (_filterRole != null) {
          allUsers = allUsers.where((u) => u.role == _filterRole).toList();
        }
        if (_filterIsActive != null) {
          allUsers = allUsers.where((u) => u.isActive == _filterIsActive).toList();
        }
        
        // 검색 적용
        if (_searchQuery.isNotEmpty) {
          allUsers = allUsers.where((u) => 
            u.name.toLowerCase().contains(_searchQuery.toLowerCase()) ||
            (u.email?.toLowerCase().contains(_searchQuery.toLowerCase()) ?? false) ||
            (u.username?.toLowerCase().contains(_searchQuery.toLowerCase()) ?? false)
          ).toList();
        }
        
        _users = allUsers;
        _hasMoreData = false;
      }
    } catch (e) {
      _error = e.toString();
    } finally {
      _isLoading = false;
      notifyListeners();
    }
  }

  /// 다음 페이지 로드 (무한 스크롤용)
  Future<void> loadMore() async {
    if (!_hasMoreData || _isLoadingMore || _isLoading) return;
    
    _isLoadingMore = true;
    notifyListeners();
    
    try {
      await loadUsers();
    } finally {
      _isLoadingMore = false;
      notifyListeners();
    }
  }

  /// 검색 쿼리 설정
  void setSearchQuery(String query) {
    _searchQuery = query;
    _currentPage = 1;
    _hasMoreData = true;
    loadUsers(refresh: true);
  }

  /// 필터 설정
  void setFilters({
    int? companyId,
    String? role,
    bool? isActive,
  }) {
    _filterCompanyId = companyId;
    _filterRole = role;
    _filterIsActive = isActive;
    _currentPage = 1;
    _hasMoreData = true;
    loadUsers(refresh: true);
  }

  /// 필터 초기화
  void clearFilters() {
    _filterCompanyId = null;
    _filterRole = null;
    _filterIsActive = null;
    _searchQuery = '';
    _currentPage = 1;
    _hasMoreData = true;
    loadUsers(refresh: true);
  }

  /// 사용자 삭제
  Future<void> deleteUser(int id, VoidCallback onDeleted, Function(String) onError) async {
    try {
      if (_useApi) {
        await _userService.deleteUser(id);
      } else {
        dataService.deleteUser(id);
      }
      
      // 목록에서 삭제된 사용자 제거
      _users.removeWhere((user) => user.id == id);
      notifyListeners();
      
      onDeleted();
    } catch (e) {
      onError('사용자 삭제 실패: ${e.toString()}');
    }
  }

  /// 사용자 상태 변경 (활성/비활성)
  Future<void> changeUserStatus(int id, bool isActive, Function(String) onError) async {
    try {
      if (_useApi) {
        final updatedUser = await _userService.changeUserStatus(id, isActive);
        // 목록에서 해당 사용자 업데이트
        final index = _users.indexWhere((u) => u.id == id);
        if (index != -1) {
          _users[index] = updatedUser;
          notifyListeners();
        }
      } else {
        // Mock 데이터에서는 상태 변경 지원 안함
        onError('Mock 데이터에서는 상태 변경을 지원하지 않습니다');
      }
    } catch (e) {
      onError('상태 변경 실패: ${e.toString()}');
    }
  }

  /// 권한명 반환 함수는 user_utils.dart의 getRoleName을 사용

  /// 회사 ID와 지점 ID로 지점명 조회
  String getBranchName(int companyId, int? branchId) {
    final company = dataService.getCompanyById(companyId);
    if (company == null || company.branches == null || branchId == null) {
      return '-';
    }
    final branch = company.branches!.firstWhere(
      (b) => b.id == branchId,
      orElse: () => Branch(companyId: companyId, name: '-'),
    );
    return branch.name;
  }
  
  /// API/Mock 모드 전환
  void toggleApiMode() {
    _useApi = !_useApi;
    loadUsers(refresh: true);
  }
}
