import {Component, Input, OnInit} from '@angular/core';
import {ComprobanteRetencionDto} from "../../model/ComprobanteRetencionDto";
import {ResponseGenerico} from "../../../../../_dto/response-generico";
import {FormBuilder, FormControl, FormGroup, Validators} from "@angular/forms";
import {ClienteDto} from "../../model/ClienteDto";
import {AppService} from "../../../../../_service/app.service";
import {TokenService} from "../../../../../_service/token.service";
import {BreadcrumbService} from "../../../../../_service/utils/app.breadcrumb.service";
import {ConsultasService} from "../../services/consultas.service";
import {CretencionService} from "../../services/cretencion.service";
import {TokenDto} from "../../../../../_dto/token-dto";
import {severities} from "../../../../../_enums/constDomain";
import {CatalogoImpuestoService} from "../../services/catalogoImpuesto.service";
import {CatalogoImpuestoDto} from "../../model/CatalogoImpuestoDto";
import {DetalleCRetencionDto} from "../../model/DetalleCRetencionDto";
import {CajaService} from "../../services/caja.service";
import {CajaDto} from "../../model/CajaDto";
import {PuntoFacturacionDto} from "../../model/PuntoFacturacionDto";
import {DetalleCretencionService} from "../../services/detalleCretencion.service";
import {PorcentajeRetencion} from "../../model/PorcentajeRetencion";
import {PorcentajeRetencionService} from "../../services/porcentajeRetencion.service";



interface TipoComp {
    id: string;
    nombre: string;
}


@Component({
  selector: 'app-cretencion',
  templateUrl: './cretencion.component.html',
  styleUrls: ['./cretencion.component.scss']
})
export class CretencionComponent implements OnInit {


    @Input() cretencion: ComprobanteRetencionDto;

    cretencionSelect: ComprobanteRetencionDto;
    detalleRetencion: DetalleCRetencionDto;
    listDetalleCRetencion: DetalleCRetencionDto[] = [];
    proceso: string = 'cretencion'
    response: ResponseGenerico
    formCretencion: FormGroup
    formCliente: FormGroup
    listCretencion: ComprobanteRetencionDto[] = [];
    listCliente: ClienteDto[] = [];
    listCatalogoImpuesto: CatalogoImpuestoDto[] = [];
    clienteSelect: ClienteDto;
    visible: boolean = false;
    visibleBusqCl: boolean = false;
    visibleDetalle: boolean = false;
    token: TokenDto;
    loading: boolean = false;
    tipoCliente: number;
    cedulaBusqueda: string;
    nombreBusqueda: string;
    apellidoBusqueda: string;
    nombres: string;
    disableDetalle: boolean = true;
    disableGuardar:boolean= true;
    formDetalle: FormGroup;
    selectedItemCatalogo: CatalogoImpuestoDto | undefined;
    clonedDetalle: { [s: string]: DetalleCRetencionDto } = {};
    valorTotalDetalle: number = 0;
    isLoading: boolean = false;
    @Input() cajaDto:CajaDto;
    fechabusqueda: Date;
    secuencial:string;


    position:string;


    renderImpuestoRenta:boolean = false;

    renderIngCodigoImp:boolean= false;

    listPorcentajeRet: PorcentajeRetencion[]= [];
    selectPorcentajeImp: PorcentajeRetencion;


    listDetCRet: DetalleCRetencionDto[] = [];

    responseDet: ResponseGenerico

    tipoComp: String;

    numCOmp: String;


    listTipoComp: TipoComp [];

    tipoCompSelect: TipoComp;

    nombreCatImpuesto: string;






    constructor(
        public appService: AppService,
        private formBuilder: FormBuilder,
        private tokenService: TokenService,
        private breadcrumbService: BreadcrumbService,
        private consultaService: ConsultasService,
        private cretencionService: CretencionService,
        private catalogoImpestoService: CatalogoImpuestoService,

        private detalleCretencionService: DetalleCretencionService,

        private porcentajeRetencionService: PorcentajeRetencionService,

        private cajaService: CajaService


    ) {
        this, breadcrumbService.setItems([{label: 'Comprobantes de Retencion Servicios'}])
    }

