using skydiveLogs_api.Domain;
using skydiveLogs_api.DomainBusiness.Interfaces;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;

namespace skydiveLogs_api.DomainBusiness
{
    public class InitDbService : IInitDbService
    {
        #region Public Constructors

        public InitDbService(IAircraftService aircraftService,
                             IJumpTypeService jumpTypeService,
                             IDropZoneService dropZoneService,
                             IUserService userService)
        {
            _aircraftService = aircraftService;
            _jumpTypeService = jumpTypeService;
            _dropZoneService = dropZoneService;
            _userService = userService;
        }

        #endregion Public Constructors

        #region Public Methods

        public void GenerateDb()
        {
            LoadAircrafts();
            LoadDropZones();
            LoadJumpTypes();
            AddAdmin();
        }

        #endregion Public Methods

        #region Private Methods

        private void AddAdmin()
        {
            var adminUser = new User
            {
                FirstName = "Admin",
                LastName = "Admin",
                Login = "administrator",
                Password = "logsadmin",
                Email = "admin@nomail.com"
            };
            _userService.AddNewUser(adminUser, true);
        }

        private void LoadAircrafts()
        {
            var jsonString = File.ReadAllText("Init/aircraft.json");
            var options = new JsonSerializerOptions
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                WriteIndented = true
            };
            var jsonModel = JsonSerializer.Deserialize<List<Aircraft>>(jsonString, options);

            foreach (var item in jsonModel)
            {
                _aircraftService.AddNewAircraft(item);
            }
        }

        private void LoadDropZones()
        {
            var jsonString = File.ReadAllText("Init/dropZone.json");
            var options = new JsonSerializerOptions
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                WriteIndented = true
            };
            var jsonModel = JsonSerializer.Deserialize<List<DropZone>>(jsonString, options);

            foreach (var item in jsonModel)
            {
                _dropZoneService.AddNewDz(item);
            }
        }

        private void LoadJumpTypes()
        {
            var jsonString = File.ReadAllText("Init/jumpType.json");
            var options = new JsonSerializerOptions
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                WriteIndented = true
            };
            var jsonModel = JsonSerializer.Deserialize<List<JumpType>>(jsonString, options);

            foreach (var item in jsonModel)
            {
                _jumpTypeService.AddNewJumpType(item);
            }
        }

        #endregion Private Methods

        #region Private Fields

        private readonly IAircraftService _aircraftService;

        private readonly IDropZoneService _dropZoneService;
        private readonly IJumpTypeService _jumpTypeService;
        private readonly IUserService _userService;

        #endregion Private Fields
    }
}