using Brizco.Domain.Entities.Users;

namespace Brizco.Core.EntityServices;

public class ComplexService : IComplexService
{
    private readonly ISender _sender;
    private readonly RoleManager<ApplicationRole> _roleManager;

    public ComplexService(ISender sender,RoleManager<ApplicationRole> roleManager)
    {
        _sender = sender;
        _roleManager = roleManager;
    }
    public async Task<ComplexSDto> CreateComplexAsync(string complexName,
        string complexAddress,
        string complexSuppPhone,
        Guid managerUserId,
        CancellationToken cancellationToken)
    {

        var complex = await _sender.Send(new CreateComplexCommand(complexName,
            complexAddress,
            complexSuppPhone));

        var managerRole = new ApplicationRole
        {
            ComplexId = complex.Id,
            EnglishName = ApplicationRoles.Manager,
            PersianName = "مدیریت",
            Description = "مدیریت مجموعه",
            Name = $"{ApplicationRoles.Manager}_{complex.Id.ToString()}"
        };
        var createRoleResult = await _roleManager.CreateAsync(managerRole);
        if (!createRoleResult.Succeeded)
            throw new AppException(string.Join('|', createRoleResult.Errors));

        foreach (var claim in ApplicationClaims.ManagerClaims)
            await _roleManager.AddClaimAsync(managerRole, claim);



        var viewOwnerRole = new ApplicationRole
        {
            ComplexId = complex.Id,
            EnglishName = ApplicationRoles.ViewerOwner,
            PersianName = "ناظر",
            Description = "ناظر مجموعه",
            Name = $"{ApplicationRoles.ViewerOwner}_{complex.Id.ToString()}"
        };
        var createViewerResult = await _roleManager.CreateAsync(viewOwnerRole);
        if (!createViewerResult.Succeeded)
            throw new AppException(string.Join('|', createViewerResult.Errors));

        foreach (var claim in ApplicationClaims.ViewerOwnerClaims)
            await _roleManager.AddClaimAsync(viewOwnerRole, claim);

        var superVisorRole = new ApplicationRole
        {
            ComplexId = complex.Id,
            EnglishName = ApplicationRoles.SuperVisor,
            PersianName = "سوپروایزر",
            Description = "انجام فعالیت مدیریت کارکنان و وظیفه ها",
            Name = $"{ApplicationRoles.SuperVisor}_{complex.Id.ToString()}"
        };
        var superVisorRoleResult = await _roleManager.CreateAsync(superVisorRole);
        if (!superVisorRoleResult.Succeeded)
            throw new AppException(string.Join('|', superVisorRoleResult.Errors));

        foreach (var claim in ApplicationClaims.SuperVisorClaims)
            await _roleManager.AddClaimAsync(superVisorRole, claim);


        var staffRole = new ApplicationRole
        {
            ComplexId = complex.Id,
            EnglishName = ApplicationRoles.Staff,
            PersianName = "کارمند",
            Description = "انجام فعالیت ها و وظیفه ها",
            Name = $"{ApplicationRoles.Staff}_{complex.Id.ToString()}"
        };
        var staffRoleResult = await _roleManager.CreateAsync(staffRole);
        if (!staffRoleResult.Succeeded)
            throw new AppException(string.Join('|', staffRoleResult.Errors));

        foreach (var claim in ApplicationClaims.StaffClaims)
            await _roleManager.AddClaimAsync(staffRole, claim);


        var complexUser = await _sender.Send(new CreateComplexUserCommand(complex.Id, managerUserId, new List<Guid>{ managerRole.Id }), cancellationToken);

        return complex;
    }
}