    ngOnInit(): void {

        this.clienteSelect = new ClienteDto();
        this.iniciarFormDetalle();
        this.iniciarForm();
        this.llenarListCretencion();
        this.cargarPorcentajeRet();
        this.position= 'top';



        this.listTipoComp = [
            { id: '1', nombre: 'Factura' },
            { id: '2', nombre: 'Nota de Venta' }

        ];

    }


    iniciarFormCliente() {
        this.formCliente = this.formBuilder.group({
            cedula: new FormControl('',),
            nombre: new FormControl('',),
            direccion: new FormControl('',),
            telefono: new FormControl('',),
            correo: new FormControl('',),
        });
    }


    iniciarFormDetalle() {
        this.formDetalle = this.formBuilder.group({

            idDetalleCompRet: new FormControl('',),
            idComprobanteRetencion: new FormControl('',),
            codigoImpuesto: new FormControl('',),
            valorRetencion: new FormControl('',),
            porcentajeRetencion: new FormControl('',),
            valorRetenido: new FormControl('',),
            idCatalogoImp: new FormControl('',),
            nombCatImp: new FormControl('',),

        });


    }


    iniciarForm() {
        this.formCretencion = this.formBuilder.group({

            idComprobanteRetencion: new FormControl('', null),
            fechaComprobanteRet: new FormControl('', Validators.compose([Validators.required])),
            totalRet: new FormControl('',),
            idCliente: new FormControl('', Validators.compose([Validators.required])),
            idEstadoRet: new FormControl('', Validators.compose([Validators.required])),
            idCajaRet: new FormControl('',),
            pathPdfRet: new FormControl('',),
            pathXmlRet: new FormControl('',),
            claveAccesoKey: new FormControl('',),
            numAutorizaRet: new FormControl('',),
            fechaAutorizaRet: new FormControl('',),
            ambienteSriRet: new FormControl('',),
            emisionRet: new FormControl('',),
            estadoSriRet: new FormControl('',),
            xmlRet: new FormControl('',),
            idUsuarioRet: new FormControl('', Validators.compose([Validators.required])),
            fechaComprobanteRetString: new FormControl('', Validators.compose([Validators.required])),
        });


        this.token = JSON.parse(this.tokenService.getResponseAuth());
        this.f.idUsuarioRet.setValue(this.token.id)
        this.f.fechaComprobanteRetString.setValue(new Date())

    }

    get f() {
        return this.formCretencion.controls;

    }

    get g() {
        return this.formDetalle.controls;
    }


    setSeleccionado(obj) {
        this.cretencion = obj;
        this.formCretencion = this.formBuilder.group(this.cretencion);
        this.visible = true;
    }


    async llenarListCretencion() {
        this.loading = true;
        await this.cretencionService.getAll().subscribe({
                next: data => {
                    this.listCretencion = data.listado
                    this.loading = false;

                },
                complete: () => {
                    this.appService.msgInfoDetail(severities.INFO, 'INFO', 'Datos Cargados exitosamente')
                    this.loading = false;
                },
                error: error => {
                    this.appService.msgInfoDetail(severities.ERROR, 'ERROR', error.error)
                    this.loading = false;
                }
            }
        );


    }





    async cargarPorcentajeRet(){

        await this.porcentajeRetencionService.getAll().subscribe({
            next: data => {
                this.listPorcentajeRet = data.listado

            },
            complete: () => {
                this.appService.msgInfoDetail(severities.INFO, 'INFO', 'Datos Cargados exitosamente')
            },
            error: error => {
                this.appService.msgInfoDetail(severities.ERROR, 'ERROR', error.error)

            }


        }
        );

    }


