using LSFE.MobApp.Contracts; using LSFE.MobApp.Contracts.Doctor; using LSFE.MobApp.DTO.DoctorDto; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LSFE.MobApp.Services.Doctor { public class DoctorService : IDoctorService { private readonly IQueryService _queryService; private readonly Repository _doctorRepository; private readonly ILogger _logger; public DoctorService( IQueryService queryService, Repository doctorRepository, ILogger logger) { _queryService = queryService; _doctorRepository = doctorRepository; _logger = logger; } // Basic fetch using repository (simple queries) public async Task> GetAllDoctorsAsync() { return await _doctorRepository.GetAllAsync(); } public async Task> GetActiveDoctorsAsync() { return await _doctorRepository.GetActiveAsync(); } // Complex queries using IQueryService public async Task> GetDoctorsWithInstitutionsAsync() { try { var query = @" SELECT d.DoctorId, d.DoctorName, d.Specialization, d.InstitutionId, i.InstitutionName, d.IsActive, d.CreatedDate FROM Doctors d INNER JOIN Institutions i ON d.InstitutionId = i.InstitutionId WHERE d.IsActive = 1 AND i.IsActive = 1 ORDER BY i.InstitutionName, d.DoctorName"; return await _queryService.ExecuteQueryAsync(query); } catch (Exception ex) { _logger.LogError(ex, "Error fetching doctors with institutions"); throw; } } public async Task> GetDoctorsByInstitutionAsync(int institutionId) { try { var query = @" SELECT * FROM Doctors WHERE InstitutionId = ? AND IsActive = 1 ORDER BY DoctorName"; return await _queryService.ExecuteQueryAsync(query, institutionId); } catch (Exception ex) { _logger.LogError(ex, "Error fetching doctors by institution {InstitutionId}", institutionId); throw; } } public async Task> GetDoctorsBySpecializationAsync(string specialization) { try { var query = @" SELECT * FROM Doctors WHERE Specialization LIKE ? AND IsActive = 1 ORDER BY DoctorName"; return await _queryService.ExecuteQueryAsync(query, $"%{specialization}%"); } catch (Exception ex) { _logger.LogError(ex, "Error fetching doctors by specialization {Specialization}", specialization); throw; } } public async Task> GetDoctorsByTerritoryAsync(int territoryId) { try { var query = @" SELECT d.DoctorId, d.DoctorName, d.Specialization, d.InstitutionId, i.InstitutionName, d.IsActive, d.CreatedDate, t.TerritoryName FROM Doctors d INNER JOIN Institutions i ON d.InstitutionId = i.InstitutionId INNER JOIN Territories t ON i.TerritoryId = t.TerritoryId WHERE t.TerritoryId = ? AND d.IsActive = 1 AND i.IsActive = 1 ORDER BY i.InstitutionName, d.DoctorName"; return await _queryService.ExecuteQueryAsync(query, territoryId); } catch (Exception ex) { _logger.LogError(ex, "Error fetching doctors by territory {TerritoryId}", territoryId); throw; } } public async Task GetDoctorCountByInstitutionAsync(int institutionId) { try { var query = @" SELECT COUNT(*) as Count FROM Doctors WHERE InstitutionId = ? AND IsActive = 1"; var result = await _queryService.ExecuteQueryAsync(query, institutionId); return result.FirstOrDefault()?.Count ?? 0; } catch (Exception ex) { _logger.LogError(ex, "Error counting doctors by institution {InstitutionId}", institutionId); throw; } } // Helper class for count queries private class CountResult { public int Count { get; set; } } } }