    async llenarListCliente() {


        if (this.nombreBusqueda == null && this.apellidoBusqueda == null && this.cedulaBusqueda == null) {
            this.appService.msgInfoDetail(severities.ERROR, 'ERROR', 'Por favor ingrese un parametro de busqueda');
        } else {

            this.isLoading = true;

            this.nombres = this.nombreBusqueda == null ? (this.apellidoBusqueda == null ? '0' : this.apellidoBusqueda.toUpperCase()) : this.nombreBusqueda.toUpperCase();

            await this.consultaService.getByIdParametro(this.cedulaBusqueda == null ? '0' : this.cedulaBusqueda, this.nombres, this.tipoCliente).subscribe({
                    next: data => {
                        this.listCliente = data.listado
                        this.loading = false;


                    },
                    complete: () => {
                        this.appService.msgInfoDetail(severities.INFO, 'INFO', 'Datos Cargados exitosamente')
                        this.loading = false;
                        this.isLoading = false;


                    },
                    error: error => {
                        this.appService.msgInfoDetail(severities.ERROR, 'ERROR', error.error)
                        this.loading = false;
                    }
                }
            );
        }
    }


    async llenarcatalogoImp() {

        await this.catalogoImpestoService.getAll().subscribe({
                next: data => {
                    this.listCatalogoImpuesto = data.listado
                    this.loading = false;

                },
                complete: () => {
                    this.appService.msgInfoDetail(severities.INFO, 'INFO', 'Datos Cargados exitosamente')
                    this.loading = false;


                },
                error: error => {
                    this.appService.msgInfoDetail(severities.ERROR, 'ERROR', error.error)
                    this.loading = false;
                }
            }
        );
    }


    setearForm() {
        this.formCretencion.reset();
        this.iniciarForm();
    }

    cancelar() {
        this.setearForm();
        this.appService.msgInfoDetail('info', '', 'Acción Cancelada')
        this.visible = false;
    }


    registrarNuevo() {
        this.cretencion = new ComprobanteRetencionDto();
        this.iniciarForm();
        this.visible = true;
        this.visibleDetalle = false;
        this.clienteSelect = new ClienteDto();
        this.tipoCliente = 0;
        this.listCliente = [];
        this.disableDetalle = true;
        this.listDetalleCRetencion = [];
        this.disableGuardar= true;
        this.valorTotalDetalle=0;
        this.tipoComp= '';
        this.numCOmp= '';
    }


    busquedaCliente() {

        if (this.tipoCliente == 0) {
            this.visibleBusqCl = false;


            this.appService.msgInfoDetail(severities.ERROR, 'ERROR', 'Por favor seleccione el tipo de cliente a buscar');
        } else {
            this.visibleBusqCl = true;
        }
        this.cedulaBusqueda = null;
        this.nombreBusqueda = null;
        this.apellidoBusqueda = null;
    }


    ingresoDetalle() {
        this.visibleDetalle = true;
        this.iniciarFormDetalle();
        this.renderIngCodigoImp= false;
        this.renderImpuestoRenta= false;
    }

    cargarCliente(clienteSelectDto: ClienteDto) {
        this.clienteSelect = clienteSelectDto;
        this.visibleBusqCl = false;
        this.disableDetalle = false;
        this.llenarcatalogoImp();
        this.valorTotalDetalle = 0;
    }


    guardarDetalleCRetencion() {

        if (this.formDetalle.invalid) {
            this.appService.msgInfoDetail('warn', 'Verificación', 'Verificar los Datos a Ingresar')
            return
        } else {

            this.detalleRetencion = this.formDetalle.value;




            this.detalleRetencion.nombCatImp= this.nombreCatImpuesto;




            //this.detalleRetencion.nombCatImp= this.g.nombCatImp.value;

            this.detalleRetencion.valorRetencion = this.g.valorRetencion.value;
            this.detalleRetencion.porcentajeRetencion = this.g.porcentajeRetencion.value;
            this.detalleRetencion.idCatalogoImp = this.selectedItemCatalogo.idCatalogoImpuesto;//this.g.idCatalogoImp.value;
          this.detalleRetencion.nombreSelectImp = this.selectedItemCatalogo.nombreImpuesto;


            if (this.detalleRetencion.porcentajeRetencion != 0 && this.detalleRetencion.valorRetencion != 0) {
                this.detalleRetencion.valorRetenido = (this.detalleRetencion.porcentajeRetencion * this.detalleRetencion.valorRetencion) / 100;

            }else {
                this.detalleRetencion.valorRetenido = 0;
            }

            this.listDetalleCRetencion.push(this.detalleRetencion);
            this.listCatalogoImpuesto = this.listCatalogoImpuesto.filter(catalogo => catalogo != this.selectedItemCatalogo);


            /***sumar los valores del detalle*/

            this.sumaDetalleComRetencion();


            this.visibleDetalle = false;
            this.disableGuardar= false;

        }
    }

    onRowEditInit(detalleCRet: DetalleCRetencionDto) {
        this.clonedDetalle[detalleCRet.idDetalleCompRet as number] = {...detalleCRet};
    }

    onRowEditSave(detalleCRet: DetalleCRetencionDto) {

        if (detalleCRet.porcentajeRetencion != 0 && detalleCRet.valorRetencion != 0) {
            detalleCRet.valorRetenido = (detalleCRet.porcentajeRetencion * detalleCRet.valorRetencion) / 100;
            this.sumaDetalleComRetencion();
            this.appService.msgInfoDetail(severities.INFO, 'INFO', 'Detalle Actualizado exitosamente')
        }
    }

    onRowEditCancel(detalleCRet: DetalleCRetencionDto, index: number) {
        this.listDetalleCRetencion[index] = this.clonedDetalle[detalleCRet.idDetalleCompRet as number];
        delete this.clonedDetalle[detalleCRet.idDetalleCompRet as number];
    }


    sumaDetalleComRetencion() {
        this.valorTotalDetalle = 0;
        for (let dto of this.listDetalleCRetencion) {
            this.valorTotalDetalle = this.valorTotalDetalle + dto.valorRetenido;
        }

    }

    traerDatosCaja(){





    }


  async  almacenarCRetencion(){

        this.tipoComp=  this.tipoCompSelect.nombre;


      if(this.tipoComp==''  || this.tipoComp==null){
          this.appService.msgInfoDetail(severities.ERROR, 'ERROR', 'Por favor ingrese un TIPO DE COMPROBANTE');
          return;
      }


      if(this.numCOmp=='' || this.numCOmp==null){
          this.appService.msgInfoDetail(severities.ERROR, 'ERROR', 'Por favor ingrese el NÚMERO DE COMPROBANTE');
          return;
      }


        if(this.listDetalleCRetencion==null){
            this.appService.msgInfoDetail(severities.ERROR, 'ERROR', 'Por favor ingrese un detalle');
        }else{

            this.token = JSON.parse(this.tokenService.getResponseAuth());

            /**traer datos de caja por idUsuario*/
              this.cajaService.getByIdUser(this.token.id).subscribe({
                    next: data => {
                        this.cajaDto = data.objeto
                    },
                    complete: () => {
                        this.secuencial= this.cajaDto.idPuntoFacturacionDto.secuencialPuntoFact;


                        this.cretencion= this.formCretencion.value;
                        this.cretencion.codigoCRetencion=this.secuencial + '-' +  this.cajaDto.secuencialComprobantesRet.toString().padStart(9, '0');
                        this.cretencion.fechaComprobanteRet= new Date();
                        this.fechabusqueda= this.cretencion.fechaComprobanteRet;
                        this.cretencion.totalRet= Number(this.valorTotalDetalle.toFixed(2));
                        this.cretencion.idEstadoRet= 1;
                        this.cretencion.idCajaRet= this.cajaDto.idCaja;
                        this.cretencion.ncedCliente= this.clienteSelect.cedula;
                        this.cretencion.estadoSriRet= 'AUTORIZADO';
                        this.cretencion.tipoComprobante= this.tipoComp;
                        this.cretencion.numComprobante= this.numCOmp;




                        if(this.tipoCliente==1){
                            this.cretencion.tipoCliente= 'D';
                        }else{
                            this.cretencion.tipoCliente= 'C';
                        }


                        this.cretencion.idUsuarioRet= this.token.id;

                        /**CREACION DEL COMPROBANTE DE RETENCION**/

                        this.cretencionService.saveObject(this.cretencion).subscribe({
                            next: (valor) => {
                                this.response = valor;


                                this.cretencionSelect= this.response.objeto;
                            },
                            complete: () => {



                                /**CREACION DEL DETALLE DEL COMPROBANTE DE RETENCION**/
                                for (let dto of this.listDetalleCRetencion) {
                                    dto.idComprobanteRetencion= this.cretencionSelect.idComprobanteRetencion;
                                    this.detalleCretencionService.saveObject(dto).subscribe({
                                        next: (valor) => {
                                            this.responseDet = valor;

                                            var det: DetalleCRetencionDto;

                                            det= this.responseDet.objeto;


                                            this.listDetCRet.push(this.responseDet.objeto);

                                            if (this.response.codigoRespuestaValue == 200) {
                                                if (!dto.idDetalleCompRet) {

                                                } else {
                                                    this.appService.msgUpdate()
                                                }
                                            }

                                        },
                                        error: error => {

                                            this.appService.msgInfoDetail(severities.ERROR, 'ERROR', error.error)
                                        }
                                    });
                                }


                                /*ACTUALIZAR CAMPO XML COMPROBANTE RETENCION**/


                                alert('valor' + this.cretencionSelect.codigoCRetencion);


                                this.cretencionService.getUpdateXml(this.cretencionSelect).subscribe({
                                    next: dataC => {
                                        this.response = dataC;
                                        if (this.response.codigoRespuestaValue == 200) {

                                        }
                                    },
                                })

                                /*ACTUALIZAR SECUENCIAL**/

                                this.cajaDto.secuencialComprobantesRet= this.cajaDto.secuencialComprobantesRet +1;


                                this.cajaService.saveObject(this.cajaDto).subscribe({
                                    next: val => {
                                        this.response = val;
                                        if (this.response.codigoRespuestaValue == 200) {
                                            this.appService.msgCreate()
                                            this.setearForm();
                                            this.visible = false;
                                            this.llenarListCretencion();
                                           // this.cargarComprobantesAutorizacion()

                                        }
                                    },
                                })

                            },
                            error: error => {
                                this.appService.msgInfoDetail(severities.ERROR, 'ERROR', error.error)
                            }
                        });
                    },
                    error: error => {
                        this.appService.msgInfoDetail(severities.ERROR, 'ERROR', error.error)
                    }
                }
            )
        }
    }






    validarSeleccionTIpo(){

        if(this.selectedItemCatalogo.nombreImpuesto == 'I.V.A.'){
            this.renderIngCodigoImp= false;
            this.renderImpuestoRenta= false;

        }else{
            this.renderIngCodigoImp= true;
            this.renderImpuestoRenta= true;
        }
    }



    cargarValorIvaImpRenta(){

        this.g.codigoImpuesto.setValue(this.selectPorcentajeImp.codigoAnexo);
        this.g.porcentajeRetencion.setValue(this.selectPorcentajeImp.porcentajeVigente);
        //this.g.nombCatImp.setValue(this.selectPorcentajeImp.detallePorcentaje);
        this.nombreCatImpuesto=this.selectPorcentajeImp.detallePorcentaje;
    }




    cargarComprobantesAutorizacion(){

        setTimeout(function (){this.llenarListCretencion()} , 60);
    }
